ランク相関係数


13

通常の相関係数(2d)は、点の集合が線でどれだけうまく記述できるかを測定し、はいの場合、その符号は正または負の相関があるかどうかを示します。ただし、これは、ポイントの座標が実際に、たとえば測定値として定量的に解釈できることを前提としています。

あなたはしかし、あなたはまだできることを行うことができない場合はご注文の座標を、そこにあるの順位相関係数:それはポイントがによって記述することができますどれだけ測定単調機能。

チャレンジ

2dポイントのリストが与えられたら、それらのランク相関係数を決定します。

詳細

  • 入力は正の整数(ただし、そうする必要はありません)、またはその他の「ソート可能な」値であると想定できます。
  • ポイントは、ポイントのリスト、またはx座標とy座標の2つのリスト、マトリックスまたは2D配列などとして取得できます。
  • 出力は、0〜1の実数を表す必要があるため、浮動小数点または有理数型である必要があります。

定義

ランク:番号のリストをX=[x(1),...,x(n)]指定するrx(i)と、各エントリにrankと呼ばれる正の数を割り当てることができx(i)ます。そのためには、リストをソートx(i)し、ソートされたリスト内のインデックスを割り当てますrx(i)。2つ以上のx(i)値が同じ場合、対応するすべてのインデックスの算術平均をランクとして使用します。例:

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

番号10はここに2回表示されます。ソートされたリストでは、インデックス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)ことがランク差とlet 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

それで何を言いたいですか?
-flawr

あなたが提供した式は、ランクがウィキペディアに従って整数である特別な場合のためのものだと言います。ただし、などのランクには式を使用しました2.5
rahnema1

そもそも整数を使用している場合です。そして、あなたがそうしているとしても、あなたはまだ良い近似を得るつもりです。多くの著者は、この課題の式を定義として使用しています。さらに、ランキングは不安定であり、必ずしも通常の相関係数のようなインパクトのある意味を持つわけではないことに注意してください。しかし、これはすべてこの課題とは無関係です。
-flawr

回答:


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は、目的のランクを計算する組み込み関数です。残りは、残りの仕事をするための単なる数学です。

4バイトを節約してくれたCriminallyVulgarに感謝

前述のようにコメントで、順位相関係数の述べた定義は、有効な答えは26バイトになり、それ以外のスピアマン相関係数に正確に対応していません。

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

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

これにより、入力xy値に対応する2つのリストとして入力を受け取る匿名関数が定義されます。出力は浮動小数点値として返されます。

オンラインでお試しください!



0

残念ながら、質問のRCCの定義はスピアマンローと正確に一致していないように見えます-整数入力が異なる場合にのみ機能します。たとえば、私のR回答またはそこにリンクされているコメントを参照してください。
ジュゼッペ

質問の作者はこれがここで大丈夫だと示唆するようです。この質問は定義としてスピアマン・ローの公式を与えたので、数学的な不正確さにもかかわらずこれは有効であると考えます。
nixpower
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.