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

如何在R语言table1包中计算标准化均值差(SMD)?

问题解决:table1包添加SMD列的报错修正与正确实现

错误原因分析

你遇到的Error in if (is.numeric(y) & g == 1) { : the condition has length > 1,是因为g == 1会返回一个和数据长度一致的布尔向量,而if语句要求条件是单个逻辑值,无法处理向量型条件。同时你的SMD计算逻辑不符合标准定义,还存在变量名拼写错误。

修正后的完整代码

f <- function(x, n, ...) factor(sample(x, n, replace=T, ...), levels=x)
set.seed(427)

n <- 146
dat <- data.frame(id=1:n)
dat$treat <- f(c("Placebo", "Treated"), n, prob=c(1, 2)) # 2:1 randomization
dat$age   <- sample(18:65, n, replace=TRUE)
dat$sex   <- f(c("Female", "Male"), n, prob=c(.6, .4))  # 60% female
dat$wt    <- round(exp(rnorm(n, log(70), 0.23)), 1)

# 添加缺失值
dat$wt[sample.int(n, 5)] <- NA

label(dat$age)   <- "Age"
label(dat$sex)   <- "Sex"
label(dat$wt)    <- "Weight"
label(dat$treat) <- "Treatment Group"

units(dat$age)   <- "years"
units(dat$wt)    <- "kg"

my.render.cont <- function(x) {
    with(stats.apply.rounding(stats.default(x), digits=2), c("",
        "Mean (SD)"=sprintf("%s (&plusmn; %s)", MEAN, SD)))
}
my.render.cat <- function(x) {
    c("", sapply(stats.default(x), function(y) with(y,
        sprintf("%d (%0.0f %%)", FREQ, PCT))))
}

# 修正后的SMD计算函数
smd_value <- function(x, ...) {
  # 移除overall组
  x <- x[-length(x)]
  
  # 判断是否为数值型变量,非数值型返回--
  if (!is.numeric(unlist(x))) {
    return("--")
  }
  
  # 提取两组数据并处理缺失值
  group1 <- na.omit(x[[1]])
  group2 <- na.omit(x[[2]])
  
  # 计算各组均值、标准差和样本量
  mean1 <- mean(group1)
  mean2 <- mean(group2)
  sd1 <- sd(group1)
  sd2 <- sd(group2)
  n1 <- length(group1)
  n2 <- length(group2)
  
  # 计算合并标准差(SMD通用计算方式)
  pooled_sd <- sqrt(((n1 - 1)*sd1^2 + (n2 - 1)*sd2^2)/(n1 + n2 - 2))
  
  # 计算SMD,方向为Treated组减Placebo组,可按需调整
  smd_val <- (mean2 - mean1)/pooled_sd
  
  # 保留两位小数返回
  sprintf("%.2f", smd_val)
}

# 生成带SMD列的基线表
table1(~ age + sex + wt | treat, data=dat,  
       render.continuous=my.render.cont, 
       render.categorical=my.render.cat, 
       extra.col=list(`SMD`=smd_value))

关键修正点

  1. 条件判断逻辑:先判断变量类型,非数值型直接返回--,避免无效计算。
  2. 分组数据提取:直接通过x[[1]]/x[[2]]提取两组数据,无需构造分组向量,彻底解决向量型条件报错。
  3. 标准SMD计算:采用临床研究通用的合并标准差计算方式,确保结果符合学术规范。
  4. 缺失值处理:用na.omit()过滤缺失值,避免统计量计算出错。
  5. 输出格式化:将SMD结果保留两位小数,提升表格可读性。

内容的提问来源于stack exchange,提问作者gbg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:10:28