scipy.stats.

chi2_contingency#

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

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

此函数根据列联表 [1] observed 中观察到频率的独立性对 χ² 检验统计量和 p 值进行计算。基于边缘和独立性假设计算预期频率;参见 scipy.stats.contingency.expected_freq。自由度数为(使用 numpy 函数和属性表述)

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

列联表。该表包含各个类别中观察到的频率(即发生次数)。在二维情况下,表通常描述为“R x C 表”。

correctionbool,可选

如果为 True,且自由度为 1,应用 Yates 的连续修正。修正的效果是使每个观测值向相应期望值调整 0.5。

lambda_ float 或 str,可选项

默认情况下,此检验中计算的统计量是皮尔逊的卡方统计量 [2]lambda_ 允许使用来自 Cressie-Read 功率离散族 [3] 的统计量。有关详细信息,请参阅 scipy.stats.power_divergence

返回:
resChi2ContingencyResult

包含属性的对象

statisticfloat

检验统计量。

pvaluefloat

检验的 p 值。

dofint

自由度。

expected_freqndarray,与 observed 相同的形状

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

附注

这种计算有效性的经常被引用的准则是,只有当每个单元中的观测值和期望值至少为 5 时才能使用该检验。

这是用于检验总体不同类别的独立性的检验。仅当 observed 的维度为 2 或更多时,此检验才有意义。如果对一维表进行检验,observed 将始终等于 expected,而卡方统计量将始终等于 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.,“多项式拟合优度检验”,皇家统计学会 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 检验”)而不是皮尔森卡方统计量来执行检验。

>>> 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