威尔科克森#
- 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
的元素即使在使用精确算术时也会被分配不同的排名。与其分别传递 x 和 y,不如考虑计算差值x - y
,根据需要进行舍入以确保只有真正唯一的元素在数值上是不同的,并将结果作为 x 传递,将 y 保留为默认值(None)。- zero_method{“wilcox”, “pratt”, “zsplit”},可选
处理具有相同值的观测对(“零差异”或“零值”)有不同的约定。
- 修正bool, 可选
如果为 True,则在计算 z 统计量时,如果使用正态近似,则通过将 Wilcoxon 秩统计量向均值调整 0.5 来应用连续性校正。默认值为 False。
- 替代方案{
two-sided
,greater
,less
}, 可选 定义备择假设。默认是 ‘two-sided’。在下文中,设
d
表示配对样本之间的差异:如果提供了x
和y
,则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
根据 alternative 和 method 的测试的 p 值。
- zstatisticarray_like
当
method = 'approx'
时,这是标准化 z 统计量:z = (T - mn - d) / se
其中
T
是如上定义的 统计量,mn
是零假设下分布的均值,d
是连续性修正,se
是标准误差。当method != 'approx'
时,此属性不可用。
参见
注释
在下文中,设
d
表示配对样本之间的差异:如果提供了x
和y
,则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
[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
接受两个长度相等的样本,计算配对元素之间的差异,然后执行测试。考虑样本x
和y
:>>> 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)