Excel VBAでスピアマンの順位相関係数を求める関数を作ってみた4
ここまで3回に渡って更新してきたスピアマンの順位相関係数もこれで最後です。
コードの全文を記載します。*1
'スピアマンの順位相関係数を求める Function Spearman(参照1, 順序1, 参照2, 順序2) Dim N 'データ対の数 Dim D2 '順位の差の2乗の総和 Dim T '(N^3-N-Σ(ti^3-ti))/12 Dim Ty '(N^3-N-Σ(tj^3-tj))/12 'ti,tj:同順位を構成するデータの数 Dim tmp1, tmp2, cnt1, cnt2, i, j If 参照1.Rows.Count = 参照2.Rows.Count And 参照1.Columns.Count = 1 And 参照2.Columns.Count = 1 Then N = 参照1.Rows.Count For i = 1 To N tmp1 = WorksheetFunction.Rank_Avg(参照1(i), 参照1, 順序1) tmp2 = WorksheetFunction.Rank_Avg(参照2(i), 参照2, 順序2) D2 = D2 + (tmp1 - tmp2) ^ 2 cnt1 = 0 cnt2 = 0 For j = 1 To i If 参照1(i) = 参照1(j) Then cnt1 = cnt1 + 1 If 参照2(i) = 参照2(j) Then cnt2 = cnt2 + 1 Next If cnt1 = 2 Then Tx = Tx + WorksheetFunction.CountIf(参照1, 参照1(i)) ^ 3 - WorksheetFunction.CountIf(参照1, 参照1(i)) If cnt2 = 2 Then Ty = Ty + WorksheetFunction.CountIf(参照2, 参照2(i)) ^ 3 - WorksheetFunction.CountIf(参照2, 参照2(i)) Next If Tx + Ty = 0 Then Spearman = 1 - (6 * D2) / (N ^ 3 - N) Else Tx = (N ^ 3 - N - Tx) / 12 Ty = (N ^ 3 - N - Ty) / 12 Spearman = (Tx + Ty - D2) / (2 * Sqr(Tx * Ty)) End If Else Spearman = CVErr(xlErrNA) End If End Function
<使用上の注意>
- 引数のうち参照1、参照2は、必ず1列で。1と2で同じ行数を指定してください。
- 引数のうち順序1、順序2は、0:降順 1:昇順 で順位付けされます。
(ワークシート関数RANK.AVGと同じです。) - 参照1または参照2のセル範囲中に欠損値(空欄や文字列など)があるとエラーになります。
*1:2017/12/23 コード個所をpre記法に直しました