Files
skillhub-086-statistical-an…/references/effect_sizes_and_power.md
T
2026-07-13 21:36:15 +08:00

14 KiB
Raw Blame History

效应量与统计检验力分析

本文档提供了关于效应量计算、解读和报告,以及为研究规划进行统计检验力分析的指导。

效应量的重要性

  1. 统计显著性 ≠ 实际显著性:p 值只能说明效应是否存在,不能说明效应有多大
  2. 依赖于样本量:大样本下,微小效应也会变得"显著"
  3. 可解释性:效应量提供了量级和实际重要性
  4. 元分析:效应量使得跨研究合并结果成为可能
  5. 统计检验力分析:样本量确定所必需

黄金法则:始终在报告 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):

  • 13:轶事证据
  • 310:中等证据
  • 1030:强证据
  • 30100:非常强的证据
  • 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 个):

  1. 样本量(n
  2. 效应量(d、f 等)
  3. 显著性水平(α)
  4. 检验力(1 - β)

先验统计检验力分析(规划阶段)

目的:在研究前确定所需样本量

步骤

  1. 指定预期效应量(来自文献、预实验数据或最小有意义效应)
  2. 设定 α 水平(通常为 0.05
  3. 设定期望检验力(通常为 0.80
  4. 计算所需 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.2SD = 8.5)的得分显著高于 B 组(M = 68.3SD = 9.2),t(98) = 3.82p < .001d = 0.7795% CI [0.36, 1.18]。"

ANOVA 示例

"处理条件对测试得分存在显著主效应,F(2, 87) = 8.45p < .001,η²p = .16。使用 Tukey's HSD 的事后比较显示……"

相关分析示例

"学习时间与考试成绩之间存在中等程度的正相关,r(148) = .42p < .00195% CI [.27, .55]。"

回归分析示例

"回归模型显著预测了考试成绩,F(3, 146) = 45.2p < .001R² = .48。学习时间(β = .52p < .001)和先前 GPA(β = .31p < .001)是显著的预测变量。"

贝叶斯示例

"贝叶斯独立样本 t 检验为组间差异提供了强证据,BF₁₀ = 23.5,表明数据在 H₁ 下的可能性是 H₀ 下的 23.5 倍。"


效应量的常见误区

  1. 不要只依赖参考基准:上下文很重要;小的效应也可能有意义
  2. 报告置信区间CI 显示了效应量估计的精度
  3. 区分统计显著性与实际显著性:大样本可使微小效应变得"显著"
  4. 考虑成本效益:如果干预措施成本低,即使小的效应也可能有价值
  5. 多个结局指标:效应量在不同结局间存在差异;报告所有指标
  6. 不要选择性报告:报告所有计划分析的效应量
  7. 发表偏倚:已发表的研究效应通常被高估

快速参考表

分析类型 效应量指标
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
回归分析 0.02 0.13 0.26
回归分析 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(《效应量必备指南》)