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
相关产品推荐
相关产品推荐

