ggdist包stat_interval()计算区间与手动置信区间不符的原因
问题核心原因
stat_interval()计算逻辑没有问题,区间偏差来自你传入的分布参数错误:
- 你当前代码中
xdist = dist_normal(mean, SD)传入的是原始样本的标准差SD,对应的是原始观测值的总体分布,函数输出的是这个总体分布的分位数区间,也就是你看到的38.5~40.5范围,代表95%的原始观测值会落在这个区间,和你要的均值置信区间是完全不同的统计概念。 - 你手动计算的39.38~39.62是样本均值的置信区间,对应的是样本均值的抽样分布,这个分布的标准差是标准误se,不是原始样本的SD。
修正代码
把分布的标准差参数从SD替换为se即可:
library(tidyverse) library(ggdist) data <- tibble::tribble( ~n, ~mean, ~SD, ~se, "Sample 1", 39.5, 0.5, 0.0625, "Sample 2", 39.4, 0.6, 0.0750 ) data |> ggplot(aes(xdist = dist_normal(mean, se), y = fct_rev(factor(n)))) + stat_interval(.width = c(.5, .8, .9, .95), linewidth = 2) + scale_color_viridis_d(option = "C", end = 0.8) + labs(x = "指标值", y = "样本组", color = "置信水平")
结果校验
修正后Sample 1的95%区间计算逻辑为mean ± 1.96*se,代入数值得到39.5 ± 1.96*0.0625 ≈ 39.38~39.62,和手动计算结果完全匹配。
补充提示:如果单组样本量较小,需要用t分布替代正态分布计算置信区间,可将分布指定为
dist_student_t(df = 组内样本量-1, mu = mean, sigma = se)即可得到更准确的t置信区间。
内容的提问来源于stack exchange,提问作者PupHendo
相关产品推荐
相关产品推荐

