使用gt_summary的add_ci()返回均值而非95%CI的问题排查
问题:gt_summary::add_ci()返回均值而非95%置信区间
使用gt_summary包的add_ci()函数时,发现返回的置信区间(CI)结果均为均值,而非预期的95%置信区间,且与bayestestR包中ci()函数计算的置信区间差异显著。
问题原因
tbl_summary()和add_ci()的默认逻辑是针对原始观测数据,用正态近似法计算置信区间(基于均值和标准误),但你的数据是从贝叶斯模型提取的后验分布样本,需要直接从样本中提取分位数来得到贝叶斯可信区间(而非频率学置信区间),默认方法完全不适用。
解决方案
直接在tbl_summary()中自定义统计量,从后验样本计算中位数和95%可信区间(分位数区间或HPD区间),替代add_ci()的默认行为。以下是修改后的代码:
方法1:直接计算分位数可信区间
# 创建表格(修改后的版本) total_mt_table <- total_mt_posteriors %>% tbl_strata(group, ~.x %>% tbl_summary(by = time, # 自定义统计量:中位数 + 95%分位数可信区间 statistic = all_continuous() ~ "{median} ({p2.5}, {p97.5})", missing = "no", digits = all_continuous() ~ 2, label = list(.value ~ "Total")) %>% modify_header(label ~ "**Muscle thickness<br>(cm)**") %>% modify_header(all_stat_cols() ~ "**{level}**") %>% modify_footnote(update = everything() ~ NA)) total_mt_table
方法2:计算HPD最高 posterior 密度区间
如果需要更严谨的HPD区间,可以先预计算区间再传入表格:
# 预计算HPD区间 total_mt_posteriors_hpd <- total_mt_posteriors %>% group_by(group, time) %>% summarise( median = median(.value), ci_low = ci(.value, method = "hpd")$CI_low, ci_high = ci(.value, method = "hpd")$CI_high, .groups = "drop" ) # 用预计算的统计量创建表格 total_mt_table_hpd <- total_mt_posteriors_hpd %>% tbl_strata(group, ~.x %>% tbl_summary(by = time, include = c(median, ci_low, ci_high), statistic = all_continuous() ~ "{mean}", missing = "no", digits = all_continuous() ~ 2, label = list(median ~ "Total")) %>% modify_header(label ~ "**Muscle thickness<br>(cm)**") %>% modify_header(all_stat_cols() ~ "**{level}**") %>% # 合并中位数和HPD区间 modify_fmt_fun(all_stat_cols() ~ function(x) { paste0(x[1], " (", x[2], ", ", x[3], ")") }) %>% modify_footnote(update = everything() ~ NA)) total_mt_table_hpd
关键说明
- 贝叶斯模型的后验样本必须用分位数或HPD区间表示可信区间,不能用频率学的正态近似方法。
gt_summary的add_ci()默认不支持贝叶后验样本的可信区间计算,必须手动定义统计逻辑。
内容的提问来源于stack exchange,提问作者Juicebox
相关产品推荐
相关产品推荐

