2012-05-22 9 views
15

Sto calcolando il rho di Spearman su piccole serie di classifiche accoppiate. Spearman è noto per non aver maneggiato correttamente le cravatte. Ad esempio, prendendo 2 set di 8 simile, anche se 6 sono legami in uno dei due gruppi, la correlazione è fino a molto alto:Corrispondenza e legami di Spearman

> 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 

E il valore p < .05, che sembra un abbastanza alta significatività statistica per questi dati. Esiste una versione corretta di Spearman in R? Qual è la migliore formula fino ad oggi per calcolarla con molte cravatte?

risposta

21

Beh, Kendall tau correlazione di rango è anche un test non parametrico per la dipendenza statistica tra due ordinale (o grado-trasformata) variabili - come Spearman di, ma a differenza di Spearman di, in grado di gestire i legami.

In particolare, ci sono tre Kendall tau statistiche - tau-a, tau-b e tau-c. tau-b è specificamente adattato per gestire le cravatte.

La tau-b statistica gestisce legami (cioè, entrambi i membri della coppia hanno lo stesso valore ordinale) da un termine divisore, che rappresenta la media geometrica tra il numero di coppie non legato su xe il numero non legato a y.

Kendall's tau non è Spearman - non sono uguali, ma sono anche molto simili. Dovrai decidere, in base al contesto, se i due sono abbastanza simili da poter essere sostituiti con l'altro.

Ad esempio, tau-b:

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

P: numero di coppie concordanti ('concordante' indica i ranghi di ciascun membro della coppia di valori concordare)

Q: numero di coppie discordanti

X0: numero di coppie non legato sulla x

Y0: numero di coppie non legato sulla y

V'è infatti una variante di rho di Spearman che rappresenta esplicitamente legami. In situazioni in cui avevo bisogno di una statistica di correlazione di rango non parametrico, ho sempre scelto tau over rho. Il motivo è che rho somma gli errori quadrati, mentre tau somma le discrepanze assolute. Dato che sia tau che rho sono statistiche competenti e siamo lasciati a scegliere, mi è sempre sembrato un rigore lineare sulle discrepanze (tau), un modo più naturale per esprimere la correlazione di rango. Questa non è una raccomandazione, il tuo contesto potrebbe essere molto diverso e dettare il contrario.

+0

PS: in realtà la letteratura parla di un "lanciere tie-corretto": http://www.springerlink.com/content/j820615r16j27308 – Mulone

+0

Un altro esempio di Spearman corretto per la correzione http://www.springerlink.com/content/t8110r4733g85162/ – Mulone

+0

@Mulone non ho menzionato il corretto Spearman nella mia risposta originale (sebbene l'ho modificato proprio ora) perché dopo aver letto la tua Q, Ho avuto l'impressione che tu fossi al corrente di queste statistiche statistiche * corrette *. In ogni caso, la mia risposta sarebbe stata la stessa (pref per tau) ma ho specificamente menzionato/distinto corretto rho nella mia modifica. – doug

9

Penso che il trucco sia exact=FALSE.

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ì, grazie! – ProfVersaggi

+3

Questo potrebbe eliminare l'errore, ma non risolve il problema se sia ragionevole farlo o meno. Si noti che il valore p non è cambiato, il che significa che l'assunzione della distribuzione t è ancora in uso, come visto da? Cor.test. – Ashe

5

cor.test con method = "lanciere" effettivamente calcola coefficiente Spearman corretto per legami. L'ho controllato calcolando "manualmente" i coefficienti di Spearman corretti e non vincolati dalle equazioni in Zar 1984, Analisi Biostatistica. Ecco il codice - basta sostituire i propri nomi delle variabili per controllare da sé:

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

stavo avendo un problema simile e leggendo le risposte qui e il file della Guida RI visto che, quando si hanno legami, è avere per aggiungere il parametro exact = FALSE alla funzione cor.test(). Aggiungendo questo, non tenta di calcolare un valore P esatto, ma invece "la statistica del test è la stima scalata a media zero e varianza unitaria, ed è approssimativamente distribuita normalmente". Il risultato, nel mio caso, era esattamente lo stesso, ma senza l'avvertimento sui legami.

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

Sarebbe ancora valido se i tuoi dati non sono normalmente distribuiti? che è una delle ragioni per cui si usa il grado di spearmans rispetto alla correlazione del momento di prodotto di pearson –

4
  • legami con correzione Spearman

    Utilizzando method="spearman" ti dà i legami con correzione Spearman. Il rho di Spearman, secondo la definizione, è semplicemente il coefficiente di correlazione campionaria di Pearson calcolato per dei dati di esempio. Quindi funziona sia in presenza che in assenza di legami. Si può vedere che dopo aver sostituito i dati originali con i loro ranghi (midranks per cravatte) e l'utilizzo di method="pearson", si otterrà lo stesso risultato:

    > 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 
    

    Avviso, esiste un semplificate no-legami Spearman versione, viene infatti utilizzato nell'implementazione cor.test() in assenza di vincoli, ma è equivalente alla definizione sopra riportata.

  • P-value

    In caso di parità di dati, esatti valori di p non vengono calcolati nè per Spearman né per misure Kendall (entro cor.test() attuazione), quindi l'avviso. Come accennato nel post di Eduardo, per non ottenere un avvertimento è necessario impostare exact=FALSE,

Problemi correlati