卡方#
- scipy.stats.mstats.chisquare(f_obs, f_exp=None, ddof=0, axis=0)[源代码][源代码]#
计算单向卡方检验。
卡方检验用于检验分类数据是否具有给定的频率的零假设。
- 参数:
- f_obsarray_like
每个类别中观察到的频率。
- f_exp类似数组, 可选
每个类别中的预期频率。默认情况下,假设类别出现的概率是相等的。
- ddofint, 可选
“自由度的增量”:对p值自由度的调整。p值是使用具有
k - 1 - ddof
自由度的卡方分布计算的,其中 k 是观察到的频率数量。ddof 的默认值为 0。- 轴int 或 None, 可选
f_obs 和 f_exp 广播结果的轴,沿此轴应用测试。如果 axis 为 None,则将 f_obs 中的所有值视为单个数据集。默认为 0。
- 返回:
- res: Power_divergence结果
一个包含属性的对象:
- 统计浮点数或ndarray
卡方检验统计量。如果 axis 为 None 或 f_obs 和 f_exp 为一维,则该值为浮点数。
- p值浮点数或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. “推理统计的概念与应用”. 第八章. https://web.archive.org/web/20171022032306/http://vassarstats.net:80/textbook/ch8pt1.html
[2][3]皮尔逊, 卡尔. “关于在相关变量系统中,给定偏离可能性的标准,即可以合理地假设其源于随机抽样的系统”,《哲学杂志》。第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 是二维时,默认情况下测试应用于每一列。
>>> 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_obs 和 f_exp 也会进行广播。在下面的例子中,f_obs 的形状是 (6,),而 f_exp 的形状是 (2, 6),因此 f_obs 和 f_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]))