χ² 检验
一、直观理解:类别计数与“理论应有”差了多少
χ²(卡方)检验处理的是分类数据的频数。它把“每一格实际观察到的人数”和“如果某假设成立时理论上应有的人数”做比较:差得越系统,越不像巧合。
两个最常见版本:
- 拟合优度检验:一个分类变量的各水平比例,是否等于给定的理论比例?
例如:骰子六点是否等概率。 - 独立性检验(列联表):两个分类变量是否有关联?
例如:治疗方法(A/B)与是否痊愈(是/否)是否独立。
另外,在大样本下,许多似然比统计量也渐近服从 χ² 分布,因此卡方是分类数据推断的“通用度量衡”。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 问卷选项、疾病有无、评级档位等分类变量;比较构成比;列联表关联分析;某些离散模型的拟合优度。 |
| 核心优点 | 原理直观;不要求连续正态;crosstab + chi2cdf 或 fishertest 易实现;效应可用 Cramér’s V 等衡量。 |
| 局限与缺点 | 渐近检验需要期望频数不要太小;只检测关联不检测因果;有序分类未利用顺序信息时功效可能偏低;2×2 小样本应优先精确检验。 |
使用前确认:
- 样本是否为独立观测(同一人多次计数会破坏假定);
- 单元格期望频数:经验上多数格子 ,否则合并类别或用 Fisher 精确检验;
- 是事前理论比例,还是从数据估计参数(估计参数会改变自由度);
- 需要的是显著性还是关联强度。
三、核心原理
1. Pearson 卡方统计量
对格子 ,观测频数 ,期望频数 ,
在 与大样本下,。
2. 拟合优度
若 概率为 ,则 ,自由度 ;若还估计了 个参数,则 。
3. 列联表独立性
表中,行边际 、列边际 、总人数 ,
行变量与列变量独立。
4. 连续性校正与似然比卡方
2×2 表有时用 Yates 校正;似然比统计量
大样本下与 Pearson 卡方相近。
5. 关联强度
卡方显著只说明“不像独立”。可报告
(Cramér’s V),取值越大关联越强。
四、关键决策
1. 期望频数过小
- 合并稀有类别(需有实际意义);
- 2×2 用
fishertest; - 更大表用蒙特卡洛精确检验。
2. 有序分类
若变量有序(如病情轻/中/重),线性趋势检验或秩相关可能比普通独立性卡方更敏感。
3. 配对二分数据
同一对象前后的“是/否”变化,应用 McNemar 检验,而不是普通 2×2 独立卡方。
4. 多重格子比较
事后两两比较要控制多重性,或改用对数线性模型统一建模。
五、MATLAB 示例
% ---- 1) 拟合优度:骰子是否公平 ----
% 观测 60 次,六点频数
O = [8 12 9 11 7 13];
n = sum(O);
E = n / 6 * ones(size(O));
chi2 = sum((O - E).^2 ./ E);
df = 5;
p = 1 - chi2cdf(chi2, df);
fprintf("GoF chi2=%.3f, df=%d, p=%.4g\n", chi2, df, p);
% ---- 2) 列联表独立性 ----
% 有效 无效
% 疗法A 40 10
% 疗法B 30 20
Table = [40 10; 30 20];
[p2, chi2stat] = chi2cont(Table); % 若无此函数则手算
% 手算:
row = sum(Table, 2); col = sum(Table, 1); N = sum(Table, "all");
E2 = row * col / N;
chi2_2 = sum((Table - E2).^2 ./ E2, "all");
df2 = 1;
p_hand = 1 - chi2cdf(chi2_2, df2);
fprintf("独立性 chi2=%.3f, p=%.4g\n", chi2_2, p_hand);
% Cramér's V
V = sqrt(chi2_2 / (N * 1));
fprintf("Cramer's V = %.3f\n", V);
% ---- 3) 2×2 小样本:Fisher 精确检验 ----
Tsmall = [8 2; 1 7];
[~, p_f] = fishertest(Tsmall);
fprintf("Fisher p = %.4g\n", p_f);
% ---- 4) 用 crosstab 从原始数据构造 ----
drug = [repmat("A",50,1); repmat("B",50,1)];
cure = [repmat("Y",40,1); repmat("N",10,1); repmat("Y",30,1); repmat("N",20,1)];
[tbl, ~, ~, labels] = crosstab(drug, cure);
disp(labels);
disp(tbl);
说明:若当前工具箱没有 chi2cont,用上面手算即可;Statistics Toolbox 中也可用 crosstab 配合自行计算 p 值。
六、如何解释结果
- 列表给出观测频数与期望频数;
- 报告 、自由度、p 值;
- 给出关联强度(V 或差值比例);
- 说明是否满足期望频数条件,必要时报告 Fisher 结果;
- 用百分比解释实际差异,例如“A 有效率 80%,B 有效率 60%”;
- 明确:关联≠因果,除非设计支持因果解释。
七、常见误区
1. 对百分比做卡方
卡方的输入必须是频数,不是比例;若只有比例,需还原为人数。
2. 期望频数过小仍用大样本卡方
p 值可能严重失真。
3. 把“不显著”写成“两变量独立已证实”
只是证据不足,尤其当样本量小时。
4. 忽略配对结构
前后对照的二分数据误用独立样本卡方会得出错误结论。
5. 只报 p 不报效应
大样本下微弱关联也会显著,必须报告率差或 V。
八、小结
χ² 检验的核心是:
用 衡量类别计数与理论期望的整体偏差。
它是分类数据的入门与主力工具。用好它要盯住期望频数、选对检验类型(拟合优度/独立/McNemar),并同时报告关联强度与实际百分比差异。