静粛に、只今統計勉強中

仕事でデータ分析をすることになったバリバリ文系アラフィフのおっさんが、独学で統計の勉強を始めました。

Excel VBAでスピアマンの順位相関係数を求める関数を作ってみた3

クロス表の調整済み標準化残差を求める関数を作った際は数理にアプローチしてみたわけですが、あえなく挫折してしまいました。そこで、いつかわかりやすい参考文献に出会うまで数理への挑戦は保留にして、当面は与えられた数式を間違わずに使えること(これは用法用量も含めてです)に注力したいと思います。

というわけで、ソースコードに解説を加えてみることにしました。
先にコーディングの手順を追って、最後にコードの全文を載せたいと思います。

まずは元の計算式を確認します。
ウィキペディアスピアマンの順位相関係数を検索すると、https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%94%E3%82%A2%E3%83%9E%E3%83%B3%E3%81%AE%E9%A0%86%E4%BD%8D%E7%9B%B8%E9%96%A2%E4%BF%82%E6%95%B0
対応するX とY の値の順位の差をD、値のペアの数をNとして

f:id:cyclo-commuter:20171214142042j:plain
ただし、同順位(タイ)がある場合には、X、Y における同順位の個数をそれぞれnx 、ny 、それらの順位をti 、tj (i = 1, 2, ... , nx ;j = 1, 2, ... , ny )として、

f:id:cyclo-commuter:20171214143214j:plain
とあります。が、なんか・・・ヘン? あっ!

f:id:cyclo-commuter:20171214144253j:plain

う~む。ウィキペディアが間違い多いってホントだったんですねえ。

気を取り直して、実装に取りかかりましょう。

  1. 定義から、同順位[あり/なし]で条件分岐が必要なことがわかります。どのみち途中で同順位の個数を計算しなくてはなりませんから、それを使って自動判定させることにします。
  2. 必要な変数を確認します。

    f:id:cyclo-commuter:20171214151155j:plain
    この他に計算途中で使う一時変数が必要になるはずですが、それは必要になったときに設定します。あと、Σ(ti^3-ti)とΣ(tj^3-tj)は、それぞれ計算途中もTxとTyに格納してしまいます。この辺まったくの我流なので、人にはお薦めしません。

  3. 引数を設定します。
    Function Spearman(参照1, 順序1, 参照2, 順序2)
    本家PEARSONにならって「配列」にしようと思ったのですが、変数処理が面倒なので、それと値を順位に変換するので、RANK.AVG関数と同様に「参照」と「順序」を。それぞれ2個ずつ。

  4.  本家PEARSONは2次元配列でも行けますが、実用上そこまでいらんだろうと割り切って、エラー処理だけ本家に合わせて。

    f:id:cyclo-commuter:20171214164302j:plain

  5.  ’ここに入力の中に以下のコードを入力していきます。
    N = 参照1.Rows.Count ←変数Nに参照の行数=ペアの数を代入
    For i = 1 To N ←1行目から最終行まで順に
        tmp1 = WorksheetFunction.Rank_Avg(参照1(i), 参照1, 順序1) ←参照1の順位
        tmp2 = WorksheetFunction.Rank_Avg(参照2(i), 参照2, 順序2) ←参照2の順位
        D2 = D2 + (tmp1 - tmp2) ^ 2 ←変数D2に順位の差の2乗を加算

    f:id:cyclo-commuter:20171214163703j:plain
    Next
    If Tx + Ty = 0 Then ←同順位の個数0なら
        Spearman = 1 - (6 * D2) / (N ^ 3 - N) ←こっちの数式
    Else       ←同順位の個数>0なら
        Tx = (N ^ 3 - N - Tx) / 12
        Ty = (N ^ 3 - N - Ty) / 12
        Spearman = (Tx + Ty - D2) / (2 * Sqr(Tx * Ty)) ←こっちの数式
    End If

地の文と画像がごっちゃになっていて、見づらくてたいへん申し訳ないですが、現時点のスキルでこれが精一杯です。

今回のポイントは同順位の個数をどう数えるかにありましたが、同順位2個めの時点で計算するアイディアをこちらのサイト

から拝借させていただき、あっさりクリアできました。ウィキペディアの間違いに気づけたのもこちらのおかげです。誠にありがとうございました。