如何绘制因分类变量的边际效应差异?——基于ordinal模型与emmeans的技术求助
解决ordinal模型中绘制分类变量边际概率差异的问题
我完全懂你的需求——你想要的是每个rating类别下,不同temp组中contact水平的预测概率差异,而不是emmeans默认输出的潜变量对数尺度差异,这确实是ordinal模型使用时容易碰到的小细节问题!下面给你一步步的解决方案:
1. 先获取概率尺度的边际预测值
emmeans对ordinal的clm模型默认是在潜变量的对数几率尺度上计算结果,所以必须指定type = "response"才能得到我们需要的预测概率。我们可以按rating类别分组,获取每个temp × contact组合的概率:
library(ordinal) library(emmeans) library(ggplot2) # 你的模型 wine.clm <- clm(rating ~ temp * contact, data = wine) # 获取每个(temp, contact)组合在各rating上的预测概率 wine.probs <- emmeans(wine.clm, ~ contact * temp | rating, type = "response")
2. 计算contact水平间的概率差异
接下来用pairs()函数,在每个temp和rating组内,计算contact两个水平的概率差异(比如warm组减cold组,可通过reverse参数调整方向):
# 计算同一temp、同一rating下contact水平的概率差异 prob_diff <- pairs(wine.probs, reverse = TRUE) # reverse = TRUE 表示 warm - cold(可根据你的temp实际水平调整) # 转换为数据框方便绘图 diff_df <- as.data.frame(prob_diff)
3. 绘制概率差异图
现在就可以用ggplot2绘制直观的差异图了,添加置信区间和零参考线,能清晰看到交互效应:
ggplot(diff_df, aes(x = rating, y = estimate, color = temp)) + # 带置信区间的点 geom_pointrange(aes(ymin = lower.CL, ymax = upper.CL), position = position_dodge(width = 0.5), size = 0.8) + # 添加零差异参考线 geom_hline(yintercept = 0, linetype = "dashed", color = "gray50") + # 标题和标签 labs(title = "Probability Difference (warm - cold) by Rating & Temperature", y = "Predicted Probability Difference", x = "Rating Category") + theme_minimal()
关键说明
- 为什么之前的代码得到对数几率?因为
clm模型的潜变量是对数尺度,emmeans默认在这个尺度计算,必须用type = "response"或者regrid()函数转换到概率尺度。 - 如果需要更灵活的差异计算,也可以先提取概率预测值,手动计算差异再绘图,结果是一致的。
内容的提问来源于stack exchange,提问作者menomale
相关产品推荐
相关产品推荐

