2012-10-09 33 views
11

Tanto scipy.stats.ranksums de python como wilcox.test de R se supone que calculan los valores de p de dos lados para una prueba de suma de rangos de Wilcoxon. Pero cuando corro ambas funciones en los mismos datos, consigo los valores de p que difieren en varios órdenes de magnitud:scipy.stats.ranksums de python contra wilcox.test de R

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) 

Así que R me da 1e -7 mientras que Python me da 1e-5.

¿De dónde viene esta diferencia y cuál es el valor de p 'correcto'?

Respuesta

19

Depende de la elección de opciones (exacta vs una aproximación normal, con o sin corrección de continuidad):

por defecto de R:

Por defecto (si 'exacta' no se especifica), un valor de p exacto se calcula si las muestras contienen menos de 50 valores finitos y no hay relaciones. De lo contrario, se usa una aproximación normal.

predeterminado (como se muestra más arriba):

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 

aproximación normal con corrección de continuidad:

> 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 

aproximación normal sin corrección de continuidad:

> (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 

Por un poco más precisión:

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

Parece que el otro valor Python le está dando (4.415880433163923) es el Z-score:

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

puedo apreciar con ganas de saber lo que está pasando, pero también me gustaría señalar que raramente hay una diferencia práctica entre p=1e-7 y p=1e-5 ...

+0

Sí, Scipy devuelve el puntaje z aquí. http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ranksums.html –

+1

Creo que también pueden existir diferencias cuando se manejan las ligaduras, que pueden tener que manejarse específicamente en scipy. – seberg

+0

¡Gracias por la explicación! ¿Sabes si hay alguna manera de forzar a Scipy a calcular un valor p exacto y también a manejar lazos? Sé que hay una función alternativa en Scipy llamada scipy.stats.mannwhitneyu que maneja vínculos y hace una corrección de continuidad, pero aún no es exacta y los documentos indican que debo tener al menos 20 muestras para cada uno de todos modos. – Nils

Cuestiones relacionadas