使用lapply拟合多个模型--如何在lm对象中保持模型公式自包含

5
以下代码使用for循环或lapply将4个不同的模型公式拟合到mtcars数据集中。在两种情况下,结果中存储的公式被称为formulas [[1]],formulas [[2]]等,而不是人类可读的公式。
formulas <- list(
  mpg ~ disp,
  mpg ~ I(1 / disp),
  mpg ~ disp + wt,
  mpg ~ I(1 / disp) + wt
)
res <- vector("list", length=length(formulas))
for (i in seq_along(formulas)) {
  res[[i]] <- lm(formulas[[i]], data=mtcars)
}
res
lapply(formulas, lm, data=mtcars)

有没有办法使完整的、可读的公式显示在结果中?
3个回答

7

这应该可以工作

lapply(formulas, function(x, data) eval(bquote(lm(.(x),data))), data=mtcars)

并且它返回

[[1]]

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

Coefficients:
(Intercept)         disp  
   29.59985     -0.04122  


[[2]]

Call:
lm(formula = mpg ~ I(1/disp), data = data)

Coefficients:
(Intercept)    I(1/disp)  
      10.75      1557.67  

....etc

我们使用bquote将公式插入到对lm的调用中,然后评估表达式。

1
不错。我曾经想过使用“substitute”,但这似乎更合适(没有双关语)。 - Rich Scriven

2
为什么不直接这样做呢:
lapply( formulas, function(frm) lm( frm, data=mtcars))
#------------------
[[1]]

Call:
lm(formula = frm, data = mtcars)

Coefficients:
(Intercept)         disp  
   29.59985     -0.04122  

[[2]]

Call:
lm(formula = frm, data = mtcars)

Coefficients:
(Intercept)    I(1/disp)  
      10.75      1557.67  
snpped....

如果您希望结果的名称具有公式的“字符化”版本,只需这样做:
 names(res) <- as.character(formulas)
 res[1]
#-----
$`mpg ~ disp`

Call:
lm(formula = frm, data = mtcars)

Coefficients:
(Intercept)         disp  
   29.59985     -0.04122 

正如您的示例所示,存储在lm对象中的调用并非完全可读(即mpg ~ disp),而只是frm。如果我想在没有formulas列表的情况下从lm对象中提取调用,则会带来困难。我认为最好让lm对象自包含。 - Heisenberg

0

你也可以尝试类似的东西

library(purrr)
library(tibble)
models <- map(formulas, lm, data = mtcars)
models

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接