Коэффициент ранговой корреляции


13

Обычный коэффициент корреляции (в 2d) измеряет, насколько хорошо набор точек может быть описан линией, и если да, его знак говорит нам, есть ли у нас положительная или отрицательная корреляция. Но это предполагает, что координаты точек могут фактически интерпретироваться количественно, например, как измерения.

Если вы не можете этого сделать, но все же можете упорядочить координаты, существует коэффициент ранговой корреляции : он измеряет, насколько хорошо точки могут быть описаны монотонной функцией.

Вызов

Учитывая список 2d точек, определите их ранг коэффициента корреляции .

Детали

  • Вы можете предположить, что входные данные являются положительными целыми числами (но это не обязательно) или любыми другими «сортируемыми» значениями.
  • Точки могут быть взяты как список точек, или два списка для x- и y-координат, или матрица, или двумерный массив и т. Д.
  • Выходные данные должны быть плавающей точкой или рациональным типом, поскольку они должны представлять собой действительное число от 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)является действительным числом (wlog. Вы можете предположить, что это целое число) Для каждого 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

Что ты хочешь сказать этим?
17

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

Хорошо, если вы используете целые числа в первую очередь. И даже если вы делаете это, вы все равно получите хорошее приближение. Многие авторы даже используют формулу этого вызова в качестве определения. Кроме того, имейте в виду, что ранжирование нестабильно и не обязательно имеет такое значимое значение, как обычный коэффициент корреляции. Но все это не имеет отношения к этому вызову.
17

Ответы:


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
Wee 4-байтовый твик: (n ^ 3-n) для последней скобки
CriminallyVulgar

@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 или комментарий, связанный с ним.
Джузеппе

Автор вопроса , кажется, предполагает , что это хорошо здесь . Этот вопрос дал формулу Спирмена Ро в качестве определения, поэтому я бы посчитал ее действительной, несмотря на ее математическую неточность.
nixpower
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.