分类数据检验建立在计数上。开始前先查看列联表中的观测频数、比例和期望频数,再决定渐近卡方近似是否合适。
三个常见问题
| 类型 | 问题 | 例子 |
|---|---|---|
| 拟合优度 | 一个分类变量是否符合指定比例 | 骰子六面是否等概率 |
| 独立性 | 同一总体中的两个分类变量是否关联 | 吸烟与疾病是否关联 |
| 同质性 | 不同总体的类别分布是否相同 | 不同地区的偏好分布 |
独立性与同质性检验使用相同的 Pearson 卡方统计量,但抽样设计和解释不同。
Pearson 卡方统计量
其中 是观测频数, 是 下的期望频数。偏离越大,统计量越大。
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)
这些方法不是普通卡方检验的“高级版本”,而是针对不同抽样单位和依赖结构的问题。
报告结果
至少报告:
- 原始计数和有明确分母的比例;
- 检验类型及是否使用修正或模拟;
- 、自由度和 p 值,或 Fisher 检验结果;
- 关联效应量及置信区间;
- 稀疏单元格与类别合并的处理。
先理解表格,再选择检验。一个很小的 p 值不能弥补错误的独立性假设或含义不清的类别。