如何高效便捷使用purrr包的map函数获取回归系数?
使用purrr高效批量拟合线性回归并提取系数
错误原因
你尝试合并两步的代码写法有误:map的第二个参数是要对列表中每个元素执行的函数,你传入的第二个公式~ coef(summary(.x))会被当成lm函数的额外参数,而非对lm结果的后续处理,因此最终返回的还是线性模型对象,不是系数摘要。
正确的合并写法
只需将拟合模型和提取系数的逻辑整合到同一个匿名函数中,即可用一次map完成操作:
library(purrr) library(dplyr) # 你的数据集列表(可优化,见下文) Databases <- list(iris_1, iris_2, iris_3) # 一步完成模型拟合与系数提取 Coeff <- map(Databases, ~ { # 先拟合模型 model <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = .x) # 提取系数的摘要结果 coef(summary(model)) }) # 查看第一个数据集的系数 Coeff[[1]]
也可以用管道进一步简化写法:
Coeff <- map(Databases, ~ .x %>% lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = .) %>% coef(summary))
更高效的完整流程
你手动拆分数据集的步骤可以用split或group_split简化,无需手动创建iris_1/iris_2/iris_3:
# 方式1:用split按Species拆分 Databases <- split(iris, iris$Species) # 方式2:用dplyr的group_split拆分(返回的列表元素带分组名) Databases <- iris %>% group_split(Species, .keep = FALSE) # 批量处理 Coeff <- map(Databases, ~ lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = .x) %>% coef(summary))
整理为整洁数据框
如果需要将结果整理成结构化的数据框,方便后续分析,可以用imap_dfr(带元素名称的map,同时传递列表元素和名称):
library(tidyr) tidy_results <- split(iris, iris$Species) %>% imap_dfr(function(data, species) { lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = data) %>% coef(summary) %>% as.data.frame() %>% rownames_to_column("term") %>% mutate(Species = species) }) # 查看结果 head(tidy_results)
内容的提问来源于stack exchange,提问作者Adriana Castillo Castillo
相关产品推荐
相关产品推荐

