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

R 使用Lappy拟合多个模型--如何在lm对象中保持模型公式的自包含性,r,regression,lapply,R,Regression,Lapply,以下代码使用for loop或lappy将4个不同的模型公式拟合到mtcars数据集中。在这两种情况下,存储在结果中的公式被称为公式[[1]],公式[[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

以下代码使用for loop或lappy将4个不同的模型公式拟合到
mtcars
数据集中。在这两种情况下,存储在结果中的公式被称为
公式[[1]]
公式[[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)
公式这应该行得通

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
的调用中,然后计算表达式。

为什么不:

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)您也可以尝试以下方法

library(purrr)
library(tibble)
models <- map(formulas, lm, data = mtcars)
models
库(purrr)
图书馆(tibble)

模型很好。我想
substitute
也可以,但这似乎更合适(没有双关语)。正如您的示例所示,存储在lm对象中的调用不是完全可读的(即
mpg~disp
),但只有
frm
。如果我想稍后从lm对象提取调用,而不存在
公式
列表,这会带来困难。我认为最好让lm对象自包含。
library(purrr)
library(tibble)
models <- map(formulas, lm, data = mtcars)
models