如何在R中实现组内变化得分的Cohen's dz计算
双组前后测设计下Cohen's dz的R实现方案
适用R包推荐
- 优先选
effectsize包:CRAN正式收录、持续维护的主流效应量计算包,原生支持配对/重复测量设计的Cohen's dz计算,适配t检验、回归模型等多种输出结果,计算逻辑和学界通用定义完全一致,不需要额外调整参数。 - 做功效分析的时候可以搭配
pwr包使用,包内置的配对样本效应量转换逻辑可以直接做结果校验,也方便后续根据dz值规划样本量。 - 不建议使用个人分享的零散未封装自定义函数,这类代码大多没有做边界值处理、缺失值适配,容易出现计算偏差。
核心计算逻辑
Cohen's dz是专门适配重复测量、配对设计的效应量指标,和独立样本Cohen's d的核心差异是标准差的选择:Cohen's dz用前后测差值的标准差做分母,能准确反映组内个体变化的波动情况,不会因为两组基线水平差异、前后测自身标准差大小干扰效应量结果。
核心计算公式:
dz = M_diff / SD_diff
其中M_diff是组内所有被试后测得分减前测得分的差值均值,SD_diff是这组差值的标准差,不要和前后测各自的标准差、独立样本的合并标准差混淆。
可直接复用的计算脚本
第一步:安装加载依赖包
# 首次运行前执行安装 install.packages("effectsize") # 加载包 library(effectsize)
第二步:数据准备示例
以双组各30名被试的前后测数据为例,使用时直接替换成自己的真实数据即可:
# 固定随机种子,方便结果复现 set.seed(123) # 构造模拟数据:干预组前后测 pre_interv <- rnorm(30, mean = 50, sd = 10) post_interv <- pre_interv + rnorm(30, mean = 8, sd = 6) # 模拟干预后平均提升8分 # 构造模拟数据:对照组前后测 pre_ctrl <- rnorm(30, mean = 50, sd = 10) post_ctrl <- pre_ctrl + rnorm(30, mean = 1, sd = 6) # 模拟对照组平均提升1分 # 整理成数据框格式 dat <- data.frame( group = rep(c("intervention", "control"), each = 30), pre = c(pre_interv, pre_ctrl), post = c(post_interv, post_ctrl) )
第三步:Cohen's dz计算
# 1. 分别计算两组的Cohen's dz ## 干预组dz dz_interv <- cohens_d( x = dat$post[dat$group == "intervention"], y = dat$pre[dat$group == "intervention"], paired = TRUE # 这个参数必须设为TRUE,否则输出的是独立样本d ) print(dz_interv) ## 对照组dz dz_ctrl <- cohens_d( x = dat$post[dat$group == "control"], y = dat$pre[dat$group == "control"], paired = TRUE ) print(dz_ctrl) # 2. 如果你已经跑完了配对t检验,可以直接用t值转dz,结果和上面完全一致 t_res <- t.test(post_interv, pre_interv, paired = TRUE) dz_from_t <- t_to_d( t = as.numeric(t_res$statistic), df_error = t_res$parameter, paired = TRUE ) print(dz_from_t)
手动校验函数
如果需要核对结果,或者不想依赖R包,可以直接用下面的自定义函数计算,结果和effectsize包输出完全一致:
calc_dz <- function(pre_score, post_score) { diff_score <- post_score - pre_score # 自动剔除缺失值 diff_score <- diff_score[!is.na(diff_score)] mean_diff <- mean(diff_score) sd_diff <- sd(diff_score) return(mean_diff / sd_diff) } # 手动计算干预组、对照组dz做校验 calc_dz(pre_interv, post_interv) calc_dz(pre_ctrl, post_ctrl)
注意事项
- 计算时必须把
paired参数设为TRUE,否则输出的是独立样本Cohen's d,结果会和真实dz有明显偏差 - 双组设计需要分别计算干预组、对照组各自的组内dz,不要把两组数据混在一起计算
- 如果数据存在缺失值,要么提前做缺失值插补/删除,要么确保函数开启缺失值自动处理逻辑,避免返回空值
内容的提问来源于stack exchange,提问作者Nibuz_Ertived
相关产品推荐
相关产品推荐

