Chapter 10

卡方检验

分类变量的统计推断:从拟合优度到独立性检验

01

核心概念

卡方分布

卡方分布(Chi-Square Distribution)是一族只取非负值的右偏连续分布,由自由度 df 唯一确定。若 Z₁, Z₂, ..., Zₖ 是独立的标准正态变量,则:

χ² = Z₁² + Z₂² + ... + Zₖ² ~ χ²(k)

卡方分布的均值等于自由度 df,方差等于 2df。随着自由度增大,分布逐渐对称并趋近正态分布。

洞察:为什么卡方检验用 χ² 分布?

卡方统计量本质上是标准化离差平方和的分布。当样本量足够大时,根据中心极限定理,观测频数与期望频数的标准化差异平方和服从卡方分布。这使得我们可以用 χ² 分布来计算 P 值,做出统计决策。

拟合优度检验

拟合优度检验(Goodness of Fit Test)用于判断观测数据的分布是否与某一理论分布相符。检验统计量为:

χ² = Σ (Oᵢ − Eᵢ)² / Eᵢ

其中 Oᵢ 为第 i 类的观测频数,Eᵢ 为第 i 类的期望频数(基于原假设的理论分布)。自由度 df = k − 1 − m,k 为类别数,m 为从数据中估计的参数个数。

独立性检验与列联表

独立性检验判断两个分类变量是否相互独立。数据通常以列联表(Contingency Table)形式呈现:

类别 B₁类别 B₂...行合计
类别 A₁O₁₁O₁₂...R₁
类别 A₂O₂₁O₂₂...R₂
列合计C₁C₂...N

若变量 A 与 B 独立,则期望频数 Eᵢⱼ = (Rᵢ × Cⱼ) / N。检验统计量仍为 χ² = Σ (O−E)² / E,自由度 df = (行数−1) × (列数−1)。

关键提醒:期望频数不宜过小

卡方检验要求每个单元格的期望频数 Eᵢ 一般不小于 5。若存在期望频数过小的单元格,可合并相邻类别,或使用 Fisher 精确检验替代。

自由度与查表判断

自由度反映了可以自由变化的单元格数量。对于 r × c 列联表,df = (r−1)(c−1)。计算出 χ² 统计量后,与临界值比较或计算 P 值:

工程应用

产品偏好调查:检验消费者对不同口味的偏好是否符合均匀分布。
医学分类变量关联:分析吸烟与肺癌是否独立。
骰子公平性检验:验证六面骰各面出现概率是否均为 1/6。
基因型分布检验:判断实验群体的基因型是否符合孟德尔遗传定律。

02

计算方法

卡方统计量计算步骤

  1. 建立原假设 H₀(如:分布符合某理论,或两变量独立)。
  2. 根据 H₀ 计算每类的期望频数 Eᵢ。
  3. 计算 χ² = Σ (Oᵢ − Eᵢ)² / Eᵢ。
  4. 确定自由度 df,查卡方分布表得临界值,或计算 P 值。
  5. 做出统计决策:拒绝或不拒绝 H₀。

期望频数计算

拟合优度:若 H₀ 为均匀分布,Eᵢ = N / k;若为其他比例,Eᵢ = N × pᵢ。

独立性检验:Eᵢⱼ = (第 i 行合计 × 第 j 列合计) / 总样本量 N。

查表与 P 值

常用临界值(α = 0.05):

df123456
χ²₀.₀₅3.845.997.819.4911.0712.59

计算出的 χ² 大于临界值即拒绝 H₀。实际应用中更常用软件直接输出 P 值。

03

例题

例题 10.1 · 拟合优度检验(骰子公平性)

一枚六面骰投掷 120 次,各面出现次数为:18, 22, 17, 25, 20, 18。在 α = 0.05 下检验骰子是否公平。

解答

H₀:骰子公平,每面概率 p = 1/6;H₁:骰子不公平。

期望频数 Eᵢ = 120 / 6 = 20(每类相同)。

χ² = (18−20)²/20 + (22−20)²/20 + (17−20)²/20 + (25−20)²/20 + (20−20)²/20 + (18−20)²/20

= 4/20 + 4/20 + 9/20 + 25/20 + 0 + 4/20 = 46/20 = 2.30。

df = 6 − 1 = 5,查表得 χ²₀.₀₅(5) = 11.07。

结论:χ² = 2.30 < 11.07,P > 0.05,不拒绝 H₀。没有充分证据表明骰子不公平。
例题 10.2 · 独立性检验

调查 200 名用户对两款产品 A 和 B 的偏好,按性别分类如下表。检验性别与产品偏好是否独立(α = 0.05)。

偏好 A偏好 B合计
男性5545100
女性3565100
合计90110200
解答

H₀:性别与偏好独立;H₁:两者有关联。

期望频数:

E₁₁ = (100×90)/200 = 45,E₁₂ = (100×110)/200 = 55

