Ранг Коефіцієнт кореляції


13

Звичайний коефіцієнт кореляції (в 2d) вимірює, наскільки добре набір точок можна описати рядком, і якщо так, то його знак говорить нам, чи є у нас позитивна чи негативна кореляція. Але це передбачає, що координати точок насправді можуть інтерпретуватися кількісно, ​​наприклад, як вимірювання.

Якщо ви не можете цього зробити, але ви все одно можете замовити координати, є коефіцієнт кореляції рангів : він вимірює, наскільки добре точки можна описати монотонною функцією.

Виклик

Давши перелік 2d балів, визначте їх коефіцієнт кореляції рангів .

Деталі

  • Ви можете вважати, що вхід є цілими натуральними числами (але цього не потрібно) або будь-якими іншими "відсортованими" значеннями.
  • Точки можна сприймати як список точок або два списки для x- і y-координат або матриці або 2d-масиву тощо.
  • Вихід повинен бути з плаваючою точкою або раціональним типом, оскільки він повинен представляти реальне число між 0 і 1.

Визначення

Ранг: Даючи список номерів, X=[x(1),...,x(n)]ми можемо призначити позитивне число, яке rx(i)називається рангом, для кожного запису x(i). Ми робимо це шляхом сортування списку та присвоєння індексу x(i)у відсортованому списку rx(i). Якщо два або більше x(i)мають однакове значення, то ми просто використовуємо середнє арифметичне всіх відповідних індексів як ранг. Приклад:

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

Тут 10з'являється два рази. У відсортованому списку він займав би індекси 2та 3. Середнє арифметичне серед них 2.5так, чини є

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

Ранг Коефіцієнт кореляції : Нехай [(x(1),y(1)),(x(2),y(2)),...,(x(n),y(n))]бути задані точки , де кожен x(i)і y(i)дійсне число для кожного (без втрати спільності можна вважати , що це ціле число.) i=1,...,nОбчислимо ранг rx(i) і ry(i)з x(i)і y(i)відповідно.

Нехай d(i) = rx(i)-ry(i)буде різниця в рангу і нехай Sбуде сума S = d(1)^2 + d(2)^2 + ... + d(n)^2. Тоді коефіцієнт кореляції рангів rho задається числом

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

Приклад

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   

З Вікіпедії : "Тільки якщо всі n рангів є різними цілими числами , це можна обчислити, використовуючи популярну формулу"
rahnema1

Що ти хочеш сказати з цим?
недолік

Я кажу, що формула, яку ви надали, стосується особливих випадків, коли ранги є цілими числами згідно вікіпедії. Однак ви використовували формулу для таких рангів, як 2.5.
rahnema1

Добре, що якщо ви в першу чергу використовуєте цілі числа. І навіть якщо ви це зробите, ви все одно отримаєте гарне наближення. Багато авторів навіть використовують формулу цього виклику як визначення. Крім того, майте на увазі, що рейтинг нестабільний і не обов'язково має таке вражаюче значення, як звичайний коефіцієнт кореляції. Але все це не має значення для цього виклику.
flawr

Відповіді:


5

MATL , 33 байти

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

Спробуйте в Інтернеті!

Пояснення

,           % 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
Я ніколи не бачив чогось із подібною схожістю на розтирання на клавіатурі, що насправді щось раніше робило. +1
HyperNeutrino

5

R , 64 60 байт

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

Спробуйте в Інтернеті!

rankв R - вбудований, який обчислює бажаний ранг; решта - лише математика, щоб виконати решту роботи.

Завдяки CriminallyVulgar за збереження 4 байтів

Як зазначалося в коментарях , зазначене визначення коефіцієнта кореляції рангів не відповідає точно коефіцієнту кореляції Спірмена, інакше вірною відповіддю буде 26 байт:

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

2
4-байтний перехід: (n ^ 3-n) для останньої дужки
Кримінально-

@CriminallyVulgar дякую! моє весілля було не надто довгим після вашого коментаря, тому я його не бачив ...
Джузеппе

3

Python 3 , 141 байт

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

Це визначає анонімну функцію, яка приймає введення як два списки, що відповідають значенню xта y. Виведення повертається як значення з плаваючою комою.

Спробуйте в Інтернеті!



0

На жаль, схоже, що визначення RCC у питанні не відповідає точно Spearman Rho - воно працює лише у випадку різних цілих входів. Дивіться, наприклад, мою відповідь R або коментар, пов'язаний в ній.
Джузеппе

Автор запитання, здається, припускає, що тут добре . Питання дало формулу Spearman Rho як визначення, тому я вважаю це дійсним, незважаючи на математичну неточність.
nixpower
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.