如何在gtsummary中自定义标准化差异统计量并引用分组比例?
在gtsummary中添加自定义分类变量标准化均值差异(SMD)列
要实现你需要的自定义Standardized Difference列,可通过gtsummary的add_stat()函数结合自定义计算函数完成,步骤如下:
1. 编写SMD计算函数
按照你给出的公式cat_smd=abs((p_1-p_0)/(sqrt(p_1*(1-p_1)+p_0*(1-p_0))/2)),编写函数提取分组比例并计算SMD:
cat_smd_fun <- function(data, by, variable) { # 获取分组变量的两个水平(exp的0和1) by_levels <- sort(unique(data[[by]])) # 计算两组中目标类别(如sex=0)的比例 p0 <- mean(data[[variable]][data[[by]] == by_levels[1]] == 0, na.rm = TRUE) p1 <- mean(data[[variable]][data[[by]] == by_levels[2]] == 0, na.rm = TRUE) # 代入公式计算SMD numerator <- abs(p1 - p0) denominator <- sqrt(p1*(1-p1) + p0*(1-p0)) / 2 smd <- numerator / denominator # 保留两位小数返回 sprintf("%.2f", smd) }
2. 生成带自定义列的汇总表
在原有tbl_summary()代码基础上,调用add_stat()添加自定义统计列,指定仅对分类变量应用该函数:
# 加载包 library(tidyverse) library(gtsummary) # 创建数据 age = c(34, 26, 42, 39, 17, 32, 28, 35, 42, 42, 44, 21, 26, 19, 34, 38, 20, 23, 33, 39, 28, 30, 19, 30, 37, 22, 32, 26, 18, 26) care = c(4, 2, 4, 4, 5, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, 4) sex = c(1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1) exp = c(1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0) df = data.frame(age, sex, care, exp) # 生成汇总表并添加SMD列 tbl <- df %>% tbl_summary(by = exp, type = all_dichotomous() ~ "categorical") %>% add_overall() %>% add_stat( fns = all_categorical() ~ cat_smd_fun, # 仅对分类变量计算SMD label = "**Standardized Difference**", # 设置列标题 location = "after_overall" # 放在Overall列之后 ) # 查看结果 tbl
结果验证
对于sex=0的情况,计算得:
- p0(exp=0组)= 5/16 ≈ 0.31
- p1(exp=1组)=7/14=0.50
代入公式得:abs((0.5-0.31)/(sqrt(0.5*0.5 + 0.31*0.69)/2)) ≈ abs(0.19/(0.68/2)) ≈ 0.19/0.34 ≈ 0.56,与你预期的结果一致。
内容的提问来源于stack exchange,提问作者user22467611
相关产品推荐
相关产品推荐

