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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:36:27