E₂₁ = (100×90)/200 = 45,E₂₂ = (100×110)/200 = 55

χ² = (55−45)²/45 + (45−55)²/55 + (35−45)²/45 + (65−55)²/55

= 100/45 + 100/55 + 100/45 + 100/55 ≈ 2.22 + 1.82 + 2.22 + 1.82 = 8.08。

df = (2−1)(2−1) = 1,χ²₀.₀₅(1) = 3.84。

结论:χ² = 8.08 > 3.84,P < 0.05,拒绝 H₀。性别与产品偏好存在显著关联。
例题 10.3 · 列联表分析(医学数据)

某医院研究某种治疗方案对不同年龄段患者的疗效,数据如下。检验疗效与年龄是否独立(α = 0.05)。

有效无效合计
青年401050
中年351550
老年252550
合计10050150
解答

H₀:疗效与年龄独立;H₁:有关联。

期望频数 Eᵢⱼ = (行合计 × 列合计) / 150:

E₁₁ = 50×100/150 = 33.33,E₁₂ = 50×50/150 = 16.67

E₂₁ = 33.33,E₂₂ = 16.67,E₃₁ = 33.33,E₃₂ = 16.67

χ² = (40−33.33)²/33.33 + (10−16.67)²/16.67 + (35−33.33)²/33.33 + (15−16.67)²/16.67 + (25−33.33)²/33.33 + (25−16.67)²/16.67

≈ 1.33 + 2.67 + 0.08 + 0.17 + 2.08 + 4.17 = 10.50。

df = (3−1)(2−1) = 2,χ²₀.₀₅(2) = 5.99。

结论:χ² = 10.50 > 5.99,拒绝 H₀。疗效与年龄显著相关,老年组的有效率明显低于青年和中年组。
例题 10.4 · 基因型分布检验

根据孟德尔遗传定律,某植物的三种基因型 AA、Aa、aa 的理论比例应为 1:2:1。现观察 200 株,计数分别为 45、105、50。检验实际分布是否符合理论比例(α = 0.05)。

解答

H₀:比例为 1:2:1,即 p(AA)=0.25, p(Aa)=0.50, p(aa)=0.25。

期望频数:E₁ = 200×0.25 = 50,E₂ = 200×0.50 = 100,E₃ = 200×0.25 = 50。

χ² = (45−50)²/50 + (105−100)²/100 + (50−50)²/50 = 25/50 + 25/100 + 0 = 0.50 + 0.25 = 0.75。

df = 3 − 1 = 2,χ²₀.₀₅(2) = 5.99。

结论:χ² = 0.75 < 5.99,不拒绝 H₀。观测数据与孟德尔定律无显著偏离。
04

MATLAB 实践

MATLAB 的统计工具箱提供了 chi2gofcrosstab 函数,可快速完成卡方检验。以下代码分别演示拟合优度检验、独立性检验以及卡方分布可视化。

MATLAB 代码:卡方检验与分布可视化
% ========== 1. 拟合优度检验:骰子公平性 ========== observed = [18, 22, 17, 25, 20, 18]; expected = [20, 20, 20, 20, 20, 20]; chi2_stat = sum((observed - expected).^2 ./ expected); df = length(observed) - 1; p_value = 1 - chi2cdf(chi2_stat, df); fprintf('骰子检验: χ² = %.4f, df = %d, P = %.4f\n', chi2_stat, df, p_value); % ========== 2. 独立性检验:crosstab ========== gender = [repmat(1,1,100), repmat(2,1,100)]; pref = [repmat(1,1,55), repmat(2,1,45), ... repmat(1,1,35), repmat(2,1,65)]; [table, chi2, p, labels] = crosstab(gender, pref); fprintf('独立性检验: χ² = %.4f, P = %.4f\n', chi2, p); disp('列联表:'); disp(table); % ========== 3. 卡方分布可视化 ========== figure('Color','w','Position',[100 100 800 350]); x = linspace(0, 20, 500); hold on; for df_val = [1, 2, 5, 10] y = chi2pdf(x, df_val); plot(x, y, 'LineWidth', 2, 'DisplayName', sprintf('df = %d', df_val)); end xlabel('χ²'); ylabel('概率密度'); title('卡方分布(不同自由度)'); legend('show', 'Location', 'best'); grid on;

运行结果:

MATLAB 输出
骰子检验: χ² = 2.3000, df = 5, P = 0.8067 独立性检验: χ² = 8.0808, P = 0.0045 列联表: 55 45 35 65

chi2gof 可进行更复杂的分布拟合检验(如正态性检验),crosstab 直接返回列联表与卡方统计量。chi2pdfchi2cdf 分别用于计算卡方分布的 PDF 和 CDF,是构建自定义检验的基础。

← 上一章:相关与回归 下一章:贝叶斯统计 →