web-dev-qa-db-fra.com

Corrélation de Spearman et liens

Je calcule le rho de Spearman sur de petits ensembles de classements par paires . Par exemple, en prenant 2 ensembles de 8 classements, même si 6 sont des égalités dans l’un des deux ensembles, la corrélation est très élevée:

> 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

Et la valeur p <0,05, ce qui semble être une signification statistique assez élevée pour ces données . Existe-t-il une version de Spearman corrigée des liens de Rear dans R? Quelle est la meilleure formule à ce jour pour la calculer beaucoup de cravates?

20
Mulone

Eh bien,La corrélation de rangs de Kendall tauest également un test non paramétrique pour la dépendance statistique entre deux variables ordinales (ou transformées en rangs) - comme celle de Spearman, mais contrairement à celle de Spearman, peut gérer les liens .

Plus précisément, il existe trois statistiques de Kendall tau - tau-a, tau-b et tau-c. tau-b est spécialement adapté pour gérer les cravates.

La statistique tau-b traite ties (c'est-à-dire que les deux membres de la paire ont la même valeur ordinale) par un diviseur, qui représente la moyenne géométrique entre le nombre de paires non liées sur x et le nombre non lié sur y.

Le tau de Kendall n'est pas celui de Spearman - ils ne sont pas identiques, mais ils sont également très similaires. Vous devrez décider, en fonction du contexte, si les deux sont suffisamment similaires pour que l'un puisse être substitué à l'autre.

Par exemple, tau-b :

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

P: nombre de paires concordantes ('concordant' signifie que les rangs de chaque membre de la paire de points de données concordent)

Q: nombre de paires discordantes

X0 : nombre de paires non liées sur x

Y0 : nombre de paires non liées sur y

Il existe en fait une variante du rho de Spearman qui explique explicitement les liens. Dans les cas où j'avais besoin d'une statistique de corrélation de rang non paramétrique, j'ai toujours choisi tau plutôt que rho. La raison en est que rho additionne les squared errors, tandis que tau additionne les écarts absolus . Étant donné que tau et rho sont tous deux des statistiques compétentes et qu'il ne nous reste plus qu'à choisir, une pénalité linéaire en cas de divergence (tau) m'a toujours paru, un moyen plus naturel d'exprimer la corrélation de rang. Ce n’est pas une recommandation, votre contexte pourrait être très différent et indiquer autrement.

27
doug

Je pense que exact=FALSE fait le tour.

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 
12
Eduardo Maçan

cor.test avec method = "spearman" calcule effectivement le coefficient de Spearman corrigé pour les égalités. Je l'ai vérifié en calculant "manuellement" les coefficients de Spearman corrigés et non corrigés des équations dans Zar 1984, Biostatistical Analysis. Voici le code - remplacez simplement vos propres noms de variables pour vérifier par vous-même:

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!
5
tenar
  • Lancier corrigé

    Utiliser method="spearman" vous donne le Spearman corrigé. Le rho de Spearman, selon la définition, est simplement le coefficient de corrélation d'échantillon de Pearson calculé pour ranks des données d'échantillon. Cela fonctionne donc aussi bien en présence qu'en l'absence de liens . Vous pouvez voir qu'après avoir remplacé vos données d'origine par leurs rangs (midranks pour les liens) et utilisé method="pearson", vous obtiendrez le même résultat: 

    > 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 
    

    Notez qu'il existe une version simplifiée de Spearman no-ties, qui est en fait utilisée dans l'implémentation cor.test() en l'absence de liens, mais elle est équivalente à la définition ci-dessus.

  • Valeur P

    En cas d'égalité dans les données, les valeurs p exactes ne sont calculées ni pour Spearman, ni pour les mesures de Kendall (dans la version cor.test(), par conséquent), d'où l'avertissement. Comme mentionné dans l'article d'Eduardo, pour ne pas recevoir d'avertissement, vous devez définir exact=FALSE

4
hannafrc

J'avais un problème similaire et en lisant les réponses ici et le fichier d'aide sur R, j'ai constaté que, lorsque vous avez des liens, vous devez ajouter le paramètre exact = FALSE) à la fonction cor.test(). En ajoutant cela, il ne tente pas de calculer une valeur P exacte, mais plutôt "la statistique de test correspond à l'estimation mise à l'échelle à la variance moyenne et unité zéro et est approximativement normalement distribuée" ..__ exactement la même chose, mais sans avertissement sur les cravates.

cor.test(x, y, method = "spearm", exact = FALSE)
1
liana_oliveira

Le document "Un nouveau coefficient de corrélation de rang avec application au problème du classement par consensus" vise à résoudre le problème du classement avec égalité. Il mentionne également que Tau-b ne devrait pas être utilisé comme mesure de corrélation de classement pour mesurer la concordance entre les ordres faibles. 

Emond, E. J. et Mason, D. W. (2002), Un nouveau coefficient de corrélation de rang avec application au problème du classement par consensus. J. Multi ‐ Crit. Décis. Anal., 11: 17-28. doi: 10.1002/mcda.313

0
Moniba