You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:55:20