Excel VBAでスピアマンの順位相関係数を求める関数を作ってみた 補
前々回参考にさせていただいたサイトにこうありました。
なお数式どおりに手続きを踏むのが面倒な場合,いずれのケースも順位づけした後,PearsonまたはCorrel関数でより簡素な手続きに代えることも可能です。
というわけで、おまけでワークシート関数PEARSONを使った関数も作ってみました。
'スピアマンの順位相関係数を求める2 Function Spearman2(参照1, 順序1, 参照2, 順序2) Dim n, tmp1, tmp2, i If 参照1.Rows.Count = 参照2.Rows.Count And 参照1.Columns.Count = 1 And 参照2.Columns.Count = 1 Then n = 参照1.Rows.Count ReDim tmp1(1 To n) ReDim tmp2(1 To n) For i = 1 To n tmp1(i) = WorksheetFunction.Rank_Avg(参照1(i), 参照1, 順序1) tmp2(i) = WorksheetFunction.Rank_Avg(参照2(i), 参照2, 順序2) Next Spearman2 = WorksheetFunction.Pearson(tmp1, tmp2) Else Spearman2 = CVErr(xlErrNA) End If End Function
ぐっとシンプルになりましたね。 使い方は前回作成したSpearman関数と同じです。
架空のデータで計算結果を確認してみましょう。
計算間違いがないか確認するため、ワークシート上でも同じ計算をしてみましたが、正しく計算されているようです。SpearmanもSpearman2も同じ結果になりましたね。順位でピアソンの積率相関係数を計算するとスピアマンの順位相関係数になることが確認できました。
なぜ正規分布を仮定する(パラメトリックな)ピアソンの積率相関係数の数式で正規分布を仮定しない(ノンパラメトリックな)スピアマンの順位相関係数が計算できてしまうのか、謎はつきませんが、順位相関係数についてはひとまずここまで。
※ 2018/1/22 ケンドールの順位相関係数を求める関数も作りました。
*1:2017/12/23 コード個所をpre記法に直しました