Coeficiente de correlação de classificação

13

O coeficiente de correlação usual (em 2d) mede quão bem um conjunto de pontos pode ser descrito por uma linha e, se sim, seu sinal nos diz se temos uma correlação positiva ou negativa. Mas isso pressupõe que as coordenadas dos pontos possam realmente ser interpretadas quantitativamente, por exemplo, como medidas.

Se você não pode fazer isso, mas ainda pode ordenar as coordenadas, existe o coeficiente de correlação de classificação : Ele mede quão bem os pontos podem ser descritos por uma função monotônica .

Desafio

Dada uma lista de pontos 2d, determine seu coeficiente de correlação de classificação .

Detalhes

  • Você pode assumir que a entrada seja um número inteiro positivo (mas não precisa) ou qualquer outro valor "classificável".
  • Os pontos podem ser tomados como uma lista de pontos, ou duas listas para as coordenadas x e y ou uma matriz ou matriz 2D, etc.
  • A saída deve ser um ponto flutuante ou tipo racional, pois deve representar um número real entre 0 e 1.

Definições

Classificação: dada uma lista de números X=[x(1),...,x(n)], podemos atribuir um número positivo rx(i)chamado classificação a cada entrada x(i). Fazemos isso classificando a lista e atribuindo o índice x(i)na lista classificada rx(i). Se dois ou mais x(i)tiverem o mesmo valor, usamos apenas a média aritmética de todos os índices correspondentes como classificação. Exemplo:

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

O número 10aparece duas vezes aqui. Na lista ordenada, ocuparia os índices 2e 3. A média aritmética desses é 2.5que as fileiras são

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

Coeficiente de correlação de classificação : [(x(1),y(1)),(x(2),y(2)),...,(x(n),y(n))]sejam os pontos dados em que cada um x(i)e y(i)é um número real (wlog. Você pode assumir que é um número inteiro). Para cada um i=1,...,n, calculamos a classificação rx(i) e ry(i)de x(i)e, y(i)respectivamente.

Let d(i) = rx(i)-ry(i)Ser a diferença de classificação e Let SSer a soma S = d(1)^2 + d(2)^2 + ... + d(n)^2. Então o coeficiente de correlação de classificação rho é dado por

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

Exemplo

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   
flawr
fonte
De wikipedia : "Apenas se todos os n fileiras são inteiros distintos , pode ser calculado usando a fórmula popular"
rahnema1
O que você quer dizer com isso?
flawr
Eu digo que a fórmula que você forneceu é para os casos especiais em que as fileiras são números inteiros, de acordo com a wikipedia. No entanto, você usou a fórmula para as fileiras, como 2.5.
rahnema1
Bem, isso é se você estiver usando números inteiros em primeiro lugar. E mesmo se você estiver fazendo isso, ainda terá uma boa aproximação. Muitos autores ainda usam a fórmula desse desafio como definição. Além disso, lembre-se de que uma classificação é instável e não tem necessariamente um significado tão impactante como um coeficiente de correlação usual. Mas tudo isso é irrelevante para esse desafio.
flawr

Respostas:

5

MATL , 33 bytes

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

Experimente online!

Explicação

,           % 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
fonte
4
Eu nunca vi algo parecido com o teclado que realmente faz algo antes. +1
HyperNeutrino
5

R , 64 bytes 60

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

Experimente online!

rankem R é o valor interno que calcula a classificação desejada; o resto é apenas a matemática para fazer o resto do trabalho.

Obrigado a CriminallyVulgar por salvar 4 bytes

Como mencionado nos comentários , a definição declarada de coeficiente de correlação de classificação não corresponde exatamente ao coeficiente de correlação de Spearman; caso contrário, uma resposta válida seria 26 bytes:

function(x,y)cor(x,y,,"s")
Giuseppe
fonte
2
Wee ajuste de 4 bytes: (n ^ 3-n) para o último suporte
CriminallyVulgar
@CriminallyVulgar thanks! meu casamento não foi muito tempo depois de seu comentário, então eu não vê-lo ...
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))

Isso define uma função anônima que recebe entrada como duas listas correspondentes aos valores xe y. A saída é retornada como um valor de ponto flutuante.

Experimente online!

R. Kap
fonte
2

Mathematica, 89 bytes

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

Experimente online! (para trabalhar em matemática, "Tr" é substituído por "Total")

J42161217
fonte
0

Wolfram Language (Mathematica) , 18 bytes

N[SpearmanRho@@#]&

Experimente online!

nixpower
fonte
Infelizmente, parece que a definição de RCC na questão não corresponde exatamente ao Spearman Rho - funciona apenas no caso de entradas inteiras distintas. Veja, por exemplo, minha resposta R ou o comentário nela vinculado.
Giuseppe
O autor da pergunta parece sugerir que isso está bem aqui . A pergunta deu a fórmula de Spearman Rho como uma definição, então eu consideraria isso válido apesar de sua imprecisão matemática.
Nixpower 10/10