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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:37:20