静粛に、只今統計勉強中

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

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. 引数のうち参照1、参照2は、必ず1列で。1と2で同じ行数を指定してください。
  2. 引数のうち順序1、順序2は、0:降順 1:昇順 で順位付けされます。
    (ワークシート関数RANK.AVGと同じです。)
  3. 参照1または参照2のセル範囲中に欠損値(空欄や文字列など)があるとエラーになります。

*1:2017/12/23 コード個所をpre記法に直しました