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

时间:2016-03-31 13:12:21

标签: r regression linear-regression lm

似乎从函数中调用lm()或通过lapply调整与契约相关联的$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

如何解决此问题并防止出现上述错误?

3 个答案:

答案 0 :(得分:6)

有时最好为lapply提供匿名功能:

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

请注意,这(通常是我首选显式确定范围的方法)不起作用,因为DF找不到stepAIC

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

请注意逐步回归is a bad method anyway

答案 1 :(得分:2)

另一种方法是直接在stepAIClapply申请:

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

这为您提供了所有模型的stepAIC输出列表。

答案 2 :(得分:2)

尝试将此作为lapply中的函数。这会在fits中生成外观漂亮的公式,显示实际公式和stepAIC的工作原理:

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