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

基于mids对象的lme混合效应模型生成交互图遇错求解

问题描述

我通过mice包生成的mids对象(多重插补数据集)运行了包含三向连续变量交互项的线性混合效应模型,尝试用interactions::interact_plot绘制交互图时持续报错,推测是模型基于mids对象而非普通数据框导致的。

相关代码

# 基于多重插补数据拟合模型
MIDmod1 <- with(data = df.mids, exp = lmer(GC ~ Age + Sex + Edu + Stress*Time*HLI + (1|ID)))
summary(pool(MIDmod1))

# 尝试绘制三向交互图
interact_plot(
  model=MIDmod1, 
  pred = Time,
  modx=Stress,
  mod2=HLI,
  data = df.mids,
  interval=TRUE,
  y.label='Global cognition composite score',
  modx.labels=c('Low Baseline Stress (-1SD)','Moderate Baseline Stress (Mean)', 'High Baseline Stress (+1SD)'),
  mod2.labels=c('Low HLI (-1SD)', 'Moderate HLI (Mean)', 'High HLI (+1SD)'),
  legend.main='') + ylim(-2,2)

报错信息

  • 传入data参数时:
Error in rep(1, times = nrow(data)) : invalid 'times' argument
  • 不传入data参数时:
Error in formula.default(object, env = baseenv()) : invalid formula

注:当模型基于普通数据框时,可正常生成目标交互图。

解决方案

interactions::interact_plot不支持直接处理mice包中with()返回的mira类模型对象,以下两种方法可解决该问题:

方法1:用单个插补数据集快速绘图

从mids对象中提取某一个插补完成的数据集,重新拟合模型后再调用interact_plot。这种方法适合快速验证交互趋势,若要整合多重插补结果,需手动合并不同插补数据集的绘图:

# 提取第一个插补后的数据集
df_imputed <- complete(df.mids, 1)

# 用单个插补数据集重新拟合模型
mod_single <- lmer(GC ~ Age + Sex + Edu + Stress*Time*HLI + (1|ID), data = df_imputed)

# 绘制交互图
interact_plot(
  model=mod_single, 
  pred = Time,
  modx=Stress,
  mod2=HLI,
  interval=TRUE,
  y.label='Global cognition composite score',
  modx.labels=c('Low Baseline Stress (-1SD)','Moderate Baseline Stress (Mean)', 'High Baseline Stress (+1SD)'),
  mod2.labels=c('Low HLI (-1SD)', 'Moderate HLI (Mean)', 'High HLI (+1SD)'),
  legend.main='') + ylim(-2,2)

方法2:基于多重插补合并结果生成严谨的边际效应图

这种方法先对每个插补模型的预测结果进行合并,再用ggplot2绘图,能整合多重插补的统计结果:

library(dplyr)
library(ggplot2)

# 定义变量的均值和标准差,用于分组
stress_mean <- mean(complete(df.mids, 1)$Stress, na.rm = TRUE)
stress_sd <- sd(complete(df.mids, 1)$Stress, na.rm = TRUE)
hli_mean <- mean(complete(df.mids, 1)$HLI, na.rm = TRUE)
hli_sd <- sd(complete(df.mids, 1)$HLI, na.rm = TRUE)

# 创建预测网格:覆盖Time的全范围,Stress和HLI取均值±1SD,控制协变量为均值/基准水平
pred_grid <- expand.grid(
  Time = seq(min(complete(df.mids,1)$Time), max(complete(df.mids,1)$Time), length.out = 100),
  Stress = c(stress_mean - stress_sd, stress_mean, stress_mean + stress_sd),
  HLI = c(hli_mean - hli_sd, hli_mean, hli_mean + hli_sd),
  Age = mean(complete(df.mids,1)$Age, na.rm = TRUE),
  Sex = levels(complete(df.mids,1)$Sex)[1],
  Edu = mean(complete(df.mids,1)$Edu, na.rm = TRUE),
  ID = complete(df.mids,1)$ID[1] # 固定随机效应,只预测固定效应部分
)

# 对每个插补数据集进行预测
pred_list <- lapply(1:df.mids$m, function(i) {
  mod_i <- lmer(GC ~ Age + Sex + Edu + Stress*Time*HLI + (1|ID), data = complete(df.mids, i))
  predict(mod_i, newdata = pred_grid, re.form = NA)
})

# 合并预测结果,计算均值和95%置信区间
pred_grid <- pred_grid %>%
  mutate(
    GC_mean = rowMeans(do.call(cbind, pred_list)),
    GC_lower = apply(do.call(cbind, pred_list), 1, quantile, 0.025),
    GC_upper = apply(do.call(cbind, pred_list), 1, quantile, 0.975),
    # 添加分组标签
    Stress_group = case_when(
      Stress == stress_mean - stress_sd ~ 'Low Baseline Stress (-1SD)',
      Stress == stress_mean ~ 'Moderate Baseline Stress (Mean)',
      Stress == stress_mean + stress_sd ~ 'High Baseline Stress (+1SD)'
    ),
    HLI_group = case_when(
      HLI == hli_mean - hli_sd ~ 'Low HLI (-1SD)',
      HLI == hli_mean ~ 'Moderate HLI (Mean)',
      HLI == hli_mean + hli_sd ~ 'High HLI (+1SD)'
    )
  )

# 绘制交互图
ggplot(pred_grid, aes(x = Time, y = GC_mean, color = Stress_group)) +
  geom_line(linewidth = 1) +
  geom_ribbon(aes(ymin = GC_lower, ymax = GC_upper, fill = Stress_group), alpha = 0.2, color = NA) +
  facet_wrap(~HLI_group) +
  labs(x = 'Time', y = 'Global cognition composite score', color = '', fill = '') +
  ylim(-2, 2) +
  theme_minimal()

内容的提问来源于stack exchange,提问作者danielledamico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:10:43