14 KiB
效应量与统计检验力分析
本文档提供了关于效应量计算、解读和报告,以及为研究规划进行统计检验力分析的指导。
效应量的重要性
- 统计显著性 ≠ 实际显著性:p 值只能说明效应是否存在,不能说明效应有多大
- 依赖于样本量:大样本下,微小效应也会变得"显著"
- 可解释性:效应量提供了量级和实际重要性
- 元分析:效应量使得跨研究合并结果成为可能
- 统计检验力分析:样本量确定所必需
黄金法则:始终在报告 p 值的同时报告效应量。
按分析类型分类的效应量
T 检验与均值差异
Cohen's d(标准化均值差)
公式:
- 独立组:d = (M₁ - M₂) / SD_pooled
- 配对组:d = M_diff / SD_diff
解释标准(Cohen, 1988):
- 小:|d| = 0.20
- 中:|d| = 0.50
- 大:|d| = 0.80
依赖上下文的解释:
- 教育领域:d = 0.40 是成功干预的典型值
- 心理学领域:d = 0.40 被认为有意义
- 医学领域:小的效应量也可能具有临床重要性
Python 计算:
import pingouin as pg
import numpy as np
# 含效应量的独立样本 t 检验
result = pg.ttest(group1, group2, correction=False)
cohens_d = result['cohen_d'].values[0]
# 手动计算
mean_diff = np.mean(group1) - np.mean(group2)
pooled_std = np.sqrt((np.var(group1, ddof=1) + np.var(group2, ddof=1)) / 2)
cohens_d = mean_diff / pooled_std
# 配对 t 检验
result = pg.ttest(pre, post, paired=True)
cohens_d = result['cohen_d'].values[0]
d 的置信区间:
from pingouin import compute_effsize_from_t
d, ci = compute_effsize_from_t(t_statistic, nx=n1, ny=n2, eftype='cohen')
Hedges' g(偏差校正 d)
为何使用:Cohen's d 在小样本(n < 20)下存在轻微向上偏差
公式:g = d × 校正因子,其中校正因子 = 1 - 3/(4df - 1)
Python 计算:
result = pg.ttest(group1, group2, correction=False)
hedges_g = result['hedges'].values[0]
何时使用 Hedges' g:
- 样本量较小(每组 n < 20)
- 进行元分析(元分析中的标准做法)
Glass's Δ(Delta)
何时使用:当某一组为已知变异性的对照组时
公式:Δ = (M₁ - M₂) / SD_control
使用场景:
- 临床试验(使用对照组 SD)
- 当处理影响变异性时
方差分析
Eta-squared(η²)
衡量内容:因子解释的总方差比例
公式:η² = SS_effect / SS_total
解释标准:
- 小:η² = 0.01(解释 1% 的方差)
- 中:η² = 0.06(解释 6% 的方差)
- 大:η² = 0.14(解释 14% 的方差)
局限性:多因子时存在偏差(总和 > 1.0)
Python 计算:
import pingouin as pg
# 单因素方差分析
aov = pg.anova(dv='value', between='group', data=df)
eta_squared = aov['SS'][0] / aov['SS'].sum()
# 或直接使用 pingouin
aov = pg.anova(dv='value', between='group', data=df, detailed=True)
eta_squared = aov['np2'][0] # 注意:pingouin 报告的是偏 eta-squared
偏 Eta-squared(η²_p)
衡量内容:排除其他因子后,由该因子解释的方差比例
公式:η²_p = SS_effect / (SS_effect + SS_error)
解释标准:与 η² 相同
何时使用:多因子方差分析(因子设计中的标准做法)
Python 计算:
aov = pg.anova(dv='value', between=['factor1', 'factor2'], data=df)
# pingouin 默认报告偏 eta-squared
partial_eta_sq = aov['np2']
Omega-squared(ω²)
衡量内容:对总体解释方差的更无偏估计
为何使用:η² 会高估效应量;ω² 提供更好的总体估计
公式:ω² = (SS_effect - df_effect × MS_error) / (SS_total + MS_error)
解释标准:与 η² 相同,但通常值更小
Python 计算:
def omega_squared(aov_table):
ss_effect = aov_table.loc[0, 'SS']
ss_total = aov_table['SS'].sum()
ms_error = aov_table.loc[aov_table.index[-1], 'MS'] # 残差 MS
df_effect = aov_table.loc[0, 'DF']
omega_sq = (ss_effect - df_effect * ms_error) / (ss_total + ms_error)
return omega_sq
Cohen's f
衡量内容:方差分析的效应量(类似于 Cohen's d)
公式:f = √(η² / (1 - η²))
解释标准:
- 小:f = 0.10
- 中:f = 0.25
- 大:f = 0.40
Python 计算:
eta_squared = 0.06 # 来自方差分析
cohens_f = np.sqrt(eta_squared / (1 - eta_squared))
在统计检验力分析中使用:ANOVA 统计检验力计算所必需
相关分析
Pearson's r / Spearman's ρ
解释标准:
- 小:|r| = 0.10
- 中:|r| = 0.30
- 大:|r| = 0.50
重要说明:
- r² = 决定系数(解释的方差比例)
- r = 0.30 表示 9% 的共同方差(0.30² = 0.09)
- 考虑方向(正/负)和上下文
Python 计算:
import pingouin as pg
# 含 CI 的 Pearson 相关
result = pg.corr(x, y, method='pearson')
r = result['r'].values[0]
ci = result['CI95'].values[0] # Pingouin 0.5+:之前为 CI95%
# Spearman 相关
result = pg.corr(x, y, method='spearman')
rho = result['r'].values[0]
回归分析
R²(决定系数)
衡量内容:模型解释的 Y 变量方差比例
解释标准:
- 小:R² = 0.02
- 中:R² = 0.13
- 大:R² = 0.26
依赖上下文的解释:
- 物理科学:预期 R² > 0.90
- 社会科学:R² > 0.30 被认为良好
- 行为预测:R² > 0.10 可能有意义
Python 计算:
from sklearn.metrics import r2_score
from statsmodels.api import OLS
# 使用 statsmodels
model = OLS(y, X).fit()
r_squared = model.rsquared
adjusted_r_squared = model.rsquared_adj
# 手动计算
r_squared = 1 - (SS_residual / SS_total)
调整后 R²
为何使用:R² 在添加预测变量时会人为增大;调整后 R² 对模型复杂度进行惩罚
公式:R²_adj = 1 - (1 - R²) × (n - 1) / (n - k - 1)
何时使用:在多元回归中始终与 R² 一同报告
标准化回归系数(β)
衡量内容:预测变量变化一个标准差对结果的影响(以标准差为单位)
解释标准:类似于 Cohen's d
- 小:|β| = 0.10
- 中:|β| = 0.30
- 大:|β| = 0.50
Python 计算:
from scipy import stats
# 首先标准化变量
X_std = (X - X.mean()) / X.std()
y_std = (y - y.mean()) / y.std()
model = OLS(y_std, X_std).fit()
beta = model.params
f²(Cohen's f-squared 用于回归)
衡量内容:单个预测变量或模型比较的效应量
公式:f² = R²_AB - R²_A / (1 - R²_AB)
其中:
- R²_AB = 包含该预测变量的完整模型 R²
- R²_A = 不包含该预测变量的简化模型 R²
解释标准:
- 小:f² = 0.02
- 中:f² = 0.15
- 大:f² = 0.35
Python 计算:
# 比较两个嵌套模型
model_full = OLS(y, X_full).fit()
model_reduced = OLS(y, X_reduced).fit()
r2_full = model_full.rsquared
r2_reduced = model_reduced.rsquared
f_squared = (r2_full - r2_reduced) / (1 - r2_full)
分类数据分析
Cramér's V
衡量内容:χ² 检验的关联强度(适用于任意大小的列联表)
公式:V = √(χ² / (n × (k - 1)))
其中 k = min(行数, 列数)
解释标准(当 k > 2 时):
- 小:V = 0.07
- 中:V = 0.21
- 大:V = 0.35
对于 2×2 表:使用 phi 系数(φ)
Python 计算:
from scipy.stats.contingency import association
# Cramér's V
cramers_v = association(contingency_table, method='cramer')
# Phi 系数(适用于 2x2 表)
phi = association(contingency_table, method='pearson')
优势比(OR)与风险比(RR)
对于 2×2 列联表:
| 结局 + | 结局 - | |
|---|---|---|
| 暴露组 | a | b |
| 未暴露组 | c | d |
优势比:OR = (a/b) / (c/d) = ad / bc
解释:
- OR = 1:无关联
- OR > 1:正相关(优势增加)
- OR < 1:负相关(优势减少)
- OR = 2:优势为两倍
- OR = 0.5:优势为一半
风险比:RR = (a/(a+b)) / (c/(c+d))
何时使用:
- 队列研究:使用 RR(更易解释)
- 病例对照研究:使用 OR(RR 不可用)
- 逻辑回归:OR 为自然输出
Python 计算:
import statsmodels.api as sm
# 从列联表计算
odds_ratio = (a * d) / (b * c)
# 置信区间
table = np.array([[a, b], [c, d]])
oddsratio, pvalue = stats.fisher_exact(table)
# 从逻辑回归计算
model = sm.Logit(y, X).fit()
odds_ratios = np.exp(model.params) # 对系数取指数
ci = np.exp(model.conf_int()) # 对置信区间取指数
贝叶斯效应量
贝叶斯因子(BF)
衡量内容:备择假设与零假设的证据之比
解释:
- BF₁₀ = 1:H₁ 和 H₀ 的证据相等
- BF₁₀ = 3:H₁ 的可能性是 H₀ 的 3 倍(中等证据)
- BF₁₀ = 10:H₁ 的可能性是 H₀ 的 10 倍(强证据)
- BF₁₀ = 100:H₁ 的可能性是 H₀ 的 100 倍(决定性证据)
- BF₁₀ = 0.33:H₀ 的可能性是 H₁ 的 3 倍
- BF₁₀ = 0.10:H₀ 的可能性是 H₁ 的 10 倍
分类标准(Jeffreys, 1961):
- 1–3:轶事证据
- 3–10:中等证据
- 10–30:强证据
- 30–100:非常强的证据
-
100:决定性证据
Python 计算:
import pingouin as pg
# Pingouin 0.5+:提供独立 t 检验的双侧 BF10;完整推断请使用 BayesFactor/JASP/PyMC
result = pg.ttest(group1, group2, correction=False)
bf10 = result['BF10'].values[0]
统计检验力分析
基本概念
统计检验力:当效应存在时检测到该效应的概率(1 - β)
常规标准:
- 检验力 = 0.80(检测到效应的概率为 80%)
- α = 0.05(I 类错误率为 5%)
四个相互关联的参数(已知 3 个,可求解第 4 个):
- 样本量(n)
- 效应量(d、f 等)
- 显著性水平(α)
- 检验力(1 - β)
先验统计检验力分析(规划阶段)
目的:在研究前确定所需样本量
步骤:
- 指定预期效应量(来自文献、预实验数据或最小有意义效应)
- 设定 α 水平(通常为 0.05)
- 设定期望检验力(通常为 0.80)
- 计算所需 n
Python 实现:
from statsmodels.stats.power import (
tt_ind_solve_power,
zt_ind_solve_power,
FTestAnovaPower,
NormalIndPower
)
# T 检验统计检验力分析
n_required = tt_ind_solve_power(
effect_size=0.5, # Cohen's d
alpha=0.05,
power=0.80,
ratio=1.0, # 组间样本量相等
alternative='two-sided'
)
# ANOVA 统计检验力分析
anova_power = FTestAnovaPower()
n_per_group = anova_power.solve_power(
effect_size=0.25, # Cohen's f
ngroups=3,
alpha=0.05,
power=0.80
)
# 相关分析统计检验力分析
from pingouin import power_corr
n_required = power_corr(r=0.30, power=0.80, alpha=0.05)
事后统计检验力分析(研究完成后)
⚠️ 注意:事后检验力存在争议,通常不推荐使用
为何有问题:
- 观测检验力是 p 值的直接函数
- 若 p > 0.05,检验力始终很低
- 不提供除 p 值之外的额外信息
- 可能具有误导性
何时可能可以接受:
- 为未来研究做研究规划
- 使用来自多项研究的效应量(而非仅自身研究)
- 明确目标是确定重复验证所需的样本量
更好的替代方案:
- 报告效应量的置信区间
- 进行敏感性分析
- 报告最小可检测效应量
敏感性分析
目的:根据给定的研究参数确定最小可检测效应量
何时使用:研究完成后,用于了解研究的能力
Python 实现:
# 每组 n=50 时能检测到多大的效应量?
detectable_effect = tt_ind_solve_power(
effect_size=None, # 对此求解
nobs1=50,
alpha=0.05,
power=0.80,
ratio=1.0,
alternative='two-sided'
)
print(f"每组 n=50 时,能检测到 d ≥ {detectable_effect:.2f} 的效应")
效应量的报告
APA 格式指南
T 检验示例:
"A 组(M = 75.2,SD = 8.5)的得分显著高于 B 组(M = 68.3,SD = 9.2),t(98) = 3.82,p < .001,d = 0.77,95% CI [0.36, 1.18]。"
ANOVA 示例:
"处理条件对测试得分存在显著主效应,F(2, 87) = 8.45,p < .001,η²p = .16。使用 Tukey's HSD 的事后比较显示……"
相关分析示例:
"学习时间与考试成绩之间存在中等程度的正相关,r(148) = .42,p < .001,95% CI [.27, .55]。"
回归分析示例:
"回归模型显著预测了考试成绩,F(3, 146) = 45.2,p < .001,R² = .48。学习时间(β = .52,p < .001)和先前 GPA(β = .31,p < .001)是显著的预测变量。"
贝叶斯示例:
"贝叶斯独立样本 t 检验为组间差异提供了强证据,BF₁₀ = 23.5,表明数据在 H₁ 下的可能性是 H₀ 下的 23.5 倍。"
效应量的常见误区
- 不要只依赖参考基准:上下文很重要;小的效应也可能有意义
- 报告置信区间:CI 显示了效应量估计的精度
- 区分统计显著性与实际显著性:大样本可使微小效应变得"显著"
- 考虑成本效益:如果干预措施成本低,即使小的效应也可能有价值
- 多个结局指标:效应量在不同结局间存在差异;报告所有指标
- 不要选择性报告:报告所有计划分析的效应量
- 发表偏倚:已发表的研究效应通常被高估
快速参考表
| 分析类型 | 效应量指标 | 小 | 中 | 大 |
|---|---|---|---|---|
| T 检验 | Cohen's d | 0.20 | 0.50 | 0.80 |
| ANOVA | η², ω² | 0.01 | 0.06 | 0.14 |
| ANOVA | Cohen's f | 0.10 | 0.25 | 0.40 |
| 相关分析 | r, ρ | 0.10 | 0.30 | 0.50 |
| 回归分析 | R² | 0.02 | 0.13 | 0.26 |
| 回归分析 | f² | 0.02 | 0.15 | 0.35 |
| 卡方检验 | Cramér's V | 0.07 | 0.21 | 0.35 |
| 卡方检验(2×2) | φ | 0.10 | 0.30 | 0.50 |
参考文献
- Cohen, J. (1988). Statistical Power Analysis for the Behavioral Sciences(第 2 版)
- Lakens, D. (2013). Calculating and reporting effect sizes
- Ellis, P. D. (2010). The Essential Guide to Effect Sizes(《效应量必备指南》)