将含比例的宽表转换为带95%置信区间的比例表
为分组比例添加95%置信区间的R实现
现有代码可生成不同教育水平、地区分组下Diab=1的比例表,以下是为每个比例附加95%置信区间(格式:百分比(下限%-上限%))的实现方案:
步骤1:计算分组基础统计量
先统计每个教育水平-地区分组的总人数、Diab=1的人数及原始比例:
library(dplyr) EduLevel_stats <- dta %>% filter(!is.na(Diab), !is.na(edulevel)) %>% group_by(edulevel, region_name) %>% summarise( n_total = n(), n_diab1 = sum(Diab == 1, na.rm = TRUE), perc = n_diab1 / n_total, .groups = "drop" )
步骤2:添加95%置信区间
提供两种常用方法,可任选其一:
方法1:使用binom包计算精确置信区间(推荐)
利用二项分布精确法计算置信区间,结果更严谨:
library(binom) EduLevel_CI <- EduLevel_stats %>% rowwise() %>% mutate( # 计算精确置信区间 ci_result = binom.confint(n_diab1, n_total, conf.level = 0.95, method = "exact"), lower = ci_result$lower, upper = ci_result$upper, # 合并比例与置信区间为指定格式 perc_ci = sprintf("%.1f%% (%.1f%%-%.1f%%)", perc*100, lower*100, upper*100) ) %>% ungroup() %>% select(edulevel, region_name, perc_ci) # 保留需要的列
方法2:手动计算Wilson置信区间(无需额外包)
Wilson区间是比例置信区间的经典计算方法,无需安装额外包:
EduLevel_CI_manual <- EduLevel_stats %>% mutate( z = qnorm(0.975), # 95%置信区间对应的Z值 # Wilson区间核心计算 numerator = n_diab1 + z^2/2, denominator = n_total + z^2, p_hat = numerator / denominator, se = sqrt((p_hat*(1-p_hat))/denominator), lower = p_hat - z*se, upper = p_hat + z*se, # 修正边界值,确保区间在0-1范围内 lower = ifelse(lower < 0, 0, lower), upper = ifelse(upper > 1, 1, upper), # 格式化输出 perc_ci = sprintf("%.1f%% (%.1f%%-%.1f%%)", perc*100, lower*100, upper*100) ) %>% select(edulevel, region_name, perc_ci)
步骤3:转换为宽表
将结果转换为与原代码输出结构一致的宽表:
# 对应方法1的结果转宽表 wide_EduLevel_CI <- EduLevel_CI %>% spread(region_name, perc_ci) # 对应方法2的结果转宽表 wide_EduLevel_CI_manual <- EduLevel_CI_manual %>% spread(region_name, perc_ci)
内容的提问来源于stack exchange,提问作者sam.cold
相关产品推荐
相关产品推荐

