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
相关产品推荐
相关产品推荐

