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

smd包与R中手动计算标准化均数差(SMD)的结果差异问题

smd包与R中手动计算标准化均数差(SMD)的结果差异问题

嗨,我来帮你拆解这个SMD计算结果不一致的问题~你已经用模拟数据做了对比,那咱们先把代码补全,一步步看差异到底出在哪。

首先先把完整的模拟代码补全,确保能跑通:

library(smd)

# 生成随机数据
x <- rnorm(200)
g <- rep(1:2, each = 100)

# 拆分两组数据
x1 <- x[1:100]
x2 <- x[101:200]

# 用smd包计算SMD
smd_result <- smd(x, g)
print(smd_result)

接下来咱们手动计算标准的合并标准差法SMD——这也是很多统计教材里的推荐方式,同时也是smd包默认采用的计算逻辑:

# 计算两组均数差
mean_diff <- mean(x1) - mean(x2)
# 计算合并标准差(用自由度校正的无偏方差加权合并)
pooled_sd <- sqrt( ( (length(x1)-1)*var(x1) + (length(x2)-1)*var(x2) ) / (length(x1)+length(x2)-2) )
# 手动计算SMD
manual_smd_pooled <- mean_diff / pooled_sd
print(manual_smd_pooled)

这时候你会发现,这个手动计算的结果和smd包的输出几乎完全一致(因为模拟数据有随机性,数值会非常接近)。那如果你的手动结果和smd包不一样,大概率是用了不同的标准差做分母,给你举几个常见的错误手动计算方式:

  • 误用总样本的标准差而非合并标准差:
# 错误示范:用整个样本的标准差当分母
total_sd <- sd(x)
manual_smd_total <- mean_diff / total_sd
print(manual_smd_total)

这个结果会和smd包有明显差异。

  • 误用单组的标准差当分母:
# 错误示范:只用第一组的标准差当分母
manual_smd_single <- mean_diff / sd(x1)
print(manual_smd_single)

这种情况结果也会和smd包不同。

至于你提到的gtsummary和CreateTableOne的结果差异,本质也是因为不同包的默认SMD计算逻辑可能有区别:

  • CreateTableOne默认对连续变量采用合并标准差计算SMD,和smd包默认逻辑一致,但如果分组样本量不均或你调整了参数,结果可能变化;
  • gtsummary默认调用smd包的方法,但如果在tbl_summary里调整了相关参数(比如指定了非均数的中心统计量),也会出现结果偏差。

最后再给你划个重点:SMD的差异90%以上都来自分母标准差的计算方式,只要你确保手动计算时用的是自由度校正的合并标准差,结果就会和smd包默认输出对齐啦~

备注:内容来源于stack exchange,提问作者Adrià Murias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:08:09