如何在gtsummary的tbl_custom_summary中获取当前分组的正确样本量?
解决gtsummary中按分组正确计算响应比例的问题
问题核心
在使用tbl_custom_summary按治疗组(trt)分组计算各肿瘤分期(stage)的响应患者比例时,原方法依赖当前分期的分组数据提取分组名称,当某分组下无对应分期的病例时,无法正确获取该分组的总响应数,导致比例计算错误(例如删除Drug A的T1期病例后,分母应取Drug A的总响应数21,而非全数据集的响应数54)。
解决方案
利用tbl_custom_summary传递给自定义统计函数的by_level参数,直接获取当前处理的分组级别,无需依赖当前分期的分组数据,确保分组信息的准确性。
修改后的完整代码
library(gtsummary) library(tidyverse) my_ratio_summary = function(numerator, na.rm = TRUE, conf.level = 0.95) { function(data, full_data, ...) { # 提取当前处理的分组级别(如Drug A、Drug B) current_group <- list(...)$by_level # 筛选当前分组的全部数据 druggroup_data <- full_data %>% filter(trt == current_group) # 计算当前分期的响应数 num <- sum(data[[numerator]], na.rm = na.rm) # 计算当前分组的总响应数 denom <- sum(druggroup_data[[numerator]], na.rm = na.rm) # 计算比例,避免除以0 ratio <- ifelse(denom == 0, NA_real_, num / denom) dplyr::tibble(num = num, denom = denom, ratio = ratio) } } # 生成表格 trial %>% filter(!(trt == 'Drug A' & stage == 'T1')) %>% tbl_custom_summary( include = c("stage"), by = "trt", stat_fns = ~ my_ratio_summary("response"), statistic = ~"{ratio}%, {num}/{denom}", digits = ~ c(style_percent, 0, 0) )
关键修改说明
- 分组信息获取方式:不再从当前分期的
data中提取分组名称,而是直接通过...中的by_level参数获取当前处理的分组级别,即使当前分期无该分组的病例,也能准确拿到分组信息。 - 分母计算准确性:始终基于当前分组的全部数据计算总响应数,确保比例计算的分母正确。
- 异常处理:添加
denom == 0的判断,避免出现除以0的运行错误。
可选调整
如果需要计算的是当前分期响应数占分组总样本数的比例,而非占总响应数的比例,只需将分母计算改为:
denom <- nrow(druggroup_data)
内容的提问来源于stack exchange,提问作者LittleLynx
相关产品推荐
相关产品推荐

