跳到主要内容

χ² 检验

一、直观理解:类别计数与“理论应有”差了多少​

χ²(卡方)检验处理的是分类数据的频数。它把“每一格实际观察到的人数”和“如果某假设成立时理论上应有的人数”做比较:差得越系统,越不像巧合。

两个最常见版本:

  1. 拟合优度检验:一个分类变量的各水平比例,是否等于给定的理论比例?
    例如:骰子六点是否等概率。
  2. 独立性检验(列联表):两个分类变量是否有关联?
    例如:治疗方法(A/B)与是否痊愈(是/否)是否独立。

另外,在大样本下,许多似然比统计量也渐近服从 χ² 分布,因此卡方是分类数据推断的“通用度量衡”。

二、适用场景与优缺点​

类型说明
适用场景问卷选项、疾病有无、评级档位等分类变量;比较构成比;列联表关联分析;某些离散模型的拟合优度。
核心优点原理直观;不要求连续正态;crosstab + chi2cdf 或 fishertest 易实现;效应可用 Cramér’s V 等衡量。
局限与缺点渐近检验需要期望频数不要太小;只检测关联不检测因果;有序分类未利用顺序信息时功效可能偏低;2×2 小样本应优先精确检验。

使用前确认:

  1. 样本是否为独立观测(同一人多次计数会破坏假定);
  2. 单元格期望频数:经验上多数格子 ≥5\ge 5,否则合并类别或用 Fisher 精确检验;
  3. 是事前理论比例,还是从数据估计参数(估计参数会改变自由度);
  4. 需要的是显著性还是关联强度。

三、核心原理​

1. Pearson 卡方统计量​

对格子 i=1,…,ki=1,\ldots,k,观测频数 OiO_i,期望频数 EiE_i,

χ2=∑i=1k(Oi−Ei)2Ei\chi^2=\sum_{i=1}^{k}\frac{(O_i-E_i)^2}{E_i}

在 H0H_0 与大样本下,χ2∼˙χν2\chi^2\dot\sim\chi^2_{\nu}。

2. 拟合优度​

若 H0:H_0: 概率为 (p1,…,pk)(p_1,\ldots,p_k),则 Ei=npiE_i=np_i,自由度 ν=k−1\nu=k-1;若还估计了 rr 个参数,则 ν=k−1−r\nu=k-1-r。

3. 列联表独立性​

r×cr\times c 表中,行边际 RiR_i、列边际 CjC_j、总人数 nn,

Eij=RiCjnE_{ij}=\frac{R_i C_j}{n} χ2=∑i,j(Oij−Eij)2Eij,ν=(r−1)(c−1)\chi^2=\sum_{i,j}\frac{(O_{ij}-E_{ij})^2}{E_{ij}},\quad \nu=(r-1)(c-1)

H0:H_0: 行变量与列变量独立。

4. 连续性校正与似然比卡方​

2×2 表有时用 Yates 校正;似然比统计量

G2=2∑Oijlog⁡OijEijG^2=2\sum O_{ij}\log\frac{O_{ij}}{E_{ij}}

大样本下与 Pearson 卡方相近。

5. 关联强度​

卡方显著只说明“不像独立”。可报告

V=χ2n⋅min⁡(r−1,c−1)V=\sqrt{\frac{\chi^2}{n\cdot\min(r-1,c-1)}}

(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 值。

六、如何解释结果​

  1. 列表给出观测频数与期望频数;
  2. 报告 χ2\chi^2、自由度、p 值;
  3. 给出关联强度(V 或差值比例);
  4. 说明是否满足期望频数条件,必要时报告 Fisher 结果;
  5. 用百分比解释实际差异,例如“A 有效率 80%,B 有效率 60%”;
  6. 明确:关联≠因果,除非设计支持因果解释。

七、常见误区​

1. 对百分比做卡方​

卡方的输入必须是频数,不是比例;若只有比例,需还原为人数。

2. 期望频数过小仍用大样本卡方​

p 值可能严重失真。

3. 把“不显著”写成“两变量独立已证实”​

只是证据不足,尤其当样本量小时。

4. 忽略配对结构​

前后对照的二分数据误用独立样本卡方会得出错误结论。

5. 只报 p 不报效应​

大样本下微弱关联也会显著,必须报告率差或 V。

八、小结​

χ² 检验的核心是:

用 ∑(O−E)2/E\sum(O-E)^2/E 衡量类别计数与理论期望的整体偏差。

它是分类数据的入门与主力工具。用好它要盯住期望频数、选对检验类型(拟合优度/独立/McNemar),并同时报告关联强度与实际百分比差异。