Skip to content

R - 卡方检验

卡方(χ²)独立性检验是一种统计假设检验,用于确定两个分类变量之间是否存在显著关联。例如,你可以用它来检验一个人的冰淇淋口味(一个分类变量)与他们的性别(另一个分类变量)之间是否存在关系。这些变量应来源于同一总体。

该检验通过比较列联表中的观测频率(observed frequencies)与在变量之间没有关联时所期望的频率(expected frequencies)来工作。

核心函数是 chisq.test()。它通常应用于列联表(一个矩阵或表格对象)。

chisq.test(table_object)
  • table_object:一个包含分类变量频率计数的列联表。

我们将使用内置的 Cars93 数据集(来自 MASS 包)来调查汽车的类型(例如,紧凑型、运动型)与其安全气囊类型之间是否存在关系。

假设:

  • 零假设(H₀):汽车类型和安全气囊之间没有关联(它们是独立的)。
  • 备择假设(H₁):汽车类型和安全气囊之间存在关联(它们是相关的)。
# 加载用于数据集的 MASS 包
library(MASS)
# 1. 创建观测频率的列联表
# 我们为此使用 table() 函数。
car_table <- table(Cars93$Type, Cars93$AirBags)
# 打印表格以查看观测计数
print(car_table)
# 2. 执行卡方检验
chi_test_result <- chisq.test(car_table)
# 打印完整的测试结果
print(chi_test_result)

执行代码会产生以下输出:

# 列联表
Driver & Passenger Driver only None
Compact 2 9 5
Large 4 7 0
Midsize 7 11 4
Small 0 5 16
Sporty 3 8 3
Van 0 3 6
# 检验结果
Pearson's Chi-squared test
data: car_table
X-squared = 33.001, df = 10, p-value = 0.0002723
Warning message:
In chisq.test(car_table) : Chi-squared approximation may be incorrect
  • X-squared = 33.001:这是检验统计量。值越大表示观测频率与期望频率之间的差异越大。
  • df = 10:自由度,计算方法为 (行数 - 1) * (列数 - 1) = (6 - 1) * (3 - 1) = 10。
  • p-value = 0.0002723:这是在零假设为真时,观察到如此极端(或更极端)的检验统计量 33.001 的概率。由于这个 p 值非常小(通常小于 0.05 的显著性水平),我们拒绝零假设。我们得出结论,汽车类型及其安全气囊配置之间存在统计上显著的关联。

当表格中某些单元格的期望计数较低时(常见规则是任何期望计数小于 5),会出现警告 Chi-squared approximation may be incorrect。卡方检验依赖于近似,在小样本情况下准确性较低。你可以这样查看期望计数:

# 检查期望频率
print(chi_test_result$expected)

当你看到这个警告时,你有两种更好的替代方案:

  1. 费舍尔精确检验(Fisher’s Exact Test):它计算精确的 p 值,适用于小样本量。语法非常相似。
  2. 蒙特卡罗模拟(Monte Carlo Simulation):你可以指示 chisq.test 模拟 p 值,这在低计数情况下也更可靠。
# 替代方案 1:费舍尔精确检验(推荐用于小表格)
fisher.test(car_table)
# 替代方案 2:使用模拟 p 值的卡方检验
chisq.test(car_table, simulate.p.value = TRUE, B = 10000) # B 是模拟次数