Współczynnik korelacji rang

13

Zwykły współczynnik korelacji (w 2d) mierzy, jak dobrze zestaw punktów można opisać linią, a jeśli tak, jego znak mówi nam, czy mamy korelację dodatnią czy ujemną. Zakłada się jednak, że współrzędne punktów mogą być interpretowane ilościowo, na przykład jako pomiary.

Jeśli nie możesz tego zrobić, ale nadal możesz uporządkować współrzędne, istnieje współczynnik korelacji rang : mierzy, jak dobrze punkty można opisać funkcją monotoniczną .

Wyzwanie

Biorąc pod uwagę listę punktów 2d, określ ich współczynnik korelacji rang .

Detale

  • Możesz założyć, że dane wejściowe są dodatnimi liczbami całkowitymi (ale nie musisz) lub dowolnymi innymi „sortowalnymi” wartościami.
  • Punkty można traktować jako listę punktów lub dwie listy dla współrzędnych xiy, macierzy lub tablicy 2d itp.
  • Dane wyjściowe muszą być zmiennoprzecinkowe lub wymierne, ponieważ powinny reprezentować liczbę rzeczywistą z zakresu od 0 do 1.

Definicje

Ranga: Na podstawie listy liczb X=[x(1),...,x(n)]możemy przypisać dodatnią liczbę o rx(i)nazwie ranga do każdego wpisu x(i). Robimy to, sortując listę i przypisując indeks x(i)w posortowanej liście rx(i). Jeśli dwa lub więcej x(i)mają tę samą wartość, to po prostu używamy średniej arytmetycznej wszystkich odpowiednich wskaźników jako rangi. Przykład:

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

Liczba 10pojawia się tutaj dwa razy. Na posortowanej liście zajmowałby indeksy 2i 3. Średnia arytmetyczna tych liczb jest 2.5taka, jak w przypadku rang

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

Współczynnik korelacji rang : Pozwolić [(x(1),y(1)),(x(2),y(2)),...,(x(n),y(n))]być podane punkty, w których każdy x(i)i y(i)jest to liczba rzeczywista Dla każdego (wlog można założyć, że jest liczbą całkowitą.) i=1,...,nMożemy obliczyć rangę rx(i) i ry(i)od x(i)i y(i)odpowiednio.

Niech d(i) = rx(i)-ry(i)będzie różnica rang i niech Sbędzie sumą S = d(1)^2 + d(2)^2 + ... + d(n)^2. Następnie współczynnik korelacji rang rho jest podawany przez

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

Przykład

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   
wada
źródło
Z wikipedii : „Tylko jeśli wszystkie n rang są odrębnymi liczbami całkowitymi , można to obliczyć przy użyciu popularnej formuły”
rahnema1
Co chcesz z tym powiedzieć?
flawr
Mówię, że wzór, który podałeś, dotyczy szczególnych przypadków, w których szeregi są liczbami całkowitymi według Wikipedii. Jednak użyłeś wzoru na takie stopnie, jak 2.5.
rahnema1
Cóż, to znaczy, jeśli używasz liczb całkowitych. I nawet jeśli to robisz, nadal będziesz mieć dobre przybliżenie. Wielu autorów używa nawet definicji tego wyzwania jako definicji. Ponadto należy pamiętać, że ranking jest niestabilny i niekoniecznie ma tak znaczący wpływ, jak zwykły współczynnik korelacji. Ale to wszystko nie ma znaczenia dla tego wyzwania.
flawr

Odpowiedzi:

5

MATL , 33 bajty

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

Wypróbuj online!

Wyjaśnienie

,           % 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
źródło
4
Nigdy nie widziałem czegoś tak podobnego do mashingu klawiatury, który faktycznie coś robi wcześniej. +1
HyperNeutrino
5

R , 64 60 bajtów

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

Wypróbuj online!

rankw R jest wbudowanym, który oblicza pożądaną rangę; reszta to tylko matematyka do wykonania reszty pracy.

Podziękowania dla CriminallyVulgar za zapisanie 4 bajtów

Jak wspomniano w komentarzach , podana definicja współczynnika korelacji rang nie odpowiada dokładnie współczynnikowi korelacji Spearmana, w przeciwnym razie poprawna odpowiedź wynosiłaby 26 bajtów:

function(x,y)cor(x,y,,"s")
Giuseppe
źródło
2
Wee 4-bajtowa poprawka: (n ^ 3-n) dla ostatniego przedziału
CriminallyVulgar
@CriminallyVulgar dzięki! mój ślub nie był zbyt długi po twoim komentarzu, więc go nie widziałem ...
Giuseppe
3

Python 3 , 141 bajtów

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

Definiuje to anonimową funkcję, która pobiera dane wejściowe jako dwie listy odpowiadające wartościom xi y. Dane wyjściowe są zwracane jako wartość zmiennoprzecinkowa.

Wypróbuj online!

R. Kap
źródło
2

Mathematica, 89 bajtów

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

Wypróbuj online! (aby pracować z matematyką, „Tr” zastępuje się „Total”)

J42161217
źródło
0

Wolfram Language (Mathematica) , 18 bajtów

N[SpearmanRho@@#]&

Wypróbuj online!

nixpower
źródło
Niestety wygląda na to, że definicja RCC w pytaniu nie pasuje dokładnie do Spearman Rho - działa tylko w przypadku różnych liczb całkowitych wejściowych. Zobacz na przykład moją odpowiedź R lub dołączony do niej komentarz.
Giuseppe,
Autor pytania wydaje się sugerować, że tutaj jest w porządku . Pytanie podało formułę Spearmana Rho jako definicję, więc uważam ją za słuszną pomimo jej matematycznej niedokładności.
nixpower,