2012-05-22 17 views
15

Estoy computando el rho de Spearman en pequeños conjuntos de clasificaciones pareadas. Spearman es bien conocido por no manejar los lazos correctamente. Por ejemplo, tomar 2 series de 8 clasificaciones, incluso si 6 empates en uno de los dos conjuntos, la correlación es hasta muy alto:Correlación de Spearman y vínculos

> cor.test(c(1,2,3,4,5,6,7,8), c(0,0,0,0,0,0,7,8), method="spearman") 

    Spearman's rank correlation rho 

S = 19.8439, p-value = 0.0274 

sample estimates: 
     rho 
0.7637626 

Warning message: 
Cannot compute exact p-values with ties 

Y el valor de p < 0,05, lo que parece una bonita alta significación estadística para estos datos. ¿Hay una versión corregida de lazos de Spearman en R? ¿Cuál es la mejor fórmula hasta la fecha para calcularlo con muchos vínculos?

Respuesta

21

Bueno, Kendall tau rango correlación es también una prueba no paramétrica para la dependencia estadística entre dos ordinal (o rango-transformado) las variables - como Spearman de, pero a diferencia de Spearman, puede manejar lazos.

Más específicamente, hay tres estadísticas de tau Kendall - tau-a, tau-b y tau-c. tau-b está específicamente adaptado para manejar ataduras.

El tau-b estadística maneja lazos (es decir, ambos miembros de la pareja tienen el mismo valor ordinal) por un término divisor, que representa la media geométrica entre el número de pares no atada en x y el número no atado en y.

La tau de Kendall no es Spearman's, no son lo mismo, pero también son bastante similares. Tendrás que decidir, en función del contexto, si los dos son lo suficientemente similares como uno puede ser sustituido por el otro.

Por ejemplo, tau-b:

Kendall_tau_b = (P - Q)/((P + Q + Y0)*(P + Q + X0))^0.5 

P: número de pares concordantes ('concordante' significa las filas de cada miembro del par de puntos de datos de acuerdo)

Q: número de pares discordantes

X0: número de pares no vinculados en x

Y0: número de pares no vinculados en Y

Hay, de hecho, una variante de rho de Spearman que tiene en cuenta explícitamente para los lazos. En situaciones en las que necesitaba una estadística de correlación de rango no paramétrica, siempre he elegido tau sobre rho. La razón es que rho suma los errores cuadrados, mientras que tau suma las discrepancias absolutas . Dado que tanto tau como rho son estadísticas competentes y que tenemos que elegir, una penalización lineal sobre las discrepancias (tau) siempre me ha parecido una forma más natural de expresar la correlación de rangos. Esa no es una recomendación, su contexto puede ser bastante diferente y dictar lo contrario.

+0

PD: en realidad la literatura menciona un "tie-Spearman corregido": http://www.springerlink.com/content/j820615r16j27308 – Mulone

+0

Otro ejemplo de Spearman con correlación de enlaces http://www.springerlink.com/content/t8110r4733g85162/ – Mulone

+0

@Mulone No mencioné el Spearman corregido en mi respuesta original (aunque lo edité justo ahora) porque después de leer su Q, tuve la impresión de que conocía estas estadísticas estadísticas * corregidas *. En cualquier caso, mi respuesta habría sido la misma (pref tau) pero he mencionado específicamente/distinguí rho corregido en mi edición. – doug

9

Creo que exact=FALSE hace el truco.

cor.test(c(1,2,3,4,5,6,7,8), c(0,0,0,0,0,0,7,8), method="spearman", exact=FALSE) 

    Spearman's rank correlation rho 

data: c(1, 2, 3, 4, 5, 6, 7, 8) and c(0, 0, 0, 0, 0, 0, 7, 8) 
S = 19.8439, p-value = 0.0274 
alternative hypothesis: true rho is not equal to 0 
sample estimates: 
     rho 
0.7637626 
+0

Sí lo hace, ¡gracias! – ProfVersaggi

+3

Esto puede suprimir el error, pero no aborda si es razonable hacerlo o no. Observe que el valor de p no se modifica, lo que significa que la suposición de distribución t todavía se está utilizando, como se ve por? Cor.test. – Ashe

