当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy stats.chisquare用法及代码示例


本文简要介绍 python 语言中 scipy.stats.chisquare 的用法。

用法:

scipy.stats.chisquare(f_obs, f_exp=None, ddof=0, axis=0)#

计算 one-way 卡方检验。

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

参数

f_obs array_like

在每个类别中观察到的频率。

f_exp 数组,可选

每个类别中的预期频率。默认情况下,假定类别具有相同的可能性。

ddof 整数,可选

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

axis int 或无,可选

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

返回

资源:Power_divergenceResult

包含属性的对象:

奇斯克 浮点数或 ndarray

卡方检验统计量。如果轴为无或 f_obs 和 f_exp 为一维,则该值为浮点数。

p值 浮点数或 ndarray

检验的 p 值。如果 ddof 和返回值 chisq 是标量,则该值为浮点数。

注意

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

此外,观察到的频率和预期频率的总和必须相同才能使测试有效;如果总和在 1e-8 的相对容差范围内不一致,则 chisquare 会引发错误。

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

参考

[1]

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

[3]

皮尔逊,卡尔。 “在相关变量系统的情况下,给定系统与可能的偏差的标准是可以合理地假设它是从随机抽样中产生的”,哲学杂志。系列 5. 50 (1900),第 157-175 页。

[4]

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

例子

在[4]中,对俄勒冈州old-growth森林中的鸟类觅食行为进行了调查。森林中,花旗松占树冠体积的44%,黄松占24%,大冷杉占29%,西部落叶松占3%。作者观察了几种鸟类的行为,其中之一是red-breasted五子雀。他们对该物种的觅食进行了 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]))

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.chisquare。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。