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

时间:2014-08-14 16:15:59

标签: r regression lapply

以下代码使用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 个答案:

答案 0 :(得分:6)

这应该有效

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 :(得分:1)

为什么不呢:

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 

答案 2 :(得分:0)

您还可以尝试类似的操作

FileName