R 如何从函数内部使用lm()?

R 如何从函数内部使用lm()?,r,regression,linear-regression,lm,R,Regression,Linear Regression,Lm,似乎从函数内部或通过lappy调用lm()会使与配合相关的$call出错。最简单的工作示例: > 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(

似乎从函数内部或通过
lappy
调用
lm()
会使与配合相关的
$call
出错。最简单的工作示例:

> 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
>库(MASS)

>dat dat有时最好为lappy提供一个匿名函数:

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

请注意逐步回归。

另一种方法是直接在
lappy
内部应用
stepAIC

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

AICs尝试将其用作lappy中的函数。这将在
fits
中生成美观的公式,显示实际的公式和
stepAIC
的工作原理:

fun <- function(fo) do.call("lm", list(fo, quote(dat)))
fits <- lapply(list(z ~ x + y, z ~ x + log(y)), fun)
fun stepAIC(适合[[1]])
开始:AIC=-3.34
z~x+y
步骤:AIC=-3.34
z~x
Df平方和RSS AIC
93  -3.34
-x 1 88600 88693 680.78
电话:
lm(公式=z~x,数据=dat)
系数:
(截距)x
2.154        1.031  

@coffeinjunky不,只是为了这个玩具的例子,事情保持简单这里有一个类似的问题,供参考
fun <- function(fo) do.call("lm", list(fo, quote(dat)))
fits <- lapply(list(z ~ x + y, z ~ x + log(y)), fun)
> 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