2009-08-19 3 views
10

Le formule sono una funzione molto utile delle funzioni statistiche e grafiche di R. Come tutti, sono un utente di queste funzioni. Tuttavia, non ho mai scritto una funzione che accetta un oggetto formula come argomento. Mi chiedevo se qualcuno potesse aiutarmi, sia collegando un'introduzione leggibile a questo lato della programmazione R, sia dando un esempio autonomo.Formule in funzioni definite dall'utente in R

risposta

6

È possibile utilizzare model.matrix() e model.frame() per valutare la formula:

lm1 <- lm(log(Volume) ~ log(Girth) + log(Height), data=trees) 
print(lm1) 

form <- log(Volume) ~ log(Girth) + log(Height) 

# use model.matrix 
mm <- model.matrix(form, trees) 
lm2 <- lm.fit(as.matrix(mm), log(trees[,"Volume"])) 
print(coefficients(lm2)) 

# use model.frame, need to add intercept by hand 
mf <- model.frame(form, trees) 
lm3 <- lm.fit(as.matrix(data.frame("Intercept"=1, mf[,-1])), mf[,1]) 
print(coefficients(lm3)) 

che produce

Call: lm(formula = log(Volume) ~ log(Girth) + log(Height), data = trees) 

Coefficients: (Intercept) log(Girth) log(Height) 
     -6.63   1.98   1.12 

(Intercept) log(Girth) log(Height) 
    -6.632  1.983  1.117 
Intercept log.Girth. log.Height. 
    -6.632  1.983  1.117 
+1

Grazie, molto interessante. Capisco anche perché glmnet oi suoi pacchetti potrebbero non offrire questa funzionalità: utilizza una matrice sparsa nel pacchetto Matrix, che non può essere trattato con model.matrix(). – gappy