You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:07:17