将lm(或其他模型)应用于公式列表时获得正确的调用

时间:2014-01-26 17:52:07

标签: r

我经常想要运行一个模型列表,如下所示:

data(mtcars)
ms <- lapply(list(
      mpg ~ disp
    , mpg ~ hp
    ), lm, data=mtcars

然后我希望能够从这些模型中提取呼叫,如下所示:

lapply(ms, getCall)

但我明白了:

[[1]]
FUN(formula = X[[1L]], data = ..1)
[[2]]
FUN(formula = X[[2L]], data = ..1)                  

我怎样才能得到这个:

[[1]]
lm(formula = mpg ~ disp, data=mtcars)
[[2]]
lm(formula = mpg ~ hp, data=mtcars)

(我想通过制作一个模型列表就可以得到它,就像这样:

ms <- list(
      lm(mpg ~ disp, data=mtcars)
    , lm(mpg ~ hp, data=mtcars)
    )

但我宁愿避免重复。

我觉得这与在合适的环境中评估公式有关,但我不知道如何做。

2 个答案:

答案 0 :(得分:3)

我认为这是lapply的范围规则和lm中的非标准评估的问题。但是,您可以通过创建基本模型并在update调用中使用lapply来绕过它:

tlm <- lm(data=mtcars)
lapply(list(mpg~disp,mpg~hp), update, object=tlm)
[[1]]

Call:
lm(formula = mpg ~ disp, data = mtcars)

Coefficients:
(Intercept)         disp  
   29.59985     -0.04122  


[[2]]

Call:
lm(formula = mpg ~ hp, data = mtcars)

Coefficients:
(Intercept)           hp  
   30.09886     -0.06823  

答案 1 :(得分:1)

我认为lapply正在以不同的名称调用lm,也许可以试试这个:

data(mtcars)
ms <- lapply(list(
      mpg ~ disp
    , mpg ~ hp
    ), function(x) lm(x, data=mtcars) )

编辑:

我们也必须混淆substitute

data(mtcars)
f <- function(x) {z <- x; eval(substitute(lm(z, data=mtcars))) }
ms <- lapply(list(
      mpg ~ disp
    , mpg ~ hp
    ), f)

R>
R>ms
[[1]]

Call:
lm(formula = mpg ~ disp, data = mtcars)

Coefficients:
(Intercept)         disp  
29.59985476  -0.04121512  


[[2]]

Call:
lm(formula = mpg ~ hp, data = mtcars)

Coefficients:
(Intercept)           hp  
30.09886054  -0.06822828