scipy.stats.

chi2_contingency#

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

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

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

dof = observed.size - sum(observed.shape) + observed.ndim - 1
参数:
观察到的array_like

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

修正bool, 可选

如果为真,*并且*自由度为1,则应用耶茨的连续性校正。校正的效果是将每个观察值向相应的期望值调整0.5。

lambda_浮点数或字符串,可选

默认情况下,此测试中计算的统计量是皮尔逊卡方统计量 [2]lambda_ 允许使用来自 Cressie-Read 幂散度家族 [3] 的统计量。详情请参阅 scipy.stats.power_divergence

返回:
resChi2ContingencyResult

一个包含属性的对象:

统计浮动

测试统计量。

p值浮动

测试的 p 值。

自由度整数

自由度。

expected_freq : ndarray, 形状与 observed 相同ndarray,形状相同

基于表格的边缘和的预期频率。

注释

一个经常被引用的关于此计算有效性的指导原则是,只有当每个单元格中的观察频数和期望频数至少为5时,才应使用该检验。

这是对一个群体中不同类别独立性的测试。只有当 observed 的维度为两个或更多时,测试才有意义。将测试应用于一维表时,总会导致 expected 等于 observed,并且卡方统计量等于 0。

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

类似于 scipy.stats.chisquare,此函数计算卡方统计量;此函数提供的便利之处在于,它可以根据给定的列联表计算出期望频数和自由度。如果这些已经知道,并且不需要耶茨校正,则可以使用 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, Vol. 46, No. 3 (1984), pp. 440-464.

[4]

Berger, Jeffrey S. 等人。“阿司匹林用于男性和女性心血管事件的一级预防:一项性别特异性随机对照试验的荟萃分析。”《美国医学会杂志》,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