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

brms后验样本毛虫图:如何在stat_slab中按后验均值排序单被试估计值

解决brms后验样本单被试估计值排序生成毛虫图的问题

我来帮你搞定这个排序问题,核心原因是你处理后验样本展开后的数据时,没正确按被试分组计算后验均值来作为排序依据。

问题分析

用spread_draws()之后,数据会展开成每行对应一个后验样本的格式——每个被试会对应成百上千行数据。这时候直接用sort(subject_estimate)或者分组内用sort(mean(subject_estimate))都会出问题:

  • reorder(subject, sort(subject_estimate))无效:sort(subject_estimate)是对所有样本的估计值排序,不是按被试分组的均值排序,reorder无法识别每个被试对应的排序依据。
  • sort(mean(subject_estimate))报错:在每个被试的分组内,mean(subject_estimate)返回单一数值,sort后还是单一数值,但当前分组内的subject有N行(对应N个后验样本),长度不匹配,所以触发错误。

解决方案

我们需要先按被试分组计算后验估计值的均值,再用这个均值来对被试排序。这里有两种简洁的实现方式:

方式1:先预计算排序顺序,再应用到绘图数据

# 第一步:计算每个被试的后验均值,提取排序后的被试顺序
subject_order <- m %>% 
  spread_draws(b_treatment, r_subject[subject,]) %>% 
  mutate(subject_estimate = b_treatment + r_subject) %>% 
  group_by(subject) %>% 
  summarize(mean_est = mean(subject_estimate)) %>% 
  arrange(mean_est) %>% 
  pull(subject)

# 第二步:用预定义的顺序转换subject为因子,再绘图
m %>% 
  spread_draws(b_treatment, r_subject[subject,]) %>% 
  mutate(subject_estimate = b_treatment + r_subject) %>% 
  mutate(subject = factor(subject, levels = subject_order)) %>% 
  ggplot(aes(y = subject, x = subject_estimate)) + 
  stat_slab()

方式2:在同一个管道内完成分组计算与排序

m %>% 
  spread_draws(b_treatment, r_subject[subject,]) %>% 
  mutate(subject_estimate = b_treatment + r_subject) %>% 
  # 按被试分组,计算每个被试的后验均值
  group_by(subject) %>% 
  mutate(mean_est = mean(subject_estimate)) %>% 
  ungroup() %>% 
  # 用后验均值对被试进行排序
  mutate(subject = reorder(subject, mean_est)) %>% 
  ggplot(aes(y = subject, x = subject_estimate)) + 
  stat_slab()

原理说明

两种方式的核心都是先为每个被试计算后验估计值的均值(这是每个被试的代表性估计值),再用这个均值作为排序依据:

  • 方式1提前提取排序后的被试列表,通过factor(levels = ...)强制指定因子顺序。
  • 方式2利用reorder()函数,它会自动将每个被试对应的mean_est(分组内所有行的mean_est都是同一个值)作为排序权重,完成被试的排序。

这样就能得到按单被试后验均值排序的毛虫图了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:37:30