我经常想要运行一个模型列表,如下所示:
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)
)
但我宁愿避免重复。
我觉得这与在合适的环境中评估公式有关,但我不知道如何做。
答案 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