Python scipy.stats.ranksums vs. R wilcox.test

Оба python scipy.stats.ranksums и R wilcox.test должны рассчитывать двухсторонние p-значения для теста суммы рангов Уилкоксона. Но когда я запускаю обе функции на одни и те же данные, я получаю значения р, которые различаются на порядки:

R:

> x=c(57.07168,46.95301,31.86423,38.27486,77.89309,76.78879,33.29809,58.61569,18.26473,62.92256,50.46951,19.14473,22.58552,24.14309)
> y=c(8.319966,2.569211,1.306941,8.450002,1.624244,1.887139,1.376355,2.521150,5.940253,1.458392,3.257468,1.574528,2.338976)
> print(wilcox.test(x, y))

        Wilcoxon rank sum test

data:  x and y 
W = 182, p-value = 9.971e-08
alternative hypothesis: true location shift is not equal to 0 

Python:

>>> x=[57.07168,46.95301,31.86423,38.27486,77.89309,76.78879,33.29809,58.61569,18.26473,62.92256,50.46951,19.14473,22.58552,24.14309]
>>> y=[8.319966,2.569211,1.306941,8.450002,1.624244,1.887139,1.376355,2.521150,5.940253,1.458392,3.257468,1.574528,2.338976]
>>> scipy.stats.ranksums(x, y)
(4.415880433163923, 1.0059968254463979e-05)

Итак, R дает мне 1е-7, в то время как Python дает мне 1е-5.

Откуда эта разница и какой из них является "правильным" значением p?

Ответ 1

Это зависит от выбора опций (точное и нормальное приближение с коррекцией непрерывности или без него):

R по умолчанию:

По умолчанию (если "точно не указано" ), вычисляется точное значение p если образцы содержат менее 50 конечных значений, и нет связей. В противном случае используется нормальное приближение.

По умолчанию (как показано выше):

wilcox.test(x, y)

    Wilcoxon rank sum test

data:  x and y 
W = 182, p-value = 9.971e-08
alternative hypothesis: true location shift is not equal to 0 

Нормальная аппроксимация с коррекцией непрерывности:

> wilcox.test(x, y, exact=FALSE, correct=TRUE)

    Wilcoxon rank sum test with continuity correction

data:  x and y 
W = 182, p-value = 1.125e-05
alternative hypothesis: true location shift is not equal to 0 

Нормальное приближение без коррекции непрерывности:

> (w0 <- wilcox.test(x, y, exact=FALSE, correct=FALSE))

    Wilcoxon rank sum test

data:  x and y 
W = 182, p-value = 1.006e-05
alternative hypothesis: true location shift is not equal to 0 

Для немного большей точности:

w0$p.value
[1] 1.005997e-05

Похоже, что другое значение, которое Python дает вам (4.415880433163923), - это Z-score:

2*pnorm(4.415880433163923,lower.tail=FALSE)
[1] 1.005997e-05

Я могу оценить желание узнать, что происходит, но я также хотел бы указать, что редко бывает какая-либо практическая разница между p=1e-7 и p=1e-5...