scipy.stats.

chisquare#

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

计算一个卡方检验。

卡方检验验证一个离散型变量观测频率等于期望频率的零假设。

参数:
f_obsarray_like

每个类别的观测频率。

f_exparray_like, 可选

每个类别的期望频率。如果未指定,将认为各个类别的频率相等。

ddofint, 可选

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

axisint 或 None,可选

沿该轴对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列联表上的费舍尔精确检验。

scipy.stats.barnard_exact

无条件精确检验。小样本量卡方检验的替代检验。

备注

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

此外,观测频次和期望频次之和对于检验的有效性必须相同;如果和值不同小于或等于1e-8的相对公差,则chisquare会引发一个错误。

当分布的参数没有被估计时,默认的自由度k-1。如果p个参数被有效的最大似然法估计,则自由度应该是k-1-p。如果以其它方式估计参数,则dof可以介于k-1-p和k-1之间。但是,也有可能渐近分布不是卡方分布,在这种情况下此检验不适用。

引用

[1]

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

[3]

Pearson, Karl. “关于给定的变量相关系统中的偏差系对可能性的偏差条件问题是否合理地推断其是由随机抽样产生的”,《哲学杂志》,第5系列,50(1900),第157-175页。

[4]

Mannan, R. William 和 E. Charles。Meslow。“管理和原始森林中的鸟类种群和植被特征,俄勒冈东北部。”野生动物管理杂志 48,1219-1238,DOI:10.2307/3801783,1984 年。

示例

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

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

使用以上树冠体积比例和观测事件,我们可以推断出期望频率。

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