如何使用dplyr 1.0.0对多列分别运行glm模型并获得规整输出
实现方案
你需要的功能可以结合dplyr 1.0+的语法、tidyr长表转换、嵌套分组和broom的结果提取实现,完整可运行代码如下:
首先加载所需依赖包:
library(dplyr) library(tidyr) library(purrr) library(broom)
提取各模型系数结果(对应broom::tidy输出)
df %>% # 仅选择out开头的因变量列转换为长表,灵活匹配目标列 pivot_longer(cols = starts_with("out"), names_to = "outcome", values_to = "y") %>% # 按不同结局变量分组 group_by(outcome) %>% # 分组嵌套生成各结局对应的独立数据集 nest() %>% # 每组分别拟合glm模型,再提取结构化结果 mutate( model = map(data, ~glm(y ~ pred, family = binomial, data = .x)), coeff_res = map(model, tidy) ) %>% # 展开结果得到规整数据框 unnest(coeff_res) %>% # 可选:移除不需要的嵌套数据、模型列 select(-data, -model)
输出结果每一行对应单个结局模型的单个参数估计结果,包含变量名、系数、标准误、p值等结构化字段。
提取各模型整体拟合指标(对应broom::glance输出)
如果需要模型的AIC、零偏差、残差偏差等整体拟合指标,只需将上述代码中的tidy替换为glance即可:
df %>% pivot_longer(cols = starts_with("out"), names_to = "outcome", values_to = "y") %>% group_by(outcome) %>% nest() %>% mutate( model = map(data, ~glm(y ~ pred, family = binomial, data = .x)), fit_res = map(model, glance) ) %>% unnest(fit_res) %>% select(-data, -model)
该方案完全适配dplyr 1.0.0及以上版本的语法规范,支持通过starts_with、ends_with、contains等dplyr选择器灵活筛选需要拟合的因变量列,输出结果为标准数据框,比纯map返回的列表更便于后续批量处理。
内容的提问来源于stack exchange,提问作者llewmills
相关产品推荐
相关产品推荐

