Rangkorrelationskoeffizient

13

Der übliche Korrelationskoeffizient (in 2d) misst, wie gut eine Menge von Punkten durch eine Linie beschrieben werden kann, und wenn ja, zeigt das Vorzeichen an, ob wir eine positive oder negative Korrelation haben. Dies setzt jedoch voraus, dass Koordinaten der Punkte tatsächlich quantitativ interpretiert werden können, beispielsweise als Messungen.

Wenn Sie das nicht können, aber trotzdem die Koordinaten ordnen können , gibt es den Rangkorrelationskoeffizienten : Er misst, wie gut die Punkte durch eine monotone Funktion beschrieben werden können.

Herausforderung

Bestimmen Sie anhand einer Liste von 2D-Punkten deren Rangkorrelationskoeffizienten .

Einzelheiten

  • Sie können davon ausgehen, dass es sich bei der Eingabe um positive Ganzzahlen handelt (dies ist jedoch nicht erforderlich) oder um andere "sortierbare" Werte.
  • Die Punkte können als eine Liste von Punkten oder zwei Listen für die x- und y-Koordinaten oder eine Matrix oder ein 2D-Array usw. genommen werden.
  • Die Ausgabe muss ein Gleitkomma- oder ein rationaler Typ sein, da sie eine reelle Zahl zwischen 0 und 1 darstellen sollte.

Definitionen

Rang: Ausgehend von einer Liste von Zahlen können X=[x(1),...,x(n)]wir jedem Eintrag eine positive Zahl mit dem rx(i)Namen Rang zuweisen x(i). Dazu sortieren wir die Liste und weisen den Index x(i)der sortierten Liste zu rx(i). Wenn zwei oder mehr x(i)den gleichen Wert haben, verwenden wir einfach das arithmetische Mittel aller entsprechenden Indizes als Rang. Beispiel:

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

Die Nummer 10erscheint hier zweimal. In der sortierten Liste würde es die Indizes 2und belegen 3. Das arithmetische Mittel davon ist 2.5so, wie die Reihen sind

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

Rangkorrelationskoeffizient : Es sei [(x(1),y(1)),(x(2),y(2)),...,(x(n),y(n))]die gegebene Punkte , an denen jeder x(i)und y(i)eine reelle Zahl für jede (oBdA Sie davon ausgehen , kann es eine ganze Zahl.) i=1,...,nWir berechnen Rang rx(i) und ry(i)von x(i)undy(i) jeweils.

Sei d(i) = rx(i)-ry(i)der Rangunterschied und sei Sdie Summe S = d(1)^2 + d(2)^2 + ... + d(n)^2. Dann ist der Rangkorrelationskoeffizient rho gegeben durch

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

Beispiel

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   
Fehler
quelle
Aus Wikipedia : "Nur wenn alle n Ränge unterschiedliche Ganzzahlen sind , kann sie mit der populären Formel berechnet werden"
rahnema1
Was willst du damit sagen?
Fehler
Ich sage, dass die Formel, die Sie angegeben haben, für die Sonderfälle gilt, in denen die Ränge laut Wikipedia ganze Zahlen sind. Sie haben jedoch die Formel für die Ränge wie verwendet 2.5.
rahnema1
Nun, das ist, wenn Sie in erster Linie Ganzzahlen verwenden. Und selbst wenn Sie dies tun, erhalten Sie dennoch eine gute Annäherung. Viele Autoren verwenden die Formel dieser Herausforderung sogar als Definition. Beachten Sie außerdem, dass ein Ranking instabil ist und nicht unbedingt eine so aussagekräftige Bedeutung hat wie ein gewöhnlicher Korrelationskoeffizient. All dies ist jedoch für diese Herausforderung unerheblich.
Fehler

Antworten:

5

MATL , 33 Bytes

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

Probieren Sie es online!

Erläuterung

,           % 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
quelle
4
Ich habe noch nie etwas mit einer solchen Ähnlichkeit zum Keyboard-Mashing gesehen, dass tatsächlich etwas vorher macht. +1
HyperNeutrino
5

R , 64 60 Bytes

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

Probieren Sie es online!

rankin R ist der eingebaute Wert, der den gewünschten Rang berechnet; der Rest ist nur die Mathematik, um den Rest der Arbeit zu erledigen.

Danke an CriminallyVulgar für das Speichern von 4 Bytes

Wie in den Kommentaren erwähnt , entspricht die angegebene Definition des Rangkorrelationskoeffizienten nicht genau dem Spearman-Korrelationskoeffizienten, andernfalls wäre eine gültige Antwort 26 Byte:

function(x,y)cor(x,y,,"s")
Giuseppe
quelle
2
Wee 4-Byte-Tweak: (n ^ 3-n) für die letzte Klammer
CriminallyVulgar
@CriminallyVulgar danke! Meine Hochzeit war nicht lange nach Ihrem Kommentar, also habe ich es nicht gesehen ...
Giuseppe
3

Python 3 , 141 Bytes

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))

Dies definiert eine anonyme Funktion, die Eingaben als zwei Listen entsprechend den Werten xund yannimmt. Die Ausgabe wird als Gleitkommawert zurückgegeben.

Probieren Sie es online!

R. Kap
quelle
2

Mathematica, 89 Bytes

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

Probieren Sie es online! (Um mathematisch arbeiten zu können, wird "Tr" durch "Total" ersetzt.)

J42161217
quelle
0

Wolfram Language (Mathematica) , 18 Byte

N[SpearmanRho@@#]&

Probieren Sie es online!

nixpower
quelle
Leider sieht es so aus, als ob die Definition von RCC in der Frage nicht genau mit dem Spearman Rho übereinstimmt - sie funktioniert nur bei bestimmten Ganzzahleingaben. Siehe zum Beispiel meine Antwort R oder den darin verlinkten Kommentar.
Giuseppe
Der Verfasser der Frage scheint darauf hinzuweisen, dass dies hier in Ordnung ist . Die Frage gab die Spearman-Rho-Formel als Definition an, sodass ich diese trotz ihrer mathematischen Ungenauigkeit für gültig halte.
Nixpower