scipy.stats.mstats.

chisquare#

scipy.stats.mstats.chisquare(f_obs, f_exp=None, ddof=0, axis=0)[源代码]#

计算一个单向卡方检验。

卡方检验检验原假设:分类数据具有给定的频率。

参数:
f_obs类数组

每类中的观测频率。

f_exp类数组,可选

每类的预期频率。默认情况下,类别被认为是可能性相同。

ddof整数,可选

“自由度增量”:对 p 值的自由度进行调整。p 值使用卡方分布计算,其中自由度为 k - 1 - ddof,其中 k 是观测频率的数量。ddof 的默认值为 0。

axis整数或无,可选

广播结果的轴 f_obsf_exp 沿着该轴应用该测试。如果 axis 为 None,则 f_obs 中的所有值都被视为单个数据集。默认值为 0。

返回:
res: Power_divergenceResult

一个包含属性的对象

statisticfloat 或 ndarray

卡方检验统计量。如果 axis 为 None 或者 f_obsf_exp 为 1-D,则该值为浮点数。

pvaluefloat 或 ndarray

测试的 p 值。如果 ddof 和结果属性 statistic 为标量,则该值为浮点数。

另请参阅

scipy.stats.power_divergence
scipy.stats.fisher_exact

2x2 列联表上的 Fisher 精确检验。

scipy.stats.barnard_exact

一个无条件的精确检验。小样本量对于卡方检验的替代方案。

注释

当每次类别中观察到的频率或期望频率过低时,此测试无效。一个典型的规则是所有观察到的频率和期望频率应至少为 5。根据 [3] 的建议,样本总数应大于 13,否则应使用精确检验(例如 Barnard 精确检验),因为它们不会过度拒绝。

此外,测试有效时观察到的频率和期望频率的总和必须相同;如果总和不符合 1e-8 的相对公差,则 chisquare 会引发错误。

如果没有估计分布的任何参数,自由度默认为 k-1。如果通过有效极大似然估计 p 个参数,则正确的自由度为 k-1-p。如果以不同的方式估计这些参数,则自由度可以在 k-1-p 和 k-1 之间。但是,渐近分布也可能不是卡方分布,在这种情况下,此检验不合适。

参考文献

[1]

Lowry, Richard。“推论统计的概念和应用”。第 8 章。 https://web.archive.org/web/20171022032306/http://vassarstats.net:80/textbook/ch8pt1.html

[3]

皮尔逊,卡尔。“关于相关系统变量中给定偏差系统满足以下条件的准则,即可以合理地认为它源于随机抽样”。《哲学杂志》第 5 系列,第 50 卷(1900 年),第 157-175 页。

[4]

曼南,R. 威廉和 E. 查尔斯。梅斯洛。“东北俄勒冈州经营和原生林中的鸟类种群和植被特征”。《野生动物管理杂志》第 48 卷,第 1219-1238 页,DOI: 10.2307/3801783,1984 年。

示例

[4] 中,在俄勒冈州的一个原生林中研究了鸟类觅食行为。在这片森林中,44% 的林冠体积是道格拉斯冷杉,24% 是庞德罗莎松,29% 是大冷杉,3% 是西部落叶松。作者观察了几种鸟类的行为,其中之一是红胸啄木鸟。他们对该物种觅食行为进行了 189 次观察,记录了道格拉斯冷杉中 43 次(“23%”)观察、庞德罗莎松中 52 次(“28%”)观察、大冷杉中 54 次(“29%”)观察以及西部落叶松中 40 次(“21%”)观察。

使用卡方检验,我们可以检验觅食事件的比例等于林冠体积的比例的原假设。该论文的作者认为,小于 1% 的 p 值是有意义的。

使用上述林冠体积比例和观察到的事件,我们可以推断出预期频率。

>>> import numpy as np
>>> f_exp = np.array([44, 24, 29, 3]) / 100 * 189

觅食观察到的频率为

>>> f_obs = np.array([43, 52, 54, 40])

现在我们可以将观察到的频率与预期频率进行比较。

>>> from scipy.stats import chisquare
>>> chisquare(f_obs=f_obs, f_exp=f_exp)
Power_divergenceResult(statistic=228.23515947653874, pvalue=3.3295585338846486e-49)

p 值远低于选择的显著性水平。因此,作者认为这个差异是有意义的,并得出结论:觅食事件的相对比例与树冠体积的相对比例不同。

以下是其他通用示例,展示了如何使用其他参数。

当仅给出 f_obs 时,假定预期频率是均匀的,并且由观察到的频率的平均值给出。

>>> chisquare([16, 18, 16, 14, 12, 12])
Power_divergenceResult(statistic=2.0, pvalue=0.84914503608460956)

通过 f_exp 可以给出预期频率。

>>> chisquare([16, 18, 16, 14, 12, 12], f_exp=[16, 16, 16, 16, 16, 8])
Power_divergenceResult(statistic=3.5, pvalue=0.62338762774958223)

f_obs 是 2-D 时,默认情况下,该检验适用于每一列。

>>> obs = np.array([[16, 18, 16, 14, 12, 12], [32, 24, 16, 28, 20, 24]]).T
>>> obs.shape
(6, 2)
>>> chisquare(obs)
Power_divergenceResult(statistic=array([2.        , 6.66666667]), pvalue=array([0.84914504, 0.24663415]))

通过设置 axis=None,该检验适用于数组中的所有数据,这等同于将该检验应用于展平的数组。

>>> chisquare(obs, axis=None)
Power_divergenceResult(statistic=23.31034482758621, pvalue=0.015975692534127565)
>>> chisquare(obs.ravel())
Power_divergenceResult(statistic=23.310344827586206, pvalue=0.01597569253412758)

ddof 是对自由度默认值所做的更改。

>>> chisquare([16, 18, 16, 14, 12, 12], ddof=1)
Power_divergenceResult(statistic=2.0, pvalue=0.7357588823428847)

p 值的计算是由卡方统计量与 ddof 进行广播来完成的。

>>> chisquare([16, 18, 16, 14, 12, 12], ddof=[0,1,2])
Power_divergenceResult(statistic=2.0, pvalue=array([0.84914504, 0.73575888, 0.5724067 ]))

f_obsf_exp 也广播。在以下内容中,f_obs 的形状为 (6,),f_exp 的形状为 (2, 6),因此广播 f_obsf_exp 的结果的形状为 (2, 6)。要计算所需的卡方统计量,我们将使用 axis=1

>>> chisquare([16, 18, 16, 14, 12, 12],
...           f_exp=[[16, 16, 16, 16, 16, 8], [8, 20, 20, 16, 12, 12]],
...           axis=1)
Power_divergenceResult(statistic=array([3.5 , 9.25]), pvalue=array([0.62338763, 0.09949846]))