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