如何用purrr::map结合sjPlot::plot_model批量生成多结局交互图?
多结局模型批量绘制交互图解决方案
问题描述
使用nlme包的MathAchieve数据集,加载nlme、lme4、sjPlot、broom.mixed包后,需要实现:
- 针对
MathAch和SES两个结局,分别拟合包含Minority*Sex交互项的混合效应模型 - 遵循DRY原则,用
purrr::map批量生成交互图,避免手动逐个建模绘图
已成功通过map生成模型的tidy结果,但批量调用plot_model时出现错误,尝试的两种写法均未成功。
问题根源
之前的写法直接对选中的列(向量)进行map循环,lmer接收的.x是变量的具体值而非变量名,导致模型公式无法正确解析数据集中的变量,进而绘图失败。
解决方案
通过变量名字符串动态构建模型公式的方式,让lmer能正确识别数据集中的变量,再批量建模并绘图:
完整代码示例
library(nlme) library(lme4) library(sjPlot) library(broom.mixed) library(purrr) library(ggplot2) # 定义需要分析的结局变量名向量 outcome_vars <- c("MathAch", "SES") # 批量建模并生成交互图 interaction_plots <- outcome_vars |> map(function(var) { # 动态构建模型公式 model_formula <- as.formula(paste(var, "~ Minority*Sex + (1|School)")) # 拟合混合效应模型 model <- lmer(model_formula, data = MathAchieve) # 绘制交互图,添加标题区分不同结局 plot_model(model, type = "int") + ggtitle(paste("交互效应:", var)) + theme(plot.title = element_text(hjust = 0.5)) }) # 查看所有生成的图 interaction_plots
扩展:批量保存图片
如果需要将生成的图批量保存到文件,可以用map2配合文件名列表实现:
# 定义保存的文件名 plot_filenames <- paste0(outcome_vars, "_interaction_plot.png") # 批量建模、绘图并保存 outcome_vars |> map2(plot_filenames, function(var, filename) { model_formula <- as.formula(paste(var, "~ Minority*Sex + (1|School)")) model <- lmer(model_formula, data = MathAchieve) plot_obj <- plot_model(model, type = "int") + ggtitle(paste("交互效应:", var)) + theme(plot.title = element_text(hjust = 0.5)) # 保存图片 ggsave(filename, plot = plot_obj, width = 8, height = 6, dpi = 300) })
内容的提问来源于stack exchange,提问作者KIM
相关产品推荐
相关产品推荐

