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 检验的非参数版本。

参数:
x类似数组

用于第一组测量(在这种情况下,y 是第二组测量),或两组测量之间的差异(在这种情况下,未指定 y)。必须是一维的。

y类似数组,可选

用于第二组测量(如果 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”: 在排名过程中包括零差异,并将零秩在正负秩之间拆分。

correction布尔值,可选

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

alternative{“two-sided”, “greater”, “less”},可选

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

  • “双侧”: d 下面的分布在 0 处不对称。

  • “小于”: d 下面的分布随机小于在 0 处对称的分布。

  • “大于”: d 下面的分布随机大于在 0 处对称的分布。

方法{“auto”、“exact”、“approx”} 或 PermutationMethod 实例,可选

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

axisint 或 None,默认值:0

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

nan_policy{‘传播”、“忽略”、“引发”}

定义如何处理输入 NaN。

  • 传播:如果在计算统计值的轴片(例如行)中出现 NaN,则输出的相应项将为 NaN。

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

  • 引发:如果出现 NaN,将引发 ValueError

keepdims布尔值,默认值:False

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

返回:
具有以下属性的对象。
统计数据array_like

如果 alternative 为“two-sided”,则为上方或下方较小值之差的秩的总和。否则,为上方差的秩的总和。

pvaluearray_like

取决于 alternativemethod 的检验 p 值。

zstatisticarray_like

method = 'approx' 时,这是标准化 z 统计数据

z = (T - mn - d) / se

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

另请参见

kruskalmannwhitneyu

说明

在下文中,我们用 d 表示成对样本之间的差值:d = x - y(如果 xy 均已提供),否则 d = x。假设 d 的所有元素都是独立且同分布的观测,所有元素都是各不相同且非零的。

  • len(d) 足够大时,标准化检验统计数据(即上文的 zstatistic)的零分布近似为正态分布,而且可以使用 method = 'approx' 计算 p 值。

  • len(d) 较小时,正态近似可能不够准确,因此优先使用 method='exact'(但会增加执行时间)。

  • 默认的 method='auto' 在两者之间进行选择:当 len(d) <= 50 且没有零时,将使用精确方法;否则,将使用近似方法。

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

从 SciPy 1.9 开始,np.matrix 输入(不推荐用于新代码)在执行计算之前会被转换为 np.ndarray。在此情况下,输出将是标量或形状合适的 np.ndarray,而不是二维 np.matrix。同样,尽管掩码数组的屏蔽元素会被忽略,但输出将是标量或 np.ndarray,而不是掩码为 mask=False 的掩码数组。

参考文献

[2]

康诺威,《非参数统计实践》,1971 年。

[3]

普拉特,《威尔科克森符号秩程序中的零和关系》,《美国统计协会杂志》,第 54 卷,1959 年,第 655-667 页。 DOI:10.1080/01621459.1959.10501526

[4] (1,2)

威尔科克森,《按排序方法进行个体比较》,《生物统计学公报》,第 1 卷,1945 年,第 80-83 页。 DOI:10.2307/3001968

[5]

库瑞顿,《当存在零差异时的符号秩抽样分布的正态近似》,《美国统计协会杂志》,第 62 卷,1967 年,第 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='approx')
>>> 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.4375)

实质性差异是由于 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.4375)