R和Python中Wilcoxon测试的区别

时间:2015-11-07 06:16:22

标签: python r scipy

我正在尝试在R和python的scipy.stats包中运行Wilcoxon测试。但是我可以得到不同的结果吗?

我的代码在R

    > des2
 [1]  6.2151308  4.7956451  4.7473738  5.4695828  6.3181463  2.8617239
 [7] -0.8105824  3.9456856  4.6735000  4.1067193  5.7656002  2.2237666
[13]  1.0354143  4.9547707  5.3156348  4.8163154  3.4024776  4.2876854
[19]  6.1227500
> wilcox.test(des2, mu=0, conf.int = T)

    Wilcoxon signed rank test

data:  des2
V = 189, p-value = 7.629e-06
alternative hypothesis: true location is not equal to 0
95 percent confidence interval:
 3.485570 5.160925
sample estimates:
(pseudo)median 
      4.504883 

我在Python中的代码:

test = [6.2151308, 4.7956451,  4.7473738,  5.4695828,  6.3181463,  2.8617239, -0.8105824, 3.9456856,  4.6735000,  4.1067193, 5.7656002, 2.2237666, 1.0354143, 4.9547707, 5.3156348,  4.8163154,  3.4024776,  4.2876854,  6.1227500]
z_statistic, p_value = wilcoxon(np.array(test) - np.log(1.0))
print "one-sample wilcoxon-test", p_value


one-sample wilcoxon-test 0.000155095772796

即使它们的p值足够低以拒绝零假设,p值也有3个数量级的差异,我无法理解为什么

1 个答案:

答案 0 :(得分:1)

在计算p值时,

scipy的实现总是使用正态近似值。虽然这肯定适用于大样本量n,但p值可能会偏离小样本量的真实p值。

scipy docs的笔记中,您会发现:

  

因为正态近似用于计算,所以   使用的样本应该很大。典型的规则是要求n> 1。   20。

R的实现为小样本量计算精确的p值,并且仅使用正常近似值来表示足够大的n

R docs告诉你:

  

默认情况下(如果未指定exact),将计算精确的p值   如果样本包含少于50个有限值且没有   领带。否则,使用正常近似值。

简而言之:当两个p值不同时,R的p值应该是首选。