如何在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 (± %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))
关键修正点
- 条件判断逻辑:先判断变量类型,非数值型直接返回
--,避免无效计算。 - 分组数据提取:直接通过
x[[1]]/x[[2]]提取两组数据,无需构造分组向量,彻底解决向量型条件报错。 - 标准SMD计算:采用临床研究通用的合并标准差计算方式,确保结果符合学术规范。
- 缺失值处理:用
na.omit()过滤缺失值,避免统计量计算出错。 - 输出格式化:将SMD结果保留两位小数,提升表格可读性。
内容的提问来源于stack exchange,提问作者gbg
相关产品推荐
相关产品推荐

