scipy.stats.

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_exp类似数组, 可选

每个类别中的预期频率。默认情况下,假设类别出现的概率是相等的。

自 1.14.0 版本弃用: 在 SciPy 1.14.0 中,掩码数组输入的支持已被弃用,并将在 1.16.0 版本中移除。

ddofint, 可选

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

int 或 None, 可选

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

lambda_浮点数或字符串,可选

Cressie-Read 幂散度统计量中的幂。默认值为 1。为方便起见,lambda_ 可以被赋予以下字符串之一,在这种情况下,将使用相应的数值:

  • "pearson" (值 1)

    皮尔逊卡方统计量。在这种情况下,该函数等同于 chisquare

  • "log-likelihood" (值 0)

    对数似然比。也称为G检验 [3]

  • "freeman-tukey" (值 -1/2)

    Freeman-Tukey 统计量。

  • "mod-log-likelihood" (值 -1)

    修正的对数似然比。

  • "neyman" (值 -2)

    Neyman 的统计量。

  • "cressie-read" (值 2/3)

    [5] 中推荐的功率。

返回:
res: Power_divergence结果

一个包含属性的对象:

统计浮点数或ndarray

Cressie-Read 幂散度检验统计量。如果 axis 为 None 或者 f_obsf_exp 是一维的,则该值为浮点数。

p值浮点数或ndarray

测试的 p 值。如果 ddof 和返回值 stat 是标量,则该值为浮点数。

参见

chisquare

注释

当每个类别中的观察频率或期望频率过小时,此测试无效。一个典型的规则是所有观察频率和期望频率应至少为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. “推理统计的概念与应用”. 第八章. https://web.archive.org/web/20171015035606/http://faculty.vassar.edu/lowry/ch8pt1.html

[4]

Sokal, R. R. 和 Rohlf, F. J. 《生物统计学:生物研究中的统计原理与实践》,纽约:Freeman出版社 (1981)

[5]

Cressie, N. 和 Read, T. R. C., “多项式拟合优度检验”, J. Royal Stat. Soc. Series B, Vol. 46, No. 3 (1984), pp. 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 是二维时,默认情况下测试应用于每一列。

>>> 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_obsf_exp 也会进行广播。在下面,f_obs 的形状是 (6,),而 f_exp 的形状是 (2, 6),因此 f_obsf_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]))