如何用marginaleffects绘制lme4多水平模型所有集群的平均预测图?
多水平模型群体平均预测结果绘图解决方案
问题背景
使用lme4构建多水平模型mod5后,希望展示:当fem_parl_mean_diff变化、其余预测变量取均值时,不同性别群体的satislife预测变化,且呈现所有国家集群的平均结果。但marginaleffects::plot_predictions默认仅输出众数国家集群的图,分面图为单个国家结果,by参数也无法满足需求。
模型代码:
mod5 <- lmer (satislife ~ 1 + gender * (fem_parl_mean + fem_parl_mean_diff + intdate_day + poly(age, degree = 3) + GDP) + (1 + gender | country), data = merged_df)
解决方案
核心是边缘化随机效应,即对所有国家集群的随机效应取平均,得到群体层面的预测结果,而非单个国家的结果。
方法1:用predictions()生成数据后自定义绘图
先生成群体平均的预测数据集,再用ggplot灵活绘图:
library(marginaleffects) library(ggplot2) # 生成预测数据:边缘化随机效应,其余变量取均值 preds <- predictions( mod5, newdata = datagrid( # 按区间生成fem_parl_mean_diff的取值,保证曲线平滑 fem_parl_mean_diff = seq(min(merged_df$fem_parl_mean_diff, na.rm = TRUE), max(merged_df$fem_parl_mean_diff, na.rm = TRUE), length.out = 100), gender = unique(merged_df$gender), grid_type = "balanced", # 其余协变量取均值 fem_parl_mean = mean(merged_df$fem_parl_mean, na.rm = TRUE), intdate_day = mean(merged_df$intdate_day, na.rm = TRUE), age = mean(merged_df$age, na.rm = TRUE), GDP = mean(merged_df$GDP, na.rm = TRUE) ), # 关键参数:边缘化随机效应,得到所有国家的平均结果 re.form = ~0 ) # 绘制带置信区间的折线图 ggplot(preds, aes(x = fem_parl_mean_diff, y = estimate, color = gender)) + geom_line(linewidth = 1) + geom_ribbon(aes(ymin = conf.low, ymax = conf.high, fill = gender), alpha = 0.2, color = NA) + labs( x = "fem_parl_mean_diff", y = "预测生活满意度", color = "性别", fill = "性别", title = "不同性别群体的生活满意度预测(所有国家平均)" ) + theme_minimal()
方法2:直接用plot_predictions()指定边缘化参数
如果想直接用plot_predictions(),只需添加re.form = ~0参数,即可跳过单个国家的随机效应,输出群体平均结果:
plot_predictions( mod5, condition = c("fem_parl_mean_diff", "gender"), newdata = datagrid(grid_type = "balanced"), # 边缘化随机效应,得到群体平均 re.form = ~0 )
原理说明
re.form = ~0参数告诉模型不计算单个国家的随机效应预测值,而是对所有国家的随机效应进行边缘化处理,最终得到的是**群体平均(population-averaged)**的预测结果,完美匹配需求。
内容的提问来源于stack exchange,提问作者Nickii
相关产品推荐
相关产品推荐

