2016-03-31 8 views
0

機能内またはlapplyからlm()を呼び出すと、フィットに関連付けられた$callがねじ込まれているようです。最小の作業例:関数内からlm()を使用するにはどうすればよいですか?

> 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 

この問題を解決し、上記のエラーを防ぐにはどうすればよいですか?

+0

、物事はちょうどこのおもちゃの例 – mchen

+0

のための単純な保持されている。ここでは、同様の質問です:

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

寄付を:これは、実際の式とstepAIC作品を示すfitsでの素敵な探して数式を作成しますreference http://stackoverflow.com/q/7666807/210673 – Aaron

答えて

6

時にはそれがlapplyに無名関数を供給すると良いでしょう:

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

DFstepAICによって発見されていないため、この動作しません(通常は私の好ましい方法は、明示的なスコープ作る)こと:

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

ステップワイズ回帰is a bad method anywayに注意してください。

2

代替youldは直接lapplystepAICを適用すること:

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

これはあなたのすべてのモデルのstepAICの出力のリストを与えます。

2

lapplyの関数としてこれを使用してみてください。ノー@coffeinjunky

> 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 
関連する問題