5

cor.test con method = "Spearman" en realidad calcula coeficiente de Spearman corregido para los lazos. Lo he comprobado "manualmente" calculando los coeficientes de Spearman corregidos y no corregidos de las ecuaciones en Zar 1984, Análisis bioestadístico. Aquí está el código - sólo sustituir sus propios nombres de variables para comprobar por sí mismo:

ym <- data.frame(lousy, dors) ## my data 

## ranking variables 
ym$l <- rank(ym$lousy) 
ym$d <- rank(ym$dors) 


## calculating squared differences between ranks 
ym$d2d <- (ym$l-ym$d)^2 



## calculating variables for equations 19.35 and 19.37 in Zar 1984 

lice <- as.data.frame(table(ym$lousy)) 

lice$t <- lice$Freq^3-lice$Freq 

dorsal <- as.data.frame(table(ym$dors)) 

dorsal$t <- dorsal$Freq^3-dorsal$Freq 

n <- nrow(ym) 
sum.d2 <- sum(ym$d2d) 
Tx <- sum(lice$t)/12 
Ty <-sum(dorsal$t)/12 


## calculating the coefficients 

rs1 <- 1 - (6*sum.d2/(n^3-n)) ## "standard" Spearman cor. coeff. (uncorrected for ties) - eq. 19.35 

rs2 <- ((n^3-n)/6 - sum.d2 - Tx - Ty)/sqrt(((n^3-n)/6 - 2*Tx)*((n^3-n)/6 - 2*Ty)) ## Spearman cor.coeff. corrected for ties - eq.19.37 


##comparing with cor.test function 
cor.test(ym$lousy,ym$dors, method="spearman") ## cor.test gives tie-corrected coefficient! 
1

que estaba teniendo un problema similar y mediante la lectura de las respuestas aquí y el archivo de ayuda en RI vio que, cuando se tiene lazos, que tienen para agregar el parámetro exact = FALSE) a la función cor.test(). Al agregar esto, no intenta calcular un valor P exacto, sino que "el estadístico de prueba es la estimación escalada a media cero y varianza unitaria, y se distribuye aproximadamente de forma normal". El resultado, en mi caso, fue exactamente el mismo, pero sin advertencias sobre lazos.

cor.test(x, y, method = "spearm", exact = FALSE) 
+0

¿Sería esto válido si sus datos no se distribuyen normalmente? que es una razón para usar el rango de spearmans sobre la correlación producto-momento de Pearson –

4
  • lazos con corrección de Spearman

    Usando method="spearman" le da los lazos con corrección de Spearman. La rho de Spearman, de acuerdo con la definición, es simplemente el coeficiente de correlación de muestra de Pearson calculado para rangos de datos de muestra. Por lo tanto, funciona tanto en presencia como en ausencia de vínculos. Se puede ver que después de sustituir los datos originales con sus filas (midranks para durmientes) y el uso de method="pearson", obtendrá el mismo resultado:

    > cor.test(rank(c(1,2,3,4,5,6,7,8)), rank(c(0,0,0,0,0,0,7,8)), method="pearson") 
    
    Pearson's product-moment correlation 
    
    data: rank(c(1, 2, 3, 4, 5, 6, 7, 8)) and rank(c(0, 0, 0, 0, 0, 0, 7, 8)) 
    t = 2.8983, df = 6, p-value = 0.0274 
    alternative hypothesis: true correlation is not equal to 0 
    95 percent confidence interval: 
    0.1279559 0.9546436 
    sample estimates: 
        cor 
    0.7637626 
    

    Aviso, existe una simplificados sin corbata Spearman versión, que de hecho se usa en la implementación cor.test() en ausencia de vínculos, pero es equivalente a la definición anterior.

  • valor P

    En caso de empate en los datos, los valores p exactos no se computan ni a favor ni de Spearman para las medidas de Kendall (dentro cor.test() aplicación), de ahí la advertencia. Como se ha mencionado en el post de Eduardo, por no conseguir una advertencia que debe establecer exact=FALSE,

Cuestiones relacionadas