Coeficiente de correlación de rango

13

El coeficiente de correlación habitual (en 2d) mide qué tan bien se puede describir un conjunto de puntos por una línea, y en caso afirmativo, su signo nos dice si tenemos una correlación positiva o negativa. Pero esto supone que las coordenadas de los puntos se pueden interpretar cuantitativamente, por ejemplo, como medidas.

Si no puede hacer eso, pero aún puede ordenar las coordenadas, existe el coeficiente de correlación de rango : mide qué tan bien los puntos pueden ser descritos por una función monotónica .

Desafío

Dada una lista de puntos 2d, determine su coeficiente de correlación de rango .

Detalles

  • Puede suponer que la entrada son enteros positivos (pero no es necesario) o cualquier otro valor "ordenable".
  • Los puntos se pueden tomar como una lista de puntos, o dos listas para las coordenadas X e Y o una matriz o matriz 2D, etc.
  • La salida debe ser un punto flotante o de tipo racional, ya que debe representar un número real entre 0 y 1.

Definiciones

Rango: Dada una lista de números X=[x(1),...,x(n)], podemos asignar un número positivo rx(i)llamado rango a cada entrada x(i). Lo hacemos ordenando la lista y asignando el índice de x(i)en la lista ordenada rx(i). Si dos o más x(i)tienen el mismo valor, entonces solo usamos la media aritmética de todos los índices correspondientes como rango. Ejemplo:

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

El número 10aparece dos veces aquí. En la lista ordenada ocuparía los índices 2y 3. La media aritmética de esos es 2.5que los rangos son

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

Coeficiente de correlación de rango : Sean [(x(1),y(1)),(x(2),y(2)),...,(x(n),y(n))]los puntos dados donde cada x(i)y y(i)es un número real (wlog. Puede suponer que es un número entero) Para cada uno i=1,...,ncalculamos el rango rx(i) y ry(i)de x(i)y y(i)respectivamente.

Sea d(i) = rx(i)-ry(i)la diferencia de rango y Ssea ​​la suma S = d(1)^2 + d(2)^2 + ... + d(n)^2. Entonces el coeficiente de correlación de rango rho viene dado por

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

Ejemplo

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   
falla
fuente
De Wikipedia : "Solo si todos los n rangos son enteros distintos , se puede calcular usando la fórmula popular"
rahnema1
¿Qué quieres decir con eso?
defecto
Digo que la fórmula que proporcionó es para los casos especiales donde los rangos son enteros de acuerdo con Wikipedia. Sin embargo, usó la fórmula para los rangos como 2.5.
rahnema1
Bueno, eso es si estás usando enteros en primer lugar. E incluso si lo haces, obtendrás una buena aproximación. Muchos autores incluso usan la fórmula de este desafío como definición. Además, tenga en cuenta que una clasificación es inestable y no necesariamente tiene un significado tan impactante como un coeficiente de correlación habitual. Pero todo esto es irrelevante para este desafío.
flawr

Respuestas:

5

MATL , 33 bytes

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

Pruébalo en línea!

Explicación

,           % 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
fuente
44
Nunca he visto algo con tanta semejanza con la combinación de teclado que realmente haga algo antes. +1
HyperNeutrino
5

R , 64 60 bytes

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

Pruébalo en línea!

ranken R es el incorporado que calcula el rango deseado; el resto es solo la matemática para hacer el resto del trabajo.

Gracias a CriminallyVulgar por guardar 4 bytes

Como se mencionó en los comentarios , la definición establecida del coeficiente de correlación de rango no corresponde precisamente al coeficiente de correlación de Spearman, de lo contrario, una respuesta válida sería 26 bytes:

function(x,y)cor(x,y,,"s")
Giuseppe
fuente
2
Ajuste del byte de 4 semanas: (n ^ 3-n) para el último paréntesis
CriminallyVulgar
@CriminallyVulgar gracias! mi boda no pasó mucho tiempo después de tu comentario, así que no lo vi ...
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))

Esto define una función anónima que toma la entrada como dos listas correspondientes a los valores xy y. La salida se devuelve como un valor de punto flotante.

Pruébalo en línea!

R. Kap
fuente
2

Mathematica, 89 bytes

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

Pruébalo en línea! (para trabajar en matemáticas, "Tr" se reemplaza por "Total")

J42161217
fuente
0

Wolfram Language (Mathematica) , 18 bytes

N[SpearmanRho@@#]&

Pruébalo en línea!

nixpower
fuente
Desafortunadamente, parece que la definición de RCC en la pregunta no coincide exactamente con el Spearman Rho: funciona solo en el caso de entradas enteras distintas. Vea, por ejemplo, mi respuesta R o el comentario vinculado allí.
Giuseppe
El autor de la pregunta parece sugerir que esto está bien aquí . La pregunta dio la fórmula Spearman Rho como una definición, por lo que consideraría que esto es válido a pesar de su inexactitud matemática.
nixpower