power_divergence#
- scipy.stats.power_divergence(f_obs, f_exp=None, ddof=0, axis=0, lambda_=None)[源代码]#
Cressie-Read 幂散度统计量和拟合优度检验。
此函数使用 Cressie-Read 幂散度统计量检验分类数据是否具有给定频率的零假设。
- 参数:
- f_obsarray_like
每个类别中的观测频率。
自版本 1.14.0 起弃用: SciPy 1.14.0 中已弃用对掩码数组输入的支持,将在 1.16.0 版本中删除。
- f_exparray_like,可选
每个类别中的预期频率。默认情况下,假定每个类别的可能性均等。
自版本 1.14.0 起弃用: SciPy 1.14.0 中已弃用对掩码数组输入的支持,将在 1.16.0 版本中删除。
- ddofint,可选
“自由度增量”:对 p 值的自由度进行调整。p 值使用自由度为
k - 1 - ddof
的卡方分布计算,其中 k 是观测频率的数量。 ddof 的默认值为 0。- axisint 或 None,可选
应用测试的 f_obs 和 f_exp 的广播结果的轴。如果 axis 为 None,则 f_obs 中的所有值都将被视为单个数据集。默认为 0。
- lambda_float 或 str,可选
Cressie-Read 幂散度统计量中的幂。默认值为 1。为方便起见,可以将 lambda_ 分配给以下字符串之一,在这种情况下,将使用相应的数值
- 返回:
- res: Power_divergenceResult
一个包含属性的对象
- statisticfloat 或 ndarray
Cressie-Read 幂散度检验统计量。如果 axis 为 None,或者 f_obs 和 f_exp 为 1 维,则该值为 float。
- pvaluefloat 或 ndarray
检验的 p 值。如果 ddof 和返回值
stat
是标量,则该值为 float。
另请参阅
注释
当每个类别中的观测频率或预期频率太小时,此检验无效。一个典型的规则是所有观测频率和预期频率都应至少为 5。
此外,观测频率之和与预期频率之和必须相同,检验才有效;如果总和在
eps**0.5
的相对公差范围内不一致,power_divergence
会引发错误,其中eps
是输入 dtype 的精度。当 lambda_ 小于零时,统计量的公式涉及除以 f_obs,因此如果 f_obs 中的任何值为 0,则可能会生成警告或错误。
类似地,当 lambda_ >= 0 时,如果 f_exp 中的任何值为零,则可能会生成警告或错误。
默认自由度 k-1 适用于未估计分布参数的情况。如果通过有效最大似然估计 p 个参数,则正确的自由度为 k-1-p。如果以不同的方式估计参数,则自由度可以在 k-1-p 和 k-1 之间。但是,渐近分布也可能不是卡方分布,在这种情况下,此测试不适用。
参考文献
[1]Lowry, Richard。“推论统计的概念和应用”。第 8 章。https://web.archive.org/web/20171015035606/http://faculty.vassar.edu/lowry/ch8pt1.html
[3][4]Sokal, R. R. 和 Rohlf, F. J.,“生物统计学:生物研究中统计学的原理和实践”,纽约:弗里曼 (1981)
[5]Cressie, N. 和 Read, T. R. C.,“多项拟合优度检验”,J. Royal Stat. Soc. Series B,第 46 卷,第 3 期 (1984),第 440-464 页。
示例
(有关更多示例,请参阅
chisquare
。)当只给出 f_obs 时,假设预期频率是均匀的,并由观测频率的平均值给出。在这里,我们执行 G 检验(即使用对数似然比统计量)
>>> import numpy as np >>> from scipy.stats import power_divergence >>> power_divergence([16, 18, 16, 14, 12, 12], lambda_='log-likelihood') (2.006573162632538, 0.84823476779463769)
可以使用 f_exp 参数给出预期频率
>>> power_divergence([16, 18, 16, 14, 12, 12], ... f_exp=[16, 16, 16, 16, 16, 8], ... lambda_='log-likelihood') (3.3281031458963746, 0.6495419288047497)
当 f_obs 为 2 维时,默认情况下,测试应用于每一列。
>>> obs = np.array([[16, 18, 16, 14, 12, 12], [32, 24, 16, 28, 20, 24]]).T >>> obs.shape (6, 2) >>> power_divergence(obs, lambda_="log-likelihood") (array([ 2.00657316, 6.77634498]), array([ 0.84823477, 0.23781225]))
通过设置
axis=None
,测试应用于数组中的所有数据,这等效于将测试应用于扁平化数组。>>> power_divergence(obs, axis=None) (23.31034482758621, 0.015975692534127565) >>> power_divergence(obs.ravel()) (23.31034482758621, 0.015975692534127565)
ddof 是对默认自由度所做的更改。
>>> power_divergence([16, 18, 16, 14, 12, 12], ddof=1) (2.0, 0.73575888234288467)
p 值的计算是通过将检验统计量与 ddof 进行广播来完成的。
>>> power_divergence([16, 18, 16, 14, 12, 12], ddof=[0,1,2]) (2.0, 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
>>> power_divergence([16, 18, 16, 14, 12, 12], ... f_exp=[[16, 16, 16, 16, 16, 8], ... [8, 20, 20, 16, 12, 12]], ... axis=1) (array([ 3.5 , 9.25]), array([ 0.62338763, 0.09949846]))