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

如何绘制因分类变量的边际效应差异?——基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:07:46