scipy.stats.contingency.

chi2_contingency#

scipy.stats.contingency.chi2_contingency(observed, correction=True, lambda_=None)[source]#

列联表中变量独立性的卡方检验。

此函数计算卡方统计量和 p 值,用于检验列联表 [1] observed 中观察到的频率是否独立。期望频率是根据边际总和计算的,假设独立;参见 scipy.stats.contingency.expected_freq。自由度为(使用 numpy 函数和属性表示)

dof = observed.size - sum(observed.shape) + observed.ndim - 1
参数::
observedarray_like

列联表。该表包含每个类别中观察到的频率(即出现次数)。在二维情况下,该表通常被称为“R x C 表”。

correctionbool, optional

如果为 True,并且自由度为 1,则应用 Yates 连续性校正。校正的效果是将每个观察值调整 0.5 到对应的期望值。

lambda_float or str, optional

默认情况下,此测试中计算的统计量是 Pearson 卡方统计量 [2]lambda_ 允许使用来自 Cressie-Read 幂散度族 [3] 的统计量代替。有关详细信息,请参见 scipy.stats.power_divergence

返回值::
resChi2ContingencyResult

包含以下属性的对象

statisticfloat

检验统计量。

pvaluefloat

检验的 p 值。

dofint

自由度。

expected_freqndarray, same shape as observed

期望频率,基于表的边际总和。

注释

关于此计算有效性的一个经常被引用的指导方针是,该检验仅应在每个单元格中的观察频率和期望频率至少为 5 时使用。

这是一个用于检验种群中不同类别的独立性检验。该检验只有在 observed 的维度为两个或更多时才有意义。将该检验应用于一维表将始终导致 expected 等于 observed,并且卡方统计量等于 0。

此函数不处理掩码数组,因为计算在存在缺失值时没有意义。

scipy.stats.chisquare 一样,此函数计算卡方统计量;此函数提供的便利之处是从给定的列联表中找出期望频率和自由度。如果这些已经知道,并且不需要 Yates 校正,可以使用 scipy.stats.chisquare。也就是说,如果调用

res = chi2_contingency(obs, correction=False)

那么以下为真

(res.statistic, res.pvalue) == stats.chisquare(obs.ravel(),
                                               f_exp=ex.ravel(),
                                               ddof=obs.size - 1 - dof)

lambda_ 参数在 scipy 的 0.13.0 版本中添加。

参考文献

[3]

Cressie, N. 和 Read, T. R. C.,“多项式拟合优度检验”,J. Royal Stat. Soc. Series B,第 46 卷,第 3 期(1984 年),第 440-464 页。

[4]

Berger, Jeffrey S. 等人。“阿司匹林用于女性和男性的心血管事件的一级预防:随机对照试验的性别特异性荟萃分析。” JAMA, 295(3):306-313, DOI:10.1001/jama.295.3.306,2006 年。

示例

[4] 中,研究了使用阿司匹林预防女性和男性心血管事件。这项研究得出的结论是

…阿司匹林治疗通过降低女性缺血性中风的风险而降低了心血管事件复合指标的风险……

这篇文章列出了各种心血管事件的研究。让我们关注女性的缺血性中风。

下表总结了实验结果,在实验中,参与者定期服用阿司匹林或安慰剂多年。记录了缺血性中风病例

                  Aspirin   Control/Placebo
Ischemic stroke     176           230
No stroke         21035         21018

有证据表明阿司匹林可以降低缺血性中风的风险吗?我们首先制定一个零假设 \(H_0\)

阿司匹林的效果等同于安慰剂的效果。

让我们用卡方检验评估一下这个假设的可信度。

>>> import numpy as np
>>> from scipy.stats import chi2_contingency
>>> table = np.array([[176, 230], [21035, 21018]])
>>> res = chi2_contingency(table)
>>> res.statistic
6.892569132546561
>>> res.pvalue
0.008655478161175739

使用 5% 的显著性水平,我们将拒绝零假设,而支持备择假设:“阿司匹林的效果不等同于安慰剂的效果”。因为 scipy.stats.contingency.chi2_contingency 执行双边检验,备择假设没有说明效果的方向。我们可以使用 stats.contingency.odds_ratio 来支持阿司匹林降低缺血性中风风险的结论。

下面是一些进一步的例子,展示了如何检验更大的列联表。

一个双向示例 (2 x 3)

>>> obs = np.array([[10, 10, 20], [20, 20, 20]])
>>> res = chi2_contingency(obs)
>>> res.statistic
2.7777777777777777
>>> res.pvalue
0.24935220877729619
>>> res.dof
2
>>> res.expected_freq
array([[ 12.,  12.,  16.],
       [ 18.,  18.,  24.]])

使用对数似然比(即“G 检验”)而不是 Pearson 的卡方统计量执行检验。

>>> res = chi2_contingency(obs, lambda_="log-likelihood")
>>> res.statistic
2.7688587616781319
>>> res.pvalue
0.25046668010954165

一个四向示例 (2 x 2 x 2 x 2)

>>> obs = np.array(
...     [[[[12, 17],
...        [11, 16]],
...       [[11, 12],
...        [15, 16]]],
...      [[[23, 15],
...        [30, 22]],
...       [[14, 17],
...        [15, 16]]]])
>>> res = chi2_contingency(obs)
>>> res.statistic
8.7584514426741897
>>> res.pvalue
0.64417725029295503