scipy.stats.

威尔科克森#

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 不需要指定)。必须是一维的。

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”: 在排名过程中包含零差异,并在正负之间分割零排名。

修正bool, 可选

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

替代方案{two-sided, greater, less}, 可选

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

  • ‘双侧’: d 的基础分布不是关于零对称的。

  • ‘less’: 基础分布 d 在统计上小于一个关于零对称的分布。

  • ‘greater’: d 的基础分布在零点对称分布的基础上是随机更大的。

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

计算p值的方法,参见注释。默认是“自动”。

int 或 None, 默认值: 0

如果是一个整数,表示输入数据中要计算统计量的轴。输入数据的每个轴切片(例如行)的统计量将出现在输出的相应元素中。如果为 None,则在计算统计量之前会将输入数据展平。

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

定义如何处理输入的 NaN。

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

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

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

keepdimsbool, 默认值: False

如果设置为True,被减少的轴将作为尺寸为1的维度保留在结果中。通过此选项,结果将正确地与输入数组进行广播。

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

如果 alternative 是 “two-sided”,则取差异值在零之上或之下的秩和中的较小者。否则,取差异值在零之上的秩和。

p值array_like

根据 alternativemethod 的测试的 p 值。

zstatisticarray_like

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

z = (T - mn - d) / se

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

注释

在下文中,设 d 表示配对样本之间的差异:如果提供了 xy,则 d = x - y,否则 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 实例。此时,p 值是使用 permutation_test 根据提供的配置选项和其他适当设置计算的。

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

参考文献

[2]

Conover, W.J., 《实用非参数统计》, 1971.

[3]

Pratt, J.W., 关于Wilcoxon符号秩检验中零和结的评论, 美国统计协会杂志, 第54卷, 1959年, 第655-667页. DOI:10.1080/01621459.1959.10501526

[4] (1,2)

Wilcoxon, F., 通过排名方法进行个体比较, Biometrics Bulletin, 第1卷, 1945年, 第80-83页. DOI:10.2307/3001968

[5]

Cureton, E.E., 《存在零差异时的符号秩抽样分布的正态近似》, 《美国统计协会杂志》, 第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)