Excel VBAでケンドールの順位相関係数を求める関数を作ってみた
『マンガ統計学入門』を読んでいたら、こんな一文が目に留まりました。
ケンドールの は、スピアマンの よりもサイズが大きい標本に対してよく使用されます。*1
『マンガ統計学入門』アイリーン・マグネロ,ボリン・V・ルーン(講談社)158ページ
マンガ 統計学入門―学びたい人のための最短コース (ブルーバックス)
- 作者: アイリーン・マグネロ,神永正博,ボリン.ファン・ルーン,井口耕二
- 出版社/メーカー: 講談社
- 発売日: 2010/04/21
- メディア: 新書
- 購入: 11人 クリック: 77回
- この商品を含むブログ (12件) を見る
余談になりますが、この本、Amazonの書評にもあるとおり、コマを割った日本の「マンガ」ではなく、いわゆる「ポンチ絵」です。新聞の政治欄とかに載ってる1コマの風刺漫画の趣(おもむき)。内容も、裏表紙にあるような「現代人に必須の統計思考力が身につく!」といったものではなく、統計学史をつまみ食い的に紹介した雑学本ですね。
いろんな統計学者の似顔絵が拝めるので、統計学への親近感が増す、かも?
さて、本題です。
スピアマンの を求めるユーザー定義関数は以前作ってみましたが、
よく使われるということなら、是非ケンドールの を求める関数も作ってみましょう。
計算のしかたはこちらで学ばせていただきました。
こりゃ簡単。てことで、さっそく実装。
'ケンドールの順位相関係数を求める
Function Kendall(参照1, 参照2)
Dim n, Tmp1, Tmp2, i, j, k
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 - 1
For j = i + 1 To n
Select Case (参照1(i) - 参照1(j)) * (参照2(i) - 参照2(j))
Case Is > 0: Tmp1 = Tmp1 + 1
Case Is < 0: Tmp2 = Tmp2 + 1
End Select
k = k + 1
Next
Next
Kendall = (Tmp1 - Tmp2) / k
Else
Kendall = CVErr(xlErrNA)
End If
End Function
ペアの組み合わせ数はワークシート関数のCOMBINで求めてもよかったのですが、ソースの見た目スッキリ感を選んで、ループの回数を数えることにしました。
実行結果は以下のとおり。
サンプルサイズが小さいせいか、スピアマンの とは、随分値が違っていますね。
*1:ちなみに、 は「タウ」、 は「ロー」と読みます。