2016-03-31 10 views
0

Es scheint, dass Aufruf lm() von innerhalb einer Funktion oder über lapply verschraubt die $call mit einem Fit verbunden. Minimales funktionierendes Beispiel:Wie verwende ich lm() aus einer Funktion heraus?

> library(MASS) 
> dat <- data.frame(x = 1:100, y=1:100) 
> dat <- within(dat, z <- x + log(y) + rnorm(100)) 
> fits <- lapply(list(z ~ x + y, z ~ x + log(y)), lm, dat) 
> stepAIC(fits[[1]])    # <-- error when I try to use the fit in other functions 
Error in eval(expr, envir, enclos) : could not find function "FUN" 

> fits[[1]]$call 
FUN(formula = X[[i]], data = ..1) # Aha -- this must be why -- $call is screwed up 

Wie kann ich dieses Problem lösen und den obigen Fehler verhindern?

+0

@coffeinjunky Nein, die Dinge einfach nur für dieses Spielzeug Beispiel gehalten werden – mchen

+0

Hier ist eine ähnliche Frage, für Referenz http://Stackoverflow.com/q/7666807/210673 – Aaron

Antwort

6

Manchmal ist es besser, eine anonyme Funktion lapply zu liefern:

fits <- lapply(list(z ~ x + y, z ~ x + log(y)), 
        function(f) lm(f, data = dat)) 
stepAIC(fits[[1]]) 
#works 

Beachten Sie, dass diese (in der Regel meine bevorzugte Art und Weise deutlich zu machen Scoping) funktioniert nicht, weil DF nicht durch stepAIC gefunden wird:

fits <- lapply(list(z ~ x + y, z ~ x + log(y)), 
        function(f, DF) lm(f, data = DF), DF = dat) 

Beachten Sie, dass die schrittweise Regression is a bad method anyway.

2

Eine alternative Yould sein, die stepAIC innerhalb lapply direkt anwenden:

AICs <- lapply(list(z ~ x + y, z ~ x + log(y)), 
       function(x) stepAIC(lm(x,dat))) 

Dies gibt Ihnen eine Liste der Ausgabe von stepAIC für alle Modelle.

2

Versuchen Sie, dies als Funktion in der Lapply zu verwenden. Dies erzeugt gut aussehende Formeln in fits die tatsächliche Formel und stepAIC Werke zeigt:

fun <- function(fo) do.call("lm", list(fo, quote(dat))) 
fits <- lapply(list(z ~ x + y, z ~ x + log(y)), fun) 

geben:

> fits[[1]] 

Call: 
lm(formula = z ~ x + y, data = dat) 

Coefficients: 
(Intercept)   x   y 
     2.154  1.031   NA 


> stepAIC(fits[[1]]) 
Start: AIC=-3.34 
z ~ x + y 


Step: AIC=-3.34 
z ~ x 

     Df Sum of Sq RSS AIC 
<none>     93 -3.34 
- x  1  88600 88693 680.78 

Call: 
lm(formula = z ~ x, data = dat) 

Coefficients: 
(Intercept)   x 
     2.154  1.031