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