Les rangs: la fonction rank() Fabrice Dessaint Inra, UMR1347 Agroécologie, Dijon Février 2016Version 1 Cette note présente la fonction rank() et le calcul des rangs réalisé par R. Les rangs Il existe plusieurs définitions du mot rang, mais dans ce document, on va appeler rang, la place occupée par un élément dans un ensemble préalablement classé selon un ordre déterminé 1. Les rangs interviennent dans le calcul d un certain nombre de statistiques 2 comme la médiane, les quartiles, la mesure de corrélation de Spearman,... et plus généralement dans les méthodes dites non paramétriques. 1. Ordre croissant ou décroissant, ordre alphabétique, ordre temporel,... 2. Statistique d ordre, statistiques de rang La fonction rank() Sous R 3, c est la fonction rank(), qui permet le calcul des rangs. Elle pos- 3. R version 3.2.3 (2015-12-10) sède 3 arguments et sa syntaxe est donnée ci-dessous : rank(x, na.last = TRUE, ties.method = c("average", "first", "random", "max", "min")) L argument = Cet argument renseigne sur le vecteur qui contient les valeurs dont on veut calculer le rang. C est le seul argument obligatoire. Il peut être érique (eric), complexe (complex), logique (logical) ou alphaérique (character). Selon le type de vecteur, l ordre utilisé pour classer les valeurs est différent. Pour un vecteur érique sans ex aequo et sans valeurs manquantes, les rangs correspondent aux places des éléments après classement par ordre croissant. La valeur la plus faible a le rang 1 et la valeur la plus forte le rang n (nombre d éléments du vecteur). Pour le vecteur érique suivant <- c(10, 3, 0, -2, -6) les rangs obtenus par défaut sont : rank(x=) [1] 5 4 3 2 1 L élément le plus petit (-6) a le rang 1 et l élément le plus grand (10), le rang 5 (la taille du vecteur). Pour un vecteur logique, l ordre croissant est FALSE, TRUE.
les rangs: la fonction rank() 2 logique <- c(true, FALSE) rank(x=logique) [1] 2 1 Pour un vecteur alphaérique, l ordre croissant est celui des lettres (a z) puis pour une même lettre, la forme minuscule avant la forme majuscule (a, A). alpha <- c("a", "A", "b", "B", "d", "D") alpha <- c("a", "A", "aa", "aa", "AA", "ab") Lorsque le vecteur comporte des caractères accentués, les caractères non accentués ont un rang plus faible que les caractères accentués. alpha <- c("a", "A", "à", "À", "c", "ç", "e", "é", "è", "u", "ù") 7 8 9 10 11 Lorsque le vecteur est composé de chaînes de nombres, ce n est pas l ordre croissant des nombres qui est utilisé. On conserve l ordre alphabétique avec la valeur "11" classée avant la valeur "2". alpha <- c("1", "11", "2", "20", "3") [1] 1 2 3 4 5 Enfin, lorsque le vecteur est composé de chaînes de caractères et de chaînes de nombres, ce sont ces derniers qui ont les rangs les plus faibles : alpha <- c("1", "11", "2", "20", "3", "aa", "aa", "AA", "ab") 7 8 9 L argument na.last=true Cet argument est facultatif. Il indique si on conserve les valeurs manquantes présentes dans le vecteur de sortie et dans ce cas, comment on les classe. On peut les supprimer du vecteur de sortie avec la valeur na.last=na. <- c(1, 2, NA, 5, 6) rank(x=, na.last=na) [1] 1 2 3 4
les rangs: la fonction rank() 3 Si on conserve les valeurs manquantes, on a trois possibilités : elles sont classées en début (FALSE) ou en fin (TRUE) de vecteur ou elles conservent leurs valeurs NA dans le vecteur des rangs. Dans le premier cas, elles ont les rangs les plus faible et dans le second cas, les rangs les plus fort. <- c(1, 2, 5, 6, NA, NA) rank(x=, na.last=true) rank(x=, na.last=false) [1] 3 4 5 6 1 2 Avec la valeur "keep", elles n ont pas de rang et conservent la valeur NA. <- c(1, 2, NA, 5, 6, NA) rank(x=, na.last="keep") [1] 1 2 NA 3 4 NA L argument ties.method="average" C est le dernier argument de la fonction. Il permet de traiter le cas de ex aequo. Il peut prendre 5 valeurs selon la méthode retenue. Valeurs : average, first, random, max, min La première valeur, ties.method="average", est celle par défaut. Elle donne un rang moyen pour les éléments qui ont la même valeur : <- c(1, 1, 2, 3, 5, 6, 10, 10, 10) rank(x=) [1] 1.5 1.5 3.0 4.0 5.0 6.0 8.0 8.0 8.0 Dans cet exemple, la valeur 1 apparaît 2 fois et elle occupe, après classement, les places 1 et 2. Son rang est la moyenne des places, soit 1.5. De même pour la valeur 10 qui apparaît 3 fois aux places 7 à 9 : son rang est de 8. Les rangs ne sont plus nécessairement des entiers et le rang le plus faible n a plus nécessairement la valeur 1 et le rang le plus fort la valeur n. La valeur ties.method="max" affecte aux valeurs identiques, le rang le plus fort dans les places possibles. Ainsi, pour la valeur 1, les places possibles sont 1 et 2 et le rang est 2. Pour la valeur 10 les places possibles sont 7, 8 ou 9, et le rang est 9. [1] 1 1 2 3 5 6 10 10 10 rank(x=, ties.method="max") [1] 2 2 3 4 5 6 9 9 9
les rangs: la fonction rank() 4 La valeur, ties.method="min" donne aux valeurs identiques le rang le plus faible dans les places possibles. Ainsi, pour la valeur 1, les places possibles sont 1 et 2 et le rang est 1. Pour la valeur 10 les places possibles sont 7, 8 ou 9, et le rang est 7. [1] 1 1 2 3 5 6 10 10 10 rank(x=, ties.method="min") [1] 1 1 3 4 5 6 7 7 7 Pour ces trois options les valeurs identiques ont le même rang. La valeur ties.method="first" affecte aux valeurs identiques, le rang correspondant à leur ordre d arrivée dans la séquence des places possibles. Par exemple, dans le vecteur suivant <- c(1,1,1) names() <- letters[1:3] a b c 1 1 1 les éléments (a, b, c) ont la même valeur 1. Dans le vecteur, l élément a est avant l élément b, lui même avant l élément c. On aura donc les rangs 1, 2, 3 pour les éléments a, b, c. rank(x=, ties.method="first") a b c 1 2 3 Si maintenant, on inverse l ordre du vecteur ( <- rev()) c b a 1 1 1 on a maintenant les rangs 3,2,1 pour les éléments a, b, c. rank(x=, ties.method="first") c b a 1 2 3 La valeur ties.method="random" donne aux valeurs identiques, une place tirée au hasard dans les places possibles. Ainsi, pour la valeur 1, les places possibles sont 1 et 2. Pour la valeur 10 les places possibles sont 7, 8 ou 9. <- c(1, 1, 2, 3, 5, 6, 10, 10, 10) rank(x=, ties.method="random")
les rangs: la fonction rank() 5 8 7 9 rank(x=, ties.method="random") 7 8 9 Pour ces 2 dernières options, chaque élément dans le vecteur possède un rang différent.