ggdist::stat_halfeye()如何缩放后验预测密度?
stat_halfeye的密度缩放逻辑与零膨胀数据的适配问题
为什么stat_halfeye的图会异常平坦?
stat_halfeye底层依赖stat_slabinterval,它默认的缩放逻辑是按概率质量占比来归一化:把整个分布的总概率质量设为1,y轴的数值代表对应位置的概率占总样本的比例,而非传统意义上积分等于1的概率密度。
在你的零膨胀数据场景中:
- 零值的概率质量占比接近30%(对应模型的零膨胀率),所以x=0处的密度高度直接拉到0.3左右
- 剩余beta分布部分的总概率占比仅70%,导致这部分的密度曲线最高值不超过0.7,视觉上就显得异常平坦
而geom_density(aes(y=after_stat(scaled)))是将密度的最大值拉伸到1,完全不考虑概率质量的实际占比,因此能正常展示beta分布的形态。
怎么让stat_halfeye的图正常显示?
只需给stat_halfeye添加scale = "density"参数,切换到传统概率密度的缩放模式即可:
combined_obs %>% add_predicted_draws(beta_zero_model) %>% ggplot(aes(x = .prediction)) + stat_halfeye(.width = c(.95), scale = "density") + ggtitle("stat_halfeye (scale = 'density')")
调整后曲线形态会和geom_density一致,同时保留stat_halfeye自带的区间标注功能。
关于scale参数的补充说明
stat_slabinterval的scale参数有三个可选值:
"probability"(默认):y轴为概率占比,范围[0,1],适合观察各部分的概率权重"density":y轴为传统概率密度,积分等于1,适合展示分布形态"count":y轴为核密度估计的近似样本计数
这就是两种绘图函数结果差异的核心原因。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

