← 返回内容列表

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

分享本文
卡方检验深度解析:从 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 回复

加载评论中…