scipy.stats.

wilcoxon#

scipy.stats.wilcoxon(x, y=None, zero_method='wilcox', correction=False, alternative='two-sided', method='auto', *, axis=0, nan_policy='propagate', keepdims=False)[源]#

计算 Wilcoxon 符号秩检验。

Wilcoxon 符号秩检验检验零假设,即两个相关的配对样本来自相同的分布。特别是,它检验差异 x - y 的分布是否关于零对称。它是配对 T 检验的非参数版本。

参数:
xarray_like

可以是第一组测量值(此时 y 是第二组测量值),也可以是两组测量值之间的差异(此时不应指定 y)。必须是一维的。

yarray_like, 可选

可以是第二组测量值(如果 x 是第一组测量值),或者不指定(如果 x 是两组测量值之间的差异)。必须是一维的。

警告

当提供了 y 时,wilcoxon 根据 d = x - y 的绝对值的秩计算检验统计量。减法中的舍入误差可能导致 d 的元素被分配不同的秩,即使它们在精确算术下会并列。与其分别传递 xy,不如考虑计算差异 x - y,根据需要进行舍入以确保只有真正唯一的元素在数值上是不同的,然后将结果作为 x 传递,将 y 保持为默认值 (None)。

zero_method{"wilcox", "pratt", "zsplit"}, 可选

对于处理具有相等值(“零差异”或“零”)的观察对,有不同的约定。

  • “wilcox”:丢弃所有零差异(默认);参见 [4]

  • “pratt”:在排序过程中包含零差异,但丢弃零的秩(更保守);参见 [3]。在这种情况下,正态近似会如 [5] 中进行调整。

  • “zsplit”:在排序过程中包含零差异,并将零秩分配给正负秩之间。

correctionbool, 可选

如果为 True,在计算 z 统计量时,如果使用正态近似,则通过将 Wilcoxon 秩统计量向平均值调整 0.5 来应用连续性校正。默认为 False。

alternative{"two-sided", "greater", "less"}, 可选

定义备择假设。默认为“two-sided”。在下文中,让 d 表示配对样本之间的差异:如果同时提供了 xy,则 d = x - y,否则 d = x

  • “two-sided”:d 的底层分布关于零不对称。

  • “less”:d 的底层分布在统计上小于关于零对称的分布。

  • “greater”:d 的底层分布在统计上大于关于零对称的分布。

method{"auto", "exact", "asymptotic"} 或 PermutationMethod 实例, 可选

计算 p 值的方法,参见注释。默认为“auto”。

axisint 或 None, 默认: 0

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

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

定义如何处理输入 NaN。

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

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

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

keepdimsbool, 默认: False

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

返回:
具有以下属性的对象。
statisticarray_like

如果 alternative 为“two-sided”,则为高于或低于零的差异的秩之和中较小者。否则为高于零的差异的秩之和。

pvaluearray_like

根据 alternativemethod 的检验 p 值。

zstatisticarray_like

method = 'asymptotic' 时,这是标准化 z 统计量

z = (T - mn - d) / se

其中 T 是如上定义的 statisticmn 是零假设下分布的均值,d 是连续性校正,se 是标准误差。当 method != 'asymptotic' 时,此属性不可用。

另请参阅

kruskal, mannwhitneyu

附注

在下文中,让 d 表示配对样本之间的差异:如果同时提供了 xy,则 d = x - y,否则 d = x。假设 d 的所有元素都是独立同分布的观测值,并且所有元素都是不同且非零的。

  • len(d) 足够大时,标准化检验统计量(上述 zstatistic)的零分布近似正态,并且可以使用 method = 'asymptotic' 来计算 p 值。

  • len(d) 很小时,正态近似可能不准确,因此首选 method='exact'(代价是额外的执行时间)。

  • 默认值 method='auto' 在两者之间进行选择:当 len(d) <= 50 时使用 method='exact',否则使用 method='asymptotic'

存在“平局”(即 d 的所有元素不唯一)或“零”(即 d 的元素为零)会改变检验统计量的零分布,此时 method='exact' 不再计算精确的 p 值。如果 method='asymptotic',z 统计量会进行调整以与标准正态分布进行更准确的比较,但对于有限样本量,标准正态分布仍然只是 z 统计量真实零分布的近似。对于这种情况,method 参数也接受 PermutationMethod 的实例。在这种情况下,p 值使用 permutation_test 与提供的配置选项和其他适当设置进行计算。

