卡方检验深度解析:从 Pearson 到现代统计推断

卡方检验是唯一同时登顶使用频次与学术引用双榜的统计方法。从Pearson 1900年创立到Fisher的自由度修正,再到Cochran-Mantel-Haenszel分层检验,本文追溯125年演进史,提供R/Python实战代码与经典论文引用。
卡方检验深度解析:从 Pearson 到现代统计推断
生物医学高影响力方法深度解析 · 第 1 篇 | 必学必会 · 系列文章
卡方检验(χ² test)是唯一同时登顶"使用频次"与"学术引用"双榜的统计方法。它由 Karl Pearson 于 1900 年创立,历经 Fisher、Yates、Cochran、Mantel、Haenszel 等统计学巨匠的接力完善,至今仍是分类数据分析不可替代的基石。本文从历史演进出发,深入原理,辅以 R/Python 实战代码与经典论文引用,让你真正理解这个看似简单实则深刻的方法。
图 1:不同自由度下的 χ² 分布曲线
一、历史演进:从 1900 到今天的 125 年
1900
Karl Pearson 提出 χ² 拟合优度检验
在论文 "On the Criterion that a Given System of Deviations from the Probable in the Case of a Correlated System of Variables is Such that it Can be Reasonably Supposed to Have Arisen from Random Sampling"(Philosophical Magazine, Series 5, 50(302): 157–175)中,Pearson 提出用 χ² = Σ(O-E)²/E 来衡量观察频数与期望频数的偏差。这篇论文奠定了现代假设检验的数学基础。
1922
R.A. Fisher 引入自由度概念并修正 Pearson 的错误
Pearson 最初认为 χ² 检验的自由度等于分类数,但 Fisher 在 "On the Interpretation of χ² from Contingency Tables, and the Calculation of P"(Journal of the Royal Statistical Society, 85(1): 87–94)中指出,估计参数会消耗自由度。例如 2×2 列联表的正确自由度是 (r-1)(c-1)=1,而非 4。这是统计学史上最著名的修正之一。
1934
Frank Yates 提出连续性校正
针对 2×2 列联表中小样本下 χ² 近似不佳的问题,Yates 提出将 |O-E| 减去 0.5 后再平方(Yates' correction for continuity)。虽然后来证明该校正过于保守,但在 20 世纪中期曾广泛使用。
1935
Fisher 精确检验
Fisher 在 The Design of Experiments 中引入基于超几何分布的精确检验,作为小样本 2×2 表的替代方案。经典案例:"女士品茶"(Lady Tasting Tea)实验。
1954–1959
Cochran–Mantel–Haenszel (CMH) 检验
William Cochran (1954) 和 Nathan Mantel & William Haenszel (1959) 各自独立提出分层列联表分析方法,允许在控制混杂变量的前提下检验关联。Mantel 与 Haenszel 的经典论文 "Statistical Aspects of the Analysis of Data from Retrospective Studies of Disease"(JNCI, 22(4): 719–748)至今已被引超过 4 万次。
现代
扩展与泛化
McNemar 检验(配对分类数据)、Cochran's Q 检验(多个相关样本)、对数线性模型(多维列联表)、G 检验(似然比检验)等将 χ² 的思想推广到更复杂的场景。在机器学习时代,χ² 特征选择(scikit-learn 的 chi2)延续了 Pearson 的遗产。
点击互动演示,获得直观印象,更好理解。
二、数学原理
2.1 皮尔逊卡方统计量
χ² = Σi (Oi − Ei)² / Ei
其中 Oi 是第 i 个单元格的观察频数,Ei 是零假设下的期望频数。统计量近似服从自由度为 (r−1)(c−1) 的 χ² 分布。
直觉理解:如果零假设为真(行变量与列变量独立),Oi 与 Ei 的差异应该纯粹由随机抽样误差引起。χ² 值越大,意味着观察数据与零假设的偏离越"不像是偶然的"。
图 2:从列联表到 χ² 统计量的计算流程
2.2 三大使用场景
场景典型问题零假设 H₀自由度 拟合优度检验基因型频率是否符合 Hardy-Weinberg 平衡?观察分布 = 理论分布k − 1 独立性检验吸烟与肺癌是否关联?行变量 ⟂ 列变量(r−1)(c−1) 同质性检验不同医院的术后感染率是否相同?各总体分布相同(r−1)(c−1)
💡 独立性 vs 同质性:两者数学公式相同,但研究设计不同。独立性检验是单样本(随机抽一个样本,同时测两变量);同质性检验是多样本(按分组变量分层抽样,比较各层的分布是否相同)。
三、实战代码
3.1 R 语言示例
# ============================================================
# 示例 1:2×2 独立性检验 —— 吸烟与肺癌
# 数据来源:Doll & Hill (1950), BMJ, 2(4682): 739–748
# ============================================================
smoking <- matrix(c(688, 650, 21, 59), nrow = 2,
dimnames = list(
Cancer = c("肺癌", "对照"),
Smoking = c("吸烟", "不吸烟")
))
smoking
# 吸烟 不吸烟
# 肺癌 688 21
# 对照 650 59
# 卡方检验(默认带 Yates 校正)
chisq.test(smoking)
# X-squared = 18.219, df = 1, p-value = 1.97e-05
# 关闭 Yates 校正以获得 Pearson 卡方
chisq.test(smoking, correct = FALSE)
# X-squared = 19.125, df = 1, p-value = 1.22e-05
# Fisher 精确检验(小样本推荐)
fisher.test(smoking)
# odds ratio = 2.97, p-value = 1.06e-05
# ============================================================
# 示例 2:拟合优度检验 —— Hardy-Weinberg 平衡
# 某人群 MN 血型:MM=342, MN=500, NN=187
# ============================================================
obs <- c(MM = 342, MN = 500, NN = 187)
n <- sum(obs)
p_M <- (2 * obs["MM"] + obs["MN"]) / (2 * n)
p_N <- 1 - p_M
exp <- c(MM = n * p_M^2, MN = n * 2 * p_M * p_N, NN = n * p_N^2)
chisq.test(obs, p = exp / sum(exp))
# X-squared = 0.956, df = 1, p-value = 0.328 → 不拒绝 HWE
# ============================================================
# 示例 3:CMH 分层检验 —— 控制混杂
# 按年龄分层分析吸烟-肺癌关联
# ============================================================
library(vcd)
# 创建三维数组:[行, 列, 层]
data_3d <- array(
c(100, 50, 20, 30, # 年龄<50 层
588, 600, 1, 29), # 年龄≥50 层
dim = c(2, 2, 2),
dimnames = list(
Cancer = c("肺癌", "对照"),
Smoking = c("吸烟", "不吸烟"),
Age = c("<50", "≥50")
))
mantelhaen.test(data_3d)
# common odds ratio = 5.16, p-value = 2.3e-08
3.2 Python 示例
import numpy as np
from scipy.stats import chi2_contingency, chi2, chisquare
# ============================================================
# 示例 1:独立性检验
# ============================================================
observed = np.array([[688, 21],
[650, 59]])
chi2_stat, p_val, dof, expected = chi2_contingency(observed)
print(f"χ² = {chi2_stat:.2f}, df = {dof}, p = {p_val:.2e}")
# χ² = 18.22, df = 1, p = 1.97e-05
print("期望频数:\n", expected)
# [[667.58 41.42]
# [670.42 41.58]]
# ============================================================
# 示例 2:拟合优度检验
# ============================================================
obs = np.array([342, 500, 187])
n = obs.sum()
p_M = (2 * obs[0] + obs[1]) / (2 * n)
exp = np.array([n * p_M**2, n * 2 * p_M * (1-p_M), n * (1-p_M)**2])
chisq_stat, p_val = chisquare(f_obs=obs, f_exp=exp)
print(f"HWE test: χ² = {chisq_stat:.3f}, p = {p_val:.3f}")
# ============================================================
# 示例 3:后验功效分析
# ============================================================
from scipy.stats import ncx2
# 效应量 w = 0.1(小), 0.3(中), 0.5(大) — Cohen (1988)
w, N, df = 0.3, 200, 1
ncp = N * w**2 # 非中心参数 λ
crit = chi2.ppf(0.95, df) # α=0.05 临界值
power = 1 - ncx2.cdf(crit, df, ncp)
print(f"功效 (1-β) = {power:.3f}")
# 功效 = 0.862
四、关键注意事项与常见陷阱
4.1 期望频数的"5 法则"
⚠️ 经典规则:当任一单元格期望频数 E < 5 时,χ² 近似不可靠,应使用 Fisher 精确检验。但 Cochran (1954) 指出,如果所有 E ≥ 1 且至少 80% 的 E ≥ 5,χ² 近似仍可接受。
4.2 Yates 校正的争议
Yates 校正虽然减少了 I 类错误,但严重增加了 II 类错误(过于保守)。现代统计实践(如 Campbell, 2007, Statistics in Medicine)普遍建议:2×2 表直接用 Pearson χ²,小样本用 Fisher 精确检验,不要使用 Yates 校正。
4.3 χ² ≠ 因果关系
显著的 χ² 只说明"关联不太可能由随机产生",不等于因果。Doll & Hill (1950) 的吸烟-肺癌研究之所以能推断因果,靠的是剂量-反应关系、时间序列、生物学合理性等多条证据线,而非 χ² 本身。

五、经典论文与延伸阅读
[1] Pearson, K. (1900). On the criterion that a given system of deviations... Philosophical Magazine, 50(302), 157–175. χ² 检验的诞生。
[2] Fisher, R.A. (1922). On the interpretation of χ² from contingency tables... Journal of the Royal Statistical Society, 85(1), 87–94. 自由度修正。
[3] Yates, F. (1934). Contingency tables involving small numbers... Supplement to the Journal of the Royal Statistical Society, 1(2), 217–235.
[4] Cochran, W.G. (1954). Some methods for strengthening the common χ² tests. Biometrics, 10(4), 417–451.
[5] Mantel, N. & Haenszel, W. (1959). Statistical aspects of the analysis of data from retrospective studies of disease. JNCI, 22(4), 719–748. CMH 检验,被引 40000+。
[6] Doll, R. & Hill, A.B. (1950). Smoking and carcinoma of the lung. BMJ, 2(4682), 739–748. 吸烟-肺癌 χ² 分析的经典案例。
[7] Cohen, J. (1988). Statistical Power Analysis for the Behavioral Sciences (2nd ed.). Lawrence Erlbaum. 效应量基准 w = 0.1/0.3/0.5。
[8] Campbell, I. (2007). Chi-squared and Fisher–Irwin tests of two-by-two tables... Statistics in Medicine, 26(19), 3661–3675. 不推荐 Yates 校正的现代论证。
六、总结
卡方检验之所以能横跨 125 年仍稳坐双榜第一,不是因为复杂,恰恰是因为简单而深刻。它的核心思想——"比较观察与期望的偏差,判断是否超出随机波动的范围"——是所有统计推断的底层逻辑。
在生物医学研究中,无论是 GWAS 的等位基因关联分析、临床试验的终点比较,还是流行病学的剂量-反应趋势检验,χ² 及其扩展方法(CMH、Cochran-Armitage 趋势检验)都是不可或缺的工具。
📌 一句话记住卡方检验:它不是"证明差异存在",而是"排除随机解释"——当 p 值足够小时,我们说"观察到的关联不太可能完全由偶然因素产生"。
—— 系列第 1 篇完。下一篇:GAL4/UAS 系统:果蝇遗传学的瑞士军刀
评论 (0)
正文划词可点「问萝卜特」——自动发评论并由 AI 回复
加载评论中…