gtsummary中add_difference()计算百分比差值异常问题求助
解决方案
要实现分类变量各水平的分组百分比差值(Control - Intervencion)及置信区间,需调整add_difference()的参数,将分类变量按二分类方式处理每个水平,具体代码如下:
library(gtsummary) library(dplyr) # 1. 转换变量为因子类型(保留所有水平) df <- df %>% mutate( asignado = as.factor(asignado), mxsitam = as.factor(mxsitam) ) # 2. 生成统计表格并添加差值列 df %>% tbl_summary( by = "asignado", # 按分组变量拆分 missing = "always", # 始终显示缺失值 digits = list(all_categorical() ~ c(0, 1)), # 分类变量:计数保留0位小数,百分比保留1位 statistic = list(all_categorical() ~ "{n} ({p}%)"), # 统计量格式:计数(百分比%) missing_text = "Casos perdidos", # 缺失值显示文本 percent = "column" # 按列计算百分比(每组内的占比) ) %>% add_overall() %>% # 添加整体列 modify_header(label = "") %>% # 清空标签列标题 add_difference( # 关键:将所有分类变量按二分类处理,计算每个水平的比例差值 type = list(all_categorical() ~ "binary"), # 设置差值列的显示格式:差值(95%置信区间范围)% statistic = list(all_categorical() ~ "{diff} ({conf.low} to {conf.high})%"), # 使用比例检验计算差值和置信区间 test = list(all_categorical() ~ "prop.test"), # 指定差值计算方向:Control组百分比 - Intervencion组百分比 contrast = list(asignado = "Control - Intervencion") )
代码说明
type = list(all_categorical() ~ "binary"):强制将分类变量的每个水平视为独立二分类变量,从而计算每个水平的组间比例差值。statistic:定义差值列的显示格式,包含差值和95%置信区间,转成百分比形式。contrast:明确差值的计算方向,确保是Control组减去Intervencion组的百分比。test = list(all_categorical() ~ "prop.test"):使用比例检验计算差值的置信区间,符合百分比差值的统计逻辑。
替代方案:手动拆分二分类变量
如果上述参数设置不生效,可先将mxsitam拆分为多个二分类变量,再进行汇总:
df %>% mutate( asignado = as.factor(asignado), mxsitam_No = as.integer(mxsitam == "No"), mxsitam_Si = as.integer(mxsitam == "Si") ) %>% select(asignado, mxsitam_No, mxsitam_Si) %>% tbl_summary( by = "asignado", missing = "always", digits = list(all_continuous() ~ c(1, 1)), # 连续变量(这里是0/1)的统计量保留1位小数 statistic = list(all_continuous() ~ "{mean} ({sd}%)"), # 显示均值(即百分比)和标准差 missing_text = "Casos perdidos", percent = "column" ) %>% add_overall() %>% modify_header(label = "") %>% add_difference( statistic = list(all_continuous() ~ "{diff} ({conf.low} to {conf.high})%"), test = list(all_continuous() ~ "t.test"), # 用t检验计算均值差值的置信区间 contrast = list(asignado = "Control - Intervencion") ) %>% modify_table_body( # 将变量名替换为原水平名称 mutate(label = case_when( label == "mxsitam_No" ~ "No", label == "mxsitam_Si" ~ "Si", TRUE ~ label )) )
这个方案通过手动生成每个水平的二分类变量,将其当作连续变量计算均值(即百分比)的差值,同样能得到所需结果。
内容的提问来源于stack exchange,提问作者mala fama
相关产品推荐
相关产品推荐