平局和零的存在会相应地影响 method='auto' 的分辨率:当 len(d) <= 13 时执行穷举置换,否则使用渐近方法。请注意,即使对于 len(d) > 14,渐近方法也可能不是很准确;选择该阈值是在执行时间和准确性之间,在结果必须是确定性的约束下的折衷。考虑手动提供 PermutationMethod 实例,选择 n_resamples 参数以平衡时间约束和准确性要求。

另请注意,在 d 的所有元素均为零的极端情况下,如果 zero_method='wilcox'zero_method='pratt',则无法计算依赖于正态近似的 p 值 (NaN)。

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

数组 API 标准支持

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

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

⚠️ 无 JIT

Dask

不适用

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

参考文献

[2]

Conover, W.J., Practical Nonparametric Statistics, 1971。

[3]

Pratt, J.W., Remarks on Zeros and Ties in the Wilcoxon Signed Rank Procedures, Journal of the American Statistical Association, Vol. 54, 1959, pp. 655-667. DOI:10.1080/01621459.1959.10501526

[4] (1,2)

Wilcoxon, F., Individual Comparisons by Ranking Methods, Biometrics Bulletin, Vol. 1, 1945, pp. 80-83. DOI:10.2307/3001968

[5]

Cureton, E.E., The Normal Approximation to the Signed-Rank Sampling Distribution When Zero Differences are Present, Journal of the American Statistical Association, Vol. 62, 1967, pp. 1068-1069. DOI:10.1080/01621459.1967.10500917

示例

[4] 中,杂交和自交玉米植株的高度差异如下所示

>>> d = [6, 8, 14, 16, 23, 24, 28, 29, 41, -48, 49, 56, 60, -67, 75]

杂交植株似乎更高。为了检验没有高度差异的零假设,我们可以应用双边检验

>>> from scipy.stats import wilcoxon
>>> res = wilcoxon(d)
>>> res.statistic, res.pvalue
(24.0, 0.041259765625)

因此,我们将在 5% 的置信水平上拒绝零假设,得出结论,各组之间存在高度差异。为了确认差异的中位数可以假定为正,我们使用

>>> res = wilcoxon(d, alternative='greater')
>>> res.statistic, res.pvalue
(96.0, 0.0206298828125)

这表明,零假设(即中位数为负)可以在 5% 的置信水平上被拒绝,转而支持中位数大于零的备择假设。上述 p 值是精确的。使用正态近似会得到非常相似的值

>>> res = wilcoxon(d, method='asymptotic')
>>> res.statistic, res.pvalue
(24.0, 0.04088813291185591)

请注意,在单边情况下,统计量变为 96(正差异的秩之和),而在双边情况下,统计量为 24(高于和低于零的秩之和的最小值)。

在上面的示例中,配对植株之间的高度差异直接提供给 wilcoxon。或者,wilcoxon 接受两个长度相等的样本,计算配对元素之间的差异,然后执行检验。考虑样本 xy

>>> import numpy as np
>>> x = np.array([0.5, 0.825, 0.375, 0.5])
>>> y = np.array([0.525, 0.775, 0.325, 0.55])
>>> res = wilcoxon(x, y, alternative='greater')
>>> res
WilcoxonResult(statistic=5.0, pvalue=0.5625)

请注意,如果我们手动计算差异,检验会产生不同的结果

>>> d = [-0.025, 0.05, 0.05, -0.05]
>>> ref = wilcoxon(d, alternative='greater')
>>> ref
WilcoxonResult(statistic=6.0, pvalue=0.5)

显著差异是由于 x-y 结果中的舍入误差

>>> d - (x-y)
array([2.08166817e-17, 6.93889390e-17, 1.38777878e-17, 4.16333634e-17])

尽管我们期望 (x-y)[1:] 的所有元素都具有相同的幅度 0.05,但它们在实践中具有略微不同的幅度,因此在检验中被分配了不同的秩。在执行检验之前,请考虑计算 d 并根据需要进行调整,以确保理论上相同的值在数值上不区分。例如

>>> d2 = np.around(x - y, decimals=3)
>>> wilcoxon(d2, alternative='greater')
WilcoxonResult(statistic=6.0, pvalue=0.5)