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
的元素即使在精确算术中绑定时也会被分配不同的秩。与其单独传递 x 和 y,不如考虑计算差值x - y
,根据需要进行舍入以确保只有真正唯一的元素在数值上不同,并将结果作为 x 传递,将 y 保留为默认值(None)。- zero_method{“wilcox”, “pratt”, “zsplit”}, 可选
处理具有相等值(“零差”或“零”)的观测值对有不同的约定。
- correctionbool,可选
如果为 True,则在计算 z 统计量(如果使用正态近似值)时,通过将 Wilcoxon 秩统计量向平均值调整 0.5 来应用连续性校正。默认值为 False。
- alternative{“two-sided”, “greater”, “less”}, 可选
定义备择假设。默认值为 ‘two-sided’。在下文中,令
d
表示配对样本之间的差异:如果提供x
和y
,则d = x - y
;否则,d = x
。‘two-sided’:
d
的基础分布不是关于零对称的。‘less’:
d
的基础分布在随机上小于关于零对称的分布。‘greater’:
d
的基础分布在随机上大于关于零对称的分布。
- method{“auto”, “exact”, “asymptotic”} 或
PermutationMethod
实例, 可选 计算 p 值的方法,请参阅 Notes。默认值为 “auto”。
- axisint 或 None,默认值:0
如果为 int,则输入中计算统计量的轴。输入的每个轴切片(例如,行)的统计量将出现在输出的相应元素中。如果为
None
,则在计算统计量之前将输入展平。- nan_policy{‘propagate’, ‘omit’, ‘raise’}
定义如何处理输入 NaN。
propagate
:如果计算统计量的轴切片(例如,行)中存在 NaN,则输出的相应条目将为 NaN。omit
:执行计算时将省略 NaN。如果计算统计量的轴切片中剩余的数据不足,则输出的相应条目将为 NaN。raise
:如果存在 NaN,则会引发ValueError
。
- keepdimsbool,默认值:False
如果将其设置为 True,则减小的轴将保留在结果中,作为大小为 1 的维度。使用此选项,结果将正确广播到输入数组。
- 返回:
- 具有以下属性的对象。
- statistic类数组
如果 alternative 为 “two-sided”,则为零以上或以下差值的秩之和,以较小者为准。否则为零以上差值的秩之和。
- pvalue类数组
检验的 p 值,取决于 alternative 和 method。
- zstatistic类数组
当
method = 'asymptotic'
时,这是归一化 z 统计量z = (T - mn - d) / se
其中
T
是如上定义的 statistic,mn
是零假设下分布的均值,d
是连续性校正,se
是标准误差。当method != 'asymptotic'
时,此属性不可用。
另请参阅
备注
在下文中,令
d
表示配对样本之间的差异:如果提供了x
和y
,则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
的屏蔽数组。参考文献
[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
接受两个长度相等的样本,计算成对元素之间的差异,然后执行测试。考虑样本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.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)