scipy.stats.

power_divergence#

scipy.stats.power_divergence(f_obs, f_exp=None, ddof=0, axis=0, lambda_=None)[source]#

Cressie-Read 功率差异统计和拟合优度检验。

该函数使用 Cressie-Read 功率差异统计量来检验分类数据具有给定频率的原假设。

参数:
f_obs类数组

每个类别中观测到的频率。

自 1.14.0 版本不推荐使用: SciPy 1.14.0 不推荐使用掩码数组输入,且该输入将在 1.16.0 版本中被移除。

f_exp类数组,可选

每个类别的预期频率。默认情况下,假定各个类别等同。

自 1.14.0 版本不推荐使用: SciPy 1.14.0 不推荐使用掩码数组输入,且该输入将在 1.16.0 版本中被移除。

ddofint,可选

“自由度的增量”:p 值的自由度调整。根据自由度为 k - 1 - ddof 卡方分布来计算 p 值,其中 k 是观测到的频率数量。 ddof 的默认值为 0。

axisint 或 None,可选

沿其执行检验的 f_obsf_exp 广播结果轴。如果 axis 为 None,则 f_obs 中的所有值都将被视为单个数据集。默认原为 0。

lambda_float 或 str,可选

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_divergenceResult

包含下列属性的对象

statisticfloat 或 ndarray

Cressie-Read 功率散度检验统计量。如果 axis 为 None 或 f_obsf_exp 为 1-D,则该值为浮点数。

pvaluefloat 或 ndarray

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

另请参阅

chisquare

当每一类别中观测到的频率或预期频率过小时,此检验无效。一条普遍的规则是所有的观测频率和预期频率都应至少为 5。

此外,观察到的频率和预期频率的总和必须相等,此检验才有效;如果总和不符合相对容差 eps**0.5power_divergence 会引发一个错误,其中 eps 是输入数据类型的精度。

lambda_ 小于零时,该统计公式涉及除以 f_obs,因此如果 f_obs 中的任何值都为 0,则可能会生成一个警告或错误。

类似地,如果 f_exp 中的任何值都为 0,且 lambda_ >= 0,则可能会生成一个警告或错误。

自由度默认为 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

[4]

Sokal, R. R. 和 Rohlf, F. J. “生物测量学:生物学研究中统计学原理与实务”,纽约:Freeman(1981 年)

[5]

Cressie, N. 和 Read, T. R. C., “多项式拟合优度检验”,皇家统计学会期刊。系列 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-D 时,默认情况下此检验会应用于每一列。

>>> 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)

通过用 ddof 广播检验统计量来完成 p 值的计算。

>>> 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]))