scipy.stats.

power_divergence#

scipy.stats.power_divergence(f_obs, f_exp=None, ddof=0, axis=0, lambda_=None, *, nan_policy='propagate', keepdims=False)[source]#

Cressie-Read 幂散度统计量和拟合优度检验。

此函数使用 Cressie-Read 幂散度统计量检验分类数据是否具有给定频率的零假设。

参数:
f_obsarray_like

每个类别中的观测频率。

f_exparray_like, optional

每个类别中的预期频率。默认情况下,假定各个类别具有相同的可能性。

ddofint, optional

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

axisint 或 None,默认值:0

如果为 int,则为计算统计量的输入轴。输入的每个轴切片(例如行)的统计量将显示在输出的相应元素中。如果为 None,则将在计算统计量之前将输入展平。

lambda_float 或 str,optional

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

  • "pearson" (值 1)

    Pearson 卡方统计量。在这种情况下,该函数等效于 chisquare

  • "log-likelihood" (值 0)

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

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

    Freeman-Tukey 统计量。

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

    修改的对数似然比。

  • "neyman" (值 -2)

    Neyman 统计量。

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

    [5] 中推荐的幂。

nan_policy{‘propagate’, ‘omit’, ‘raise’}

定义如何处理输入 NaN。

  • propagate:如果计算统计量的轴切片(例如行)中存在 NaN,则输出的相应条目将为 NaN。

  • omit:执行计算时将忽略 NaN。如果计算统计量的轴切片中剩余的数据不足,则输出的相应条目将为 NaN。

  • raise:如果存在 NaN,将引发 ValueError

keepdimsbool,默认值:False

如果将其设置为 True,则减少的轴将保留在结果中,作为大小为 1 的维度。使用此选项,结果将针对输入数组正确广播。

返回:
res: Power_divergenceResult

包含属性的对象

statisticfloat 或 ndarray

Cressie-Read 幂散度检验统计量。如果 axis 为 None 或者 ` f_obsf_exp 为 1-D,则该值为 float。

pvaluefloat 或 ndarray

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

另请参阅

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 之间。但是,渐近分布也可能不是卡方分布,在这种情况下,此检验不适用。

从 SciPy 1.9 开始,在执行计算之前,np.matrix 输入(不建议用于新代码)将转换为 np.ndarray。在这种情况下,输出将是标量或具有适当形状的 np.ndarray,而不是 2D np.matrix。同样,虽然会忽略掩码数组的掩码元素,但输出将是标量或 np.ndarray,而不是 mask=False 的掩码数组。

除了 NumPy 之外,power_divergence 还实验性地支持 Python Array API Standard 兼容后端。请考虑通过设置环境变量 SCIPY_ARRAY_API=1 并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。支持以下后端和设备(或其他功能)的组合。

CPU

GPU

NumPy

n/a

CuPy

n/a

PyTorch

JAX

⚠️ 没有 JIT

⚠️ 没有 JIT

Dask

⚠️ 计算图

n/a

有关更多信息,请参阅 对数组 API 标准的支持

参考文献

[1]

Lowry, Richard. “Concepts and Applications of Inferential Statistics”. Chapter 8. https://web.archive.org/web/20171015035606/http://faculty.vassar.edu/lowry/ch8pt1.html

[4]

Sokal, R. R. and Rohlf, F. J. “Biometry: the principles and practice of statistics in biological research”, New York: Freeman (1981)

[5]

Cressie, N. and Read, T. R. C., “Multinomial Goodness-of-Fit Tests”, 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 是 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)

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