09分类数据的卡方与精确检验

区分拟合优度、独立性和同质性检验,并根据期望频数、配对与分层结构选择卡方、Fisher 或其他方法。

2025-07-30
StatisticsChi Squared TestFisher Exact TestCategorical Data
本章目录 · 9

分类数据检验建立在计数上。开始前先查看列联表中的观测频数、比例和期望频数,再决定渐近卡方近似是否合适。

三个常见问题

类型 问题 例子
拟合优度 一个分类变量是否符合指定比例 骰子六面是否等概率
独立性 同一总体中的两个分类变量是否关联 吸烟与疾病是否关联
同质性 不同总体的类别分布是否相同 不同地区的偏好分布

独立性与同质性检验使用相同的 Pearson 卡方统计量,但抽样设计和解释不同。

Pearson 卡方统计量

χ2=(OE)2E\chi^2 = \sum \frac{(O-E)^2}{E}

其中 OO 是观测频数,EEH0H_0 下的期望频数。偏离越大,统计量越大。

tab <- matrix(
  c(35, 15, 20, 30),
  nrow = 2,
  dimnames = list(
    exposure = c("Yes", "No"),
    outcome = c("Case", "Control")
  )
)

fit <- chisq.test(tab)
fit
fit$expected
fit$residuals

显著结果说明变量并非独立,却不说明关联强度或哪些单元格主导差异。应同时报告列联表比例、残差或效应量。

拟合优度

observed <- c(18, 17, 16, 20, 14, 15)

chisq.test(
  observed,
  p = rep(1 / 6, 6)
)

p 给出零假设下各类别概率,和必须为 1。

近似何时不可靠

Pearson 卡方检验使用渐近参考分布。期望频数过低、样本很小或表格极度稀疏时,实际 I 型错误率可能偏离设定值。

不要只看总样本量,应检查每个单元格的期望频数:

fit$expected

可能的处理包括:

  • 根据事先合理的业务含义合并稀疏类别;
  • 对小型列联表使用 Fisher 精确检验;
  • 使用 Monte Carlo 模拟 p 值;
  • 使用适合稀疏数据的模型。

不能为了获得显著性而事后随意合并类别。

Fisher 精确检验

sparse <- matrix(
  c(1, 9, 11, 3),
  nrow = 2,
  dimnames = list(
    group = c("Drug", "Placebo"),
    result = c("Event", "No event")
  )
)

fisher.test(sparse)

Fisher 检验在固定边际下计算精确概率,特别适合稀疏的 2×2 表。可以同时报告优势比及其置信区间。

Monte Carlo 卡方检验

表格较大而精确枚举困难时,可以模拟零假设下的表:

chisq.test(tab, simulate.p.value = TRUE, B = 10000)

模拟结果有 Monte Carlo 误差,应设置随机种子并报告模拟次数。

连续性修正

R 对 2×2 Pearson 卡方检验默认使用 Yates 连续性修正:

chisq.test(tab)
chisq.test(tab, correct = FALSE)

修正通常更保守。是否使用应按分析方案和领域惯例决定,而不是比较两个 p 值后选择较小者。

配对、重复和分层数据

普通卡方独立性检验要求观测独立。设计不同,应使用对应方法:

数据结构 方法
同一对象前后两次二分类测量 McNemar 检验
同一对象三个以上二分类条件 Cochran's Q
按层控制一个分类混杂因素 Mantel–Haenszel 检验
有序暴露水平与二分类结局 趋势检验

McNemar 检验示例:

paired <- matrix(c(30, 10, 4, 36), nrow = 2)
mcnemar.test(paired)

分层 2×2 表可以使用:

mantelhaen.test(array_2x2xk)

这些方法不是普通卡方检验的“高级版本”,而是针对不同抽样单位和依赖结构的问题。

报告结果

至少报告:

  • 原始计数和有明确分母的比例;
  • 检验类型及是否使用修正或模拟;
  • χ2\chi^2、自由度和 p 值,或 Fisher 检验结果;
  • 关联效应量及置信区间;
  • 稀疏单元格与类别合并的处理。

先理解表格,再选择检验。一个很小的 p 值不能弥补错误的独立性假设或含义不清的类别。