使用scipy进行单侧Wilcoxon符号秩检验

14

我想对我的配对数据执行单侧Wilcoxon秩和检验,因为我想知道一个样本是否显著大于另一个。

Scipy提供了

scipy.stats.wilcoxon(x,y)

使用成对样本x和y执行双侧检验。由于我无法假设正态(对称)分布,因此无法从双侧p值中推导出单侧p值。

有人知道如何使用python获取单侧检验的p值吗?

谢谢!


2
现在,有一个选项可以将alternative设置为'greater''less'。因此,您不必自己计算它。 - So S
2个回答

17
< p > 由 scipy.stats.wilcoxon 返回的 P 值与 xy 的分布以及它们之间的差异无关。它是由 Wilcoxon 检验统计量(如http://en.wikipedia.org/wiki/Wilcoxon_signed-rank_test 中的 W,或者在 scipy 中表示为 T)确定的,该统计量假定遵循正态分布。如果您查看源代码(在 ~python_directory\site-packages\scipy\stats\morestats.py 中),您会发现 def wilcoxon() 的最后几行:

se = sqrt(se / 24)
z = (T - mn) / se
prob = 2. * distributions.norm.sf(abs(z))
return T, prob

并且:

mn = count*(count + 1.) * 0.25
se = count*(count + 1.) * (2. * count + 1.)

countxy 之间非零差异的数量。

因此,要得到单边 p 值,只需使用 prob/2.1-prob/2.

示例: 在 Python 中:

>>> y1=[125,115,130,140,140,115,140,125,140,135]
>>> y2=[110,122,125,120,140,124,123,137,135,145]
>>> ss.wilcoxon(y1, y2)
(18.0, 0.5936305914425295)

R中:

> wilcox.test(y1, y2, paired=TRUE, exact=FALSE, correct=FALSE)

        Wilcoxon signed rank test

data:  y1 and y2 
V = 27, p-value = 0.5936
alternative hypothesis: true location shift is not equal to 0 

> wilcox.test(y1, y2, paired=TRUE, exact=FALSE, correct=FALSE, alt='greater')

        Wilcoxon signed rank test

data:  y1 and y2 
V = 27, p-value = 0.2968
alternative hypothesis: true location shift is greater than 0

我还没有完全理解它(需要重新学习Wilcoxon检验..),但数字说明了一切。谢谢! - Lisa
点赞 3 反对 已采纳 scipy.stats.wilcoxon返回的P值与x或y的分布以及它们之间的差异无关。我感到困惑。我认为这个测试是在说,如果两个输入向量来自同一分布,则置信度如何。 - O.rka

2

谢谢你的提示!我之前没有意识到这些测试之间的微小差别。现在我只需要弄清楚哪个测试更适合我的数据。 - Lisa
9
mannwhitneyu 用于独立样本,wilcoxon 用于配对样本,所以你不能在它们之间切换。 - Josef
实际上你可以:你可以在成对样本上使用双独立样本检验,但反过来就不行。这是否明智完全是另一回事。 - fabee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接