Koefisien Korelasi Peringkat

13

Koefisien korelasi biasa (dalam 2d) mengukur seberapa baik sekumpulan poin dapat digambarkan oleh suatu garis, dan jika ya, tandanya memberi tahu kita apakah kita memiliki korelasi positif atau negatif. Tetapi ini mengasumsikan bahwa koordinat titik sebenarnya dapat ditafsirkan secara kuantitatif misalnya sebagai pengukuran.

Jika Anda tidak bisa melakukan itu tetapi Anda masih bisa memesan koordinat, ada koefisien korelasi peringkat : Ini mengukur seberapa baik poin dapat dijelaskan oleh fungsi monoton .

Tantangan

Diberikan daftar poin 2d, tentukan koefisien korelasi peringkat mereka .

Detail

  • Anda dapat menganggap input sebagai bilangan bulat positif (tetapi Anda tidak harus), atau nilai "sortable" lainnya.
  • Poin dapat diambil sebagai daftar poin, atau dua daftar untuk koordinat x dan y atau matriks atau array 2d dll.
  • Output harus berupa floating point atau tipe rasional, karena harus mewakili bilangan real antara 0 dan 1.

Definisi

Rangking: Diberikan daftar angka X=[x(1),...,x(n)]kita dapat menetapkan angka positif yang rx(i)disebut peringkat untuk setiap entri x(i). Kami melakukannya dengan mengurutkan daftar dan menetapkan indeks x(i)dalam daftar yang diurutkan rx(i). Jika dua atau lebih x(i)memiliki nilai yang sama, maka kami hanya menggunakan rata-rata aritmatika dari semua indeks yang sesuai sebagai peringkat. Contoh:

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

Angka 10muncul dua kali di sini. Dalam daftar yang disortir itu akan menempati indeks 2dan 3. Rata-rata aritmatika dari mereka 2.5begitu peringkatnya

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

Peringkat Koefisien Korelasi : Let [(x(1),y(1)),(x(2),y(2)),...,(x(n),y(n))]menjadi poin yang diberikan di mana masing-masing x(i)dan y(i)adalah bilangan real Untuk setiap (wlog Anda dapat menganggap itu adalah bilangan bulat.) i=1,...,nKita menghitung pangkat rx(i) dan ry(i)dari x(i)dan y(i)masing-masing.

Biarkan d(i) = rx(i)-ry(i)menjadi perbedaan pangkat dan biarkan Smenjadi jumlah S = d(1)^2 + d(2)^2 + ... + d(n)^2. Kemudian koefisien korelasi pangkat rho diberikan oleh

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

Contoh

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   
cacat
sumber
Dari wikipedia : "Hanya jika semua n peringkat adalah bilangan bulat yang berbeda , ini dapat dihitung menggunakan rumus populer"
rahnema1
Apa yang ingin kamu katakan dengan itu?
flawr
Saya mengatakan bahwa rumus yang Anda berikan adalah untuk kasus khusus di mana peringkatnya adalah bilangan bulat menurut wikipedia. Namun Anda menggunakan rumus untuk peringkat seperti 2.5.
rahnema1
Nah itu adalah jika Anda menggunakan bilangan bulat di tempat pertama. Dan bahkan jika Anda melakukannya, Anda masih akan mendapatkan perkiraan yang baik. Banyak penulis bahkan menggunakan rumus tantangan ini sebagai definisi. Lebih jauh lagi perlu diingat bahwa peringkat tidak stabil dan tidak selalu memiliki makna yang berdampak seperti koefisien korelasi biasa. Tetapi semua ini tidak relevan untuk tantangan ini.
flawr

Jawaban:

5

MATL , 33 byte

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

Cobalah online!

Penjelasan

,           % 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
sumber
4
Saya belum pernah melihat sesuatu yang sangat mirip dengan keyboard mashing yang sebenarnya melakukan sesuatu sebelumnya. +1
HyperNeutrino
5

R , 64 60 byte

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

Cobalah online!

rankdi R adalah builtin yang menghitung peringkat yang diinginkan; sisanya hanya matematika untuk melakukan sisa pekerjaan.

Terima kasih kepada CriminallyVulgar karena telah menyimpan 4 byte

Seperti disebutkan dalam komentar , definisi koefisien korelasi peringkat yang disebutkan tidak sesuai dengan koefisien korelasi Spearman, jika tidak, jawaban yang valid adalah 26 byte:

function(x,y)cor(x,y,,"s")
Giuseppe
sumber
2
Tweak 4 byte Wee: (n ^ 3-n) untuk braket terakhir
CriminallyVulgar
@ Terima kasih kriminal! pernikahanku tidak terlalu lama setelah komentarmu jadi aku tidak melihatnya ...
Giuseppe
3

Python 3 , 141 byte

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

Ini mendefinisikan fungsi anonim yang mengambil input sebagai dua daftar yang sesuai dengan xdan ynilai. Output dikembalikan sebagai nilai floating-point.

Cobalah online!

R. Kap
sumber
2

Mathematica, 89 byte

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

Cobalah online! (untuk mengerjakan matematika, "Tr" diganti dengan "Total")

J42161217
sumber
0

Bahasa Wolfram (Mathematica) , 18 byte

N[SpearmanRho@@#]&

Cobalah online!

nixpower
sumber
Sayangnya sepertinya definisi RCC dalam pertanyaan tidak cocok dengan tepat dengan Rho Spearman - itu hanya berfungsi dalam kasus input integer yang berbeda. Lihat misalnya jawaban R saya atau komentar yang tertaut di dalamnya.
Giuseppe
Penulis pertanyaan itu tampaknya menyarankan bahwa ini baik-baik saja di sini . Pertanyaan memberi rumus Spearman Rho sebagai definisi jadi saya akan menganggap ini valid meskipun matematika tidak akurat.
nixpower