R 使用Lappy拟合多个模型--如何在lm对象中保持模型公式的自包含性
以下代码使用for loop或lappy将4个不同的模型公式拟合到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
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