chisquare#
- scipy.stats.mstats.chisquare(f_obs, f_exp=None, ddof=0, axis=0, *, sum_check=True)[源代码]#
执行皮尔逊卡方检验。
皮尔逊卡方检验 [1] 是一种用于具有给定概率的多项分布的拟合优度检验;也就是说,它评估零假设:观察到的频率(计数)是通过从具有给定期望频率的分类分布中独立采样 N 次观察得到的。
- 参数:
- f_obsarray_like
每个类别中的观察频率。
- f_exparray_like, 可选
每个类别中的期望频率。默认情况下,假定各个类别等可能。
- ddofint, 可选
“自由度差值”:对 p 值的自由度进行调整。p 值使用自由度为
k - 1 - ddof
的卡方分布计算,其中k
是类别数。ddof 的默认值为 0。- axisint 或 None, 可选
广播结果 f_obs 和 f_exp 中应用测试的轴。如果 axis 为 None,则 f_obs 中的所有值都被视为单个数据集。默认为 0。
- sum_checkbool, 可选
是否执行检查
sum(f_obs) - sum(f_exp) == 0
。如果为 True(默认值),当相对差异超过数据类型精度的平方根时,则引发错误。有关理由和可能的例外,请参见“注释”。
- 返回:
- res: Power_divergenceResult
一个包含属性的对象
- statisticfloat 或 ndarray
卡方检验统计量。如果 axis 为 None 或 f_obs 和 f_exp 为 1-D,则该值为 float。
- pvaluefloat 或 ndarray
测试的 p 值。如果 ddof 和结果属性 statistic 为标量,则该值为 float。
另请参阅
scipy.stats.power_divergence
scipy.stats.fisher_exact
在 2x2 列联表上进行 Fisher 精确检验。
scipy.stats.barnard_exact
无条件精确检验。用于小样本大小的卡方检验的替代方法。
- 卡方检验
扩展示例
注释
当每个类别中的观察频率或期望频率太小时,此测试无效。一个典型的规则是,所有观察频率和期望频率都应至少为 5。根据 [2],建议观察总数大于 13,否则应使用精确检验(例如 Barnard 精确检验),因为它们不会过度拒绝。
默认的自由度 k-1 是指不估计分布的任何参数的情况。如果通过有效的最大似然估计来估计 p 个参数,则正确的自由度为 k-1-p。如果以不同的方式估计参数,则自由度可以在 k-1-p 和 k-1 之间。但是,渐近分布也可能不是卡方分布,在这种情况下,此测试不适用。
对于皮尔逊卡方检验,观察到的总计数和期望的总计数必须匹配,以使 p 值准确反映在零假设下观察到如此极端的统计量值的概率。此函数可用于执行其他不需要总计数相等的统计测试。例如,要检验零假设:
f_obs[i]
是泊松分布的,期望值为f_exp[i]
,请设置ddof=-1
和sum_check=False
。该测试源于以下事实:均值和方差为f_exp[i]
的泊松随机变量近似为具有相同均值和方差的正态分布;卡方统计量将观测值标准化、平方和求和;以及n
个平方标准正态变量的和遵循自由度为n
的卡方分布。参考文献
[1]“皮尔逊卡方检验”。维基百科。https://en.wikipedia.org/wiki/Pearson%27s_chi-squared_test
[2]Pearson, Karl. “关于在相关的变量系统中,给定的偏离概率的系统,可以合理地假定是由随机抽样引起的标准”,Philosophical Magazine。系列 5. 50 (1900), pp. 157-175。
示例
当仅给出强制性参数 f_obs 时,假定期望频率是均匀的,并且由观察频率的平均值给出。
>>> import numpy as np >>> from scipy.stats import chisquare >>> 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_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]))
有关更详细的示例,请参阅 卡方检验。