Coefficiente di correlazione dei ranghi


13

Il solito coefficiente di correlazione (in 2d) misura quanto bene un insieme di punti può essere descritto da una linea e, in caso affermativo, il suo segno ci dice se abbiamo una correlazione positiva o negativa. Ma questo presuppone che le coordinate dei punti possano effettivamente essere interpretate quantitativamente, ad esempio come misurazioni.

Se non puoi farlo ma puoi comunque ordinare le coordinate, c'è il coefficiente di correlazione dei ranghi : misura quanto bene i punti possono essere descritti da una funzione monotonica .

Sfida

Dato un elenco di 2d punti, determinare il loro coefficiente di correlazione rango .

Dettagli

  • Puoi assumere che l'input sia numeri interi positivi (ma non è necessario) o qualsiasi altro valore "ordinabile".
  • I punti possono essere presi come un elenco di punti o due elenchi per le coordinate x e y o una matrice o un array 2d ecc.
  • L'output deve essere un tipo a virgola mobile o razionale, poiché dovrebbe rappresentare un numero reale compreso tra 0 e 1.

definizioni

Rango: dato un elenco di numeri X=[x(1),...,x(n)], possiamo assegnare un numero positivo rx(i)chiamato rango a ciascuna voce x(i). Lo facciamo ordinando l'elenco e assegnando l'indice di x(i)nell'elenco ordinato rx(i). Se due o più x(i)hanno lo stesso valore, utilizziamo semplicemente la media aritmetica di tutti gli indici corrispondenti come rango. Esempio:

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

Il numero 10appare due volte qui. Nell'elenco ordinato occuperebbe gli indici 2e 3. La media aritmetica di quelli è che 2.5i ranghi lo sono

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

Coefficiente di correlazione del rango : lasciate che [(x(1),y(1)),(x(2),y(2)),...,(x(n),y(n))]siano i punti dati in cui ciascuno x(i)ed y(i)è un numero reale (wlog. Si può presumere che sia un numero intero) Per ognuno i=1,...,ncalcoliamo il rango rx(i) e ry(i)di x(i)e y(i)rispettivamente.

Sia d(i) = rx(i)-ry(i)la differenza di rango e Ssia la somma S = d(1)^2 + d(2)^2 + ... + d(n)^2. Quindi viene dato il coefficiente di correlazione rango rho

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

Esempio

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   

Da wikipedia : "Solo se tutti gli n gradi sono numeri interi distinti , può essere calcolato utilizzando la formula popolare"
rahnema1

Che cosa vuoi dire con quello?
Flawr,

Dico che la formula che hai fornito è per i casi speciali in cui i ranghi sono numeri interi secondo Wikipedia. Comunque hai usato la formula per gradi come 2.5.
rahnema1,

Bene, questo è se stai usando numeri interi in primo luogo. E anche se lo stai facendo, otterrai comunque una buona approssimazione. Molti autori usano persino la formula di questa sfida come definizione. Inoltre, tieni presente che una classifica è instabile e non ha necessariamente un significato così rilevante come un normale coefficiente di correlazione. Ma tutto ciò è irrilevante per questa sfida.
Flawr,

Risposte:


5

MATL , 33 byte

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

Provalo online!

Spiegazione

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

4
Non ho mai visto qualcosa di simile alla schiacciamento della tastiera che effettivamente fa qualcosa prima. +1
HyperNeutrino

5

R , 64 60 byte

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

Provalo online!

rankin R è l'integrato che calcola il rango desiderato; il resto è solo la matematica per fare il resto del lavoro.

Grazie a CriminallyVulgar per aver salvato 4 byte

Come menzionato nei commenti , la definizione dichiarata del coefficiente di correlazione dei ranghi non corrisponde esattamente al coefficiente di correlazione di Spearman, altrimenti una risposta valida sarebbe di 26 byte:

function(x,y)cor(x,y,,"s")

2
Wee 4 byte tweak: (n ^ 3-n) per l'ultima parentesi
CriminallyVulgar

@CriminallyVulgar grazie! il mio matrimonio non è stato troppo lungo dopo il tuo commento, quindi non l'ho visto ...
Giuseppe,

3

Python 3 , 141 byte

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

Ciò definisce una funzione anonima che accetta input come due elenchi corrispondenti ai valori xe y. L'output viene restituito come valore a virgola mobile.

Provalo online!


2

Mathematica, 89 byte

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

Provalo online! (per lavorare sulla matematica, "Tr" è sostituito da "Totale")


0

Wolfram Language (Mathematica) , 18 byte

N[SpearmanRho@@#]&

Provalo online!


Sfortunatamente sembra che la definizione di RCC nella domanda non corrisponda esattamente a Spearman Rho - funziona solo nel caso di input interi distinti. Vedi ad esempio la mia risposta R o il commento in essa collegato.
Giuseppe,

L'autore della domanda sembra suggerire che qui vada bene . La domanda ha dato la formula di Spearman Rho come definizione, quindi la considero valida nonostante la sua inesattezza matematica.
nixpower,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.