Coefficient de corrélation de rang

13

Le coefficient de corrélation habituel (en 2d) mesure dans quelle mesure un ensemble de points peut être décrit par une droite, et si oui, son signe nous indique si nous avons une corrélation positive ou négative. Mais cela suppose que les coordonnées des points peuvent effectivement être interprétées quantitativement, par exemple comme des mesures.

Si vous ne pouvez pas le faire mais vous pouvez toujours ordonner les coordonnées, il y a le coefficient de corrélation de rang : il mesure la façon dont les points peuvent être décrits par une fonction monotone .

Défi

À partir d'une liste de 2d points, déterminez leur coefficient de corrélation de rang .

Détails

  • Vous pouvez supposer que l'entrée est un entier positif (mais ce n'est pas obligatoire) ou toute autre valeur "triable".
  • Les points peuvent être considérés comme une liste de points, ou deux listes pour les coordonnées x et y ou une matrice ou un tableau 2D, etc.
  • La sortie doit être de type flottant ou rationnel, car elle doit représenter un nombre réel compris entre 0 et 1.

Définitions

Rang: Étant donné une liste de nombres, X=[x(1),...,x(n)]nous pouvons attribuer un numéro positif rx(i)appelé rang à chaque entrée x(i). Nous le faisons en triant la liste et en affectant l'index de x(i)dans la liste triée rx(i). Si deux ou plus x(i)ont la même valeur, alors nous utilisons simplement la moyenne arithmétique de tous les indices correspondants comme rang. Exemple:

          List: [21, 10, 10, 25, 3]
Indices sorted: [4, 2, 3, 5, 1]

Le numéro 10apparaît deux fois ici. Dans la liste triée, il occuperait les indices 2et 3. La moyenne arithmétique de ceux-ci est 2.5donc les rangs sont

         Ranks: [4, 2.5, 2.5, 5, 1]

Coefficient de corrélation de rang : Soit [(x(1),y(1)),(x(2),y(2)),...,(x(n),y(n))]les points donnés où chacun x(i)et y(i)est un nombre réel (wlog. Vous pouvez supposer que c'est un entier) Pour chacun, i=1,...,nnous calculons le rang rx(i) et ry(i)de x(i)et y(i)respectivement.

Soit d(i) = rx(i)-ry(i)la différence de rang et Ssoit la somme S = d(1)^2 + d(2)^2 + ... + d(n)^2. Ensuite, le coefficient de corrélation de rang rho est donné par

rho = 1 - 6 * S / (n * (n^2-1))

Exemple

x   y   rx              ry   d      d^2
21  15  4               5   -1      1
10  6   2&3 -> 2.5      2    0.5    0.25
10  7   2&3 -> 2.5      3   -0.5    0.25
25  11  5               4    1      1
3   5   1               1    0      0

    rho = 1 - 6 * (1+0.25+0.25+1)/(5*(5^2-1)) = 0.875   
flawr
la source
De wikipedia : "Seulement si tous les n rangs sont des entiers distincts , il peut être calculé en utilisant la formule populaire"
rahnema1
Que voulez-vous dire avec ça?
flawr
Je dis que la formule que vous avez fournie est pour les cas spéciaux où les rangs sont des entiers selon wikipedia. Cependant, vous avez utilisé la formule pour les rangs tels que 2.5.
rahnema1
Eh bien, c'est si vous utilisez des entiers en premier lieu. Et même si vous le faites, vous aurez toujours une bonne approximation. De nombreux auteurs utilisent même la formule de ce défi comme définition. De plus, gardez à l'esprit qu'un classement est instable et n'a pas nécessairement une signification aussi impactante qu'un coefficient de corrélation habituel. Mais tout cela n'est pas pertinent pour ce défi.
flawr

Réponses:

5

MATL , 33 octets

,it7#utb,&S]2XQw)]-Us6*1GntUq*/_Q

Essayez-le en ligne!

Explication

,           % Do...twice
  it        %   Input a numeric vector. Duplicate
  7#u       %   Replace each element by a unique integer label (1, 2, ...)
  t         %   Duplicate
  b         %   Bubble up: moves original numeric vector to top
  ,         %   Do...twice
    &S      %     Sort and push the indices of the sorting
  ]         %   End
            %   The above do...twice loop gives the sorted indices (as
            %   explained in the challenge text) for the current input
  2XQ       %   Compute average for entries with the same integer label
  w         %   Swap: move vector of integer labels to top
  )         %   Index. This gives the rank vector for the current input
]           % End
-           % Subtract the two results. Gives d
Us          % Square each entry, sum of vector. S
6*          % Times 6. Gives 6*S
1G          % Push first input vector again
n           % Number of entries. Gives n
t           % Duplicate 
Uq          % Square, minus 1. Gives n^2-1
*           % Times. Gives n*(n^2-1)
/           % Divide. Gives 6*S/(n*(n^2-1))
_Q          % Negate, plus 1. Gives 1-6*S/(n*(n^2-1))
Luis Mendo
la source
4
Je n'ai jamais vu quelque chose avec une telle ressemblance avec le brassage de clavier qui fait réellement quelque chose auparavant. +1
HyperNeutrino
5

R , 64 60 octets

function(x,y)1-6*sum((rank(x)-rank(y))^2)/((n=sum(x|1))^3-n)

Essayez-le en ligne!

rankdans R est le builtin qui calcule le rang souhaité; le reste n'est que le calcul pour faire le reste du travail.

Merci à CriminallyVulgar pour avoir économisé 4 octets

Comme mentionné dans les commentaires , la définition indiquée du coefficient de corrélation de rang ne correspond pas précisément au coefficient de corrélation Spearman, sinon une réponse valide serait de 26 octets:

function(x,y)cor(x,y,,"s")
Giuseppe
la source
2
Petit ajustement de 4 octets: (n ^ 3-n) pour la dernière tranche
CriminallyVulgar
@CriminallyVulgar merci! mon mariage n'a pas été trop long après ton commentaire donc je ne l'ai pas vu ...
Giuseppe
3

Python 3 , 141 octets

lambda X,Y,Q=lambda U,S=sorted:[S(U).index(y)+S(U).count(y)/2+.5for y in U]:1-6*sum((i[1]-i[0])**2for i in zip(Q(X),Q(Y)))/(len(X)**3-len(X))

Ceci définit une fonction anonyme qui prend l'entrée comme deux listes correspondant aux valeurs xet y. La sortie est renvoyée sous forme de valeur à virgule flottante.

Essayez-le en ligne!

R. Kap
la source
2

Mathematica, 89 octets

(F[x_]:=Min@N@Mean@Position[Sort@x,#]&;1-6Tr[(F@#/@#-F@#2/@#2)^2]/((y=Length@#)(y^2-1)))&

Essayez-le en ligne! (pour travailler les mathématiques, "Tr" est remplacé par "Total")

J42161217
la source
0

Wolfram Language (Mathematica) , 18 octets

N[SpearmanRho@@#]&

Essayez-le en ligne!

nixpower
la source
Malheureusement, il semble que la définition de RCC dans la question ne correspond pas précisément au Spearman Rho - cela ne fonctionne que dans le cas d'entrées entières distinctes. Voir par exemple ma réponse R ou le commentaire qui y est lié.
Giuseppe
L'auteur de la question semble suggérer que c'est bien ici . La question a donné la formule de Spearman Rho comme définition, donc je considérerais cela comme valide malgré son inexactitude mathématique.
nixpower