【发布时间】:2017-05-10 19:47:20
【问题描述】:
我有一个使用标准数据集mtcars 通过此代码完成的多重回归列表。
models <- lapply(paste("mpg", names(mtcars)[-1], sep = "~"), formula)
res.models <- lapply(models, FUN = function(x) {summary(lm(formula = x, data = mtcars))})
names(res.models) <- paste("mpg", names(mtcars)[-1], sep = "~")
我现在有一个针对第一列“mpg”的多重回归列表。从这里我试图导出某些汇总统计信息,例如;截距、系数和 r.squared。
我尝试过使用下面包含的循环。
for (i in 1:length(res.models))
{
res <- res.models[[i]]
res_bound <- NULL
intercept <- res$coefficients[1]
coef <- res$coefficients[2]
r <- res$r.squared
res_bound <- cbind(intercept, coef, r)
}
虽然这让我得到了dataframe,但它只包括最后一个回归模型的结果,即 1 行乘 3 列dataframe。此外,我希望在表中包含每个回归的“术语”,以区分我正在查看的模型(例如 mpg 与 cyl 或 mpg 与 hp)。
我只是错过了循环中的一步吗?最终目标是write.csv最终dataframe。
【问题讨论】:
-
我会使用
lapply来做你想要用for做的事情,然后使用do.call(rbind, list)或dplyr::bind_rows(list)将列表元素组合到一个表中。基本上,编写一个适用于一个模型的函数,使用 lapply 对模型进行迭代,然后组合结果。 -
作为一个建议,您是否考虑过使用
broom::tidy将lm输出转换为漂亮的数据帧? -
@coffeinjunky 我用过这个函数是的,但它不输出 r.squared。如果可以包含 r.squared,那肯定会更好用
-
broom::glance会这样做,您可以将其合并回来自broom::tidy的数据框。 -
另外,为了解决您的实际问题,在每次循环迭代中,您只有` res_bound , leaving you with res_bound`最后一次迭代。
标签: r regression lm