# 效应量与统计检验力分析 本文档提供了关于效应量计算、解读和报告,以及为研究规划进行统计检验力分析的指导。 ## 效应量的重要性 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 计算**: ```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 的置信区间**: ```python 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 计算**: ```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 计算**: ```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 计算**: ```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 计算**: ```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 计算**: ```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 计算**: ```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 计算**: ```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 计算**: ```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 计算**: ```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 计算**: ```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 计算**: ```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 计算**: ```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 实现**: ```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 实现**: ```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 倍。" --- ## 效应量的常见误区 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 | | 回归分析 | 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*(《效应量必备指南》)