秩相关系数


13

常用的相关系数(在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在此出现两次。在排序的列表中,它将占据索引23。这些的算术平均值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

你想说什么?
瑕疵

我说的是,您提供的公式适用于特殊情况,根据维基百科,这些情况的等级是整数。但是,您对排名使用了公式,例如2.5
rahnema17年

好吧,如果您首先使用整数。即使这样做,您仍然会得到一个很好的近似值。许多作者甚至使用此挑战的公式作为定义。此外,请记住,排名是不稳定的,不一定具有通常的相关系数之类的影响。但是,所有这些都与这一挑战无关。
瑕疵

Answers:


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

R64 60字节

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

在线尝试!

rankR是计算所需等级的内建函数;剩下的只是完成其余工作的数学方法。

感谢CrimelyVulgar节省了4个字节

评论中所述,所定义的秩相关系数定义与Spearman相关系数并不完全对应,否则有效答案将为26个字节:

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

2
凌晨4字节TWEAK:(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))

这定义了一个匿名函数,该函数将输入作为与xy值相对应的两个列表。输出以浮点值形式返回。

在线尝试!


2

Mathematica,89个字节

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

在线尝试! (为了处理数学,将“ Tr”替换为“ Total”)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.