如何在R中用lme4绘制多水平模型中连续变量的交互效应图
绘制多水平二分类模型中连续变量的交互效应图
针对你用lme4::glmer拟合的二分类多水平模型,想要展示educ.c和acc.c的交互效应,这里有两种实用且易实现的方案,都是R生态中常用的方法:
首先先修正你的模型代码——在glmer中不需要用final$var的形式引用变量,直接写变量名即可(因为已经指定了data = final),这样后续处理会更顺畅:
library(lme4) # 修正后的模型代码 model <- glmer(trust ~ educ.c + age.c + gender + C14_RESPONDENT_OCCUPATION_SCALE + tot_country.c + int_use.c + educ.c*acc.c + (educ.c | Country), data = final, family = binomial, weights = W85_WEIGHT_EU27_+_TR_+_HR_+_NO_+_CH_+_IS, nAGQ=0, control = glmerControl(optimizer = "optimx", calc.derivs = FALSE, optCtrl = list(method = "nlminb", starttests = FALSE, kkt = FALSE)))
方法一:用interactions包快速绘制(最简便)
interactions包专门为交互效应可视化设计,支持混合效应模型,一行代码就能生成直观的概率尺度交互图:
library(interactions) # 绘制交互效应图,type="prob"指定展示概率(因变量是二分,这个尺度最易解释) interact_plot(model, x = educ.c, # x轴变量:educ.c moderator = acc.c, # 调节变量:acc.c type = "prob", # 输出概率尺度(替代logit尺度) interval = TRUE, # 显示95%置信区间 x.label = "Centered Education (educ.c)", y.label = "Probability of Trust", legend.main = "Centered Acc (acc.c)")
这个函数会自动处理其他协变量的典型值(连续变量取均值,分类变量取参考水平/众数),并且尊重你模型中的权重设置。
方法二:用emmeans+ggplot2定制化绘制(更灵活)
如果需要更精细的自定义(比如调整颜色、线条样式,或者选择特定的调节变量取值),可以用emmeans计算边际效应,再用ggplot2画图:
步骤1:准备预测用的变量取值
我们可以选择acc.c的几个关键水平(比如均值±1标准差,或者分位数),再生成educ.c的连续序列:
library(emmeans) library(ggplot2) # 选择acc.c的3个典型水平:10分位、中位数、90分位(也可以用mean±sd) acc_vals <- with(final, quantile(acc.c, c(0.1, 0.5, 0.9), na.rm = TRUE)) # 生成educ.c的连续序列(覆盖数据中的全范围) educ_seq <- seq(min(final$educ.c, na.rm = TRUE), max(final$educ.c, na.rm = TRUE), length.out = 100)
步骤2:计算边际效应(概率尺度)
用emmeans计算控制其他协变量后的预测概率,这里我们忽略随机效应(展示群体平均水平的效应),如果需要展示每个国家的效应,可以去掉re.form = ~0:
# 计算边际效应,转换为概率尺度 emm <- emmeans(model, ~ educ.c * acc.c, at = list(educ.c = educ_seq, acc.c = acc_vals), re.form = ~0, # 忽略随机效应,得到群体水平的平均效应 type = "response") # 转换为概率(而非logit尺度) # 转换为数据框方便ggplot使用 emm_df <- as.data.frame(emm)
步骤3:用ggplot2绘图
ggplot(emm_df, aes(x = educ.c, y = prob, color = factor(acc.c))) + geom_line(linewidth = 1) + # 绘制交互线条 geom_ribbon(aes(ymin = lower.CL, ymax = upper.CL, fill = factor(acc.c)), alpha = 0.2, color = NA) + # 绘制置信区间 labs(x = "Centered Education (educ.c)", y = "Probability of Trust", color = "Centered Acc (acc.c)", fill = "Centered Acc (acc.c)") + theme_minimal()
关键注意事项
- 协变量取值:两种方法都会默认将其他协变量设置为典型值(连续变量取均值,分类变量取参考水平),如果需要自定义,可以在
interact_plot的covariate.values参数,或者emmeans的at参数中指定。 - 随机效应处理:如果你想展示每个国家的交互效应,可以在
emmeans中去掉re.form = ~0,但这样图会包含所有国家的线条,可能过于拥挤,建议只在需要展示组间差异时使用。 - 尺度选择:如果需要展示logit尺度的交互(而非概率),只需将
type = "prob"改为type = "link"即可,但概率尺度对非统计背景的读者更友好。
内容的提问来源于stack exchange,提问作者Luca Carbone
相关产品推荐
相关产品推荐

