如何为gtsummary tbl_svysummary生成的行百分比添加置信区间?
为gtsummary行百分比添加置信区间
需求
使用gtsummary的tbl_svysummary()生成带行百分比的汇总表时,需要为行百分比添加置信区间,但默认add_ci()仅支持列百分比的置信区间计算。
初始代码(用户提供)
# 加载所需包 library(survey) library(gtsummary) library(dplyr) library(stringr) # 设置随机种子保证可复现 set.seed(123) # 创建模拟数据集 n <- 300 data <- data.frame( treatment = sample(c("Control", "Intervention"), n, replace = TRUE), sex = sample(c("Male", "Female", NA), n, replace = TRUE, prob = c(0.48, 0.48, 0.04)), age = round(rnorm(n, mean = 55, sd = 12), 0), bmi = round(rnorm(n, mean = 28, sd = 5), 1), smoker = sample(c("Yes", "No", NA), n, replace = TRUE, prob = c(0.2, 0.75, 0.05)) ) # 创建调查设计对象 des <- svydesign(ids = ~1, data = data) # 定义需纳入汇总的变量 shared_variables <- c("sex", "age", "bmi", "smoker") # 自定义变量标签 create_labels <- function() { list( sex = "Sex", age = "Age (years)", bmi = "BMI", smoker = "Smoking Status" ) } # 生成带行百分比的汇总表 tbl <- tbl_svysummary( data = des, by = treatment, # 分组变量(支持二元/多分类) include = shared_variables, missing = "always", percent = "row", # 启用行百分比 missing_text = "Missing/Refused", digits = list( all_categorical() ~ c(0, 0, 3), all_continuous() ~ 1 ), label = create_labels(), statistic = list( all_categorical() ~ "{n} ({p}%)" # 先简化统计量,后续添加置信区间 ) )
用户尝试方法的问题
用户尝试通过提取表格文本中的百分比和标准误计算置信区间,但这种方法依赖固定文本格式,一旦表格输出格式变化就会出错,且存在语法疏漏(如1.96se_value缺少乘法运算符):
confidence_intervals<-function(data, variable, by, tbl, ...){ p_value_raw <- stringr::str_extract(.x, "(?<=\\()\\d+(?=\\%\\))") se_value_raw <- stringr::str_extract(.x, "(?<=\\)\\s)0\\.\\d+") p_value <- suppressWarnings(as.numeric(trimws(p_value_raw))) se_value <- suppressWarnings(as.numeric(trimws(se_value_raw))) confidence_interval_upper= ((p_value/100)+1.96*se_value) confidence_interval_lower= ((p_value/100)-1.96*se_value) confidence_interval<-paste(confidence_interval_lower, confidence_interval_upper) return(confidence_interval) }
正确解决方案:直接从调查设计计算置信区间
通过add_stat()结合survey包的函数,直接从调查设计对象中计算行百分比的置信区间,避免文本提取的不可靠性。
1. 自定义统计函数
编写函数计算每个类别下各分组的行百分比及其95%置信区间:
# 自定义函数:计算行百分比的置信区间 row_pct_ci <- function(data, variable, by, ...) { # 构建公式:分组变量 ~ 特征变量 formula <- as.formula(paste(by, "~", variable)) # 使用svyby计算每个特征类别下,各分组的比例及置信区间 results <- svyby(formula, by = as.formula(paste("~", variable)), design = data, FUN = svymean, vartype = c("ci")) # 整理结果:转换为百分比格式 results %>% mutate( pct = !!sym(by) * 100, lower_ci = ci_l * 100, upper_ci = ci_u * 100 ) %>% select(all_of(variable), pct, lower_ci, upper_ci) }
2. 将置信区间整合到表格
使用add_stat()将计算结果添加到汇总表,并设置显示格式:
# 添加行百分比的置信区间 tbl_with_ci <- tbl %>% add_stat( fns = list( all_categorical() ~ row_pct_ci ), # 定义置信区间的显示格式 statistic = list( all_categorical() ~ "{p}% ({lower_ci} to {upper_ci})" ), # 合并统计量与置信区间到同一单元格 merge = TRUE ) # 查看最终表格 tbl_with_ci
3. 关键说明
- 直接从调查设计计算,结果准确可靠,不受表格文本格式影响
- 支持多分类分组变量,无需修改函数即可适配不同场景
- 自动兼容缺失值处理(因初始表格设置了
missing = "always")
内容的提问来源于stack exchange,提问作者Just Created
相关产品推荐
相关产品推荐

