■無相関検定をプログラムの中で行うには

○ この議論が該当する場面
 相関係数を求めたときに,その相関係数が有意な値であるか形の上で算出されただけの値であるかは相関係数の有意性検定(無相関検定)でチェックする必要がある.
 無相関検定は標本の大きさ n (対の組数)と相関係数から
で求められるt値について自由度 n - 2 のt検定にかければよいが,そのときにt分布を求める関数がExcelでいえばワ−クシート関数にはあるがVBAには見当たらないのでどうするすればよいか.他のプログラミング言語で無相関検定を行うときも同様.
※ 個々の相関係数について有意性検定を行うときには左に述べたような事情は起こらないと考えられる.
 筆者が必要だと考えたのは,次のような50×50の大きなテーブルに書き込まれた2500個(相関係数行列は対称行列になるので実際にはその約半分)の相関係数のうち有意なものだけを使用するにはどうすればよいかということであった.(個別に点検するには組数が多過ぎる.)

  0.31 0.25 ・・・ 0.35
0.31   0.63 ・・・ 0.42
0.25  0.63   ・・・ 0.27
・・・ ・・・ ・・・   ・・・
0.35 0.42 0.27 ・・・  
○ Excel上のVBAで利用する方法
 Excel上のワークシートでは=TINV(0.05,自由度)によって右のような5%境界値が得られるので,補助として利用するシートを作り(これをSheet4とし,右の表はA列上端に書き込むものとする.A2:A21には自由度,B2に=TINV(0.05,A2),B2をB21までコピー・貼り付け)
相関係数は,プログラムの中で加減乗除と平方根によって求めることができるので,これを r_val とし,自由度を df_val =n - 2 とすると
 まず
t_val = Sqr(r_val * r_val * (n - 2) / (1 - r_val * r_val))
によってt値を求め、
 準備したt分布表の行数をここでは20までとし,df_val の大きな値については2.00と決めれば

Dim ws1, ws2, ws4 As Worksheet
Set ws4 = Worksheets("sheet4") '無相関検定表

If df_val <= 20 Then
 If t_val <= ws4.Cells(df_val + 1, 2).Value Then
  右の表で無相関になるときの処理
 Else
  右の表で相関係数が有意な値になるときの処理
 End If
Else
 If t_val <= 2.00 Then
  右の表にない値で無相関になるときの処理
 Else
  右の表以外で相関係数が有意な値になるときの処理
 End If
End If
により,VBAプログラムから表を参照できる.
  A B
1 自由度 t境界値
2 1 12.7062
3 2 4.3027
4 3 3.1824
5 4 2.7765
6 5 2.5706
7 6 2.4469
8 7 2.3646
9 8 2.3060
10 9 2.2622
11 10 2.2281
12 11 2.2010
13 12 2.1788
14 13 2.1604
15 14 2.1448
16 15 2.1315
17 16 2.1199
18 17 2.1098
19 18 2.1009
20 19 2.0930
21 20 2.0860
○ JavaScriptで利用する方法
 JavaScriptではワークシートが利用できないので,Excel上で上のように求めた境界値の値を配列の値としてテキストエディタで貼り付けておくとよい.
 すなわち,Excelワークシート上で上のようにして求めた境界値(自由度は配列番号-1だから不要)をテキストエディタの作業画面に貼り付けて,セル区切り文字が \n(改行コード)や\t(タブコード)となるものを(カンマ)に一括置換すると右のような配列を作ることができる.
 右の配列では列番号は0から始まるから,例えば自由度3のときのt境界値はt_border[2]で参照できる.そこで,無相関検定にかけたい自由度に対応する相関係数の値から次の式で求めたt値が対応する配列(ただし自由度は n-2 )の値よりも大きければ相関あり,以下ならば無相関と判別すればよい.
t_border = new Array(12.7062 , 4.3027 , 3.1824 , 2.7765 , 2.5706 , 2.4469 , 2.3646 , 2.3060 , 2.2622 , 2.2281 , 2.2010 , 2.1788 , 2.1604 , 2.1448 , 2.1315 , 2.1199 , 2.1098 , 2.1009 , 2.0930 , 2.0860);
 次のプログラムは,上記の配列を用いてJavaScrptで無相関検定を行うものになっている.(ここでは自由度20以上は一律に2.0を境界値としているが,自由度200に広げることは簡単にできる.)  
N→,相関係数→


無相関検定
※ 上記の他,スミルノフ・グラブス検定表など,通常はプログラミング言語上の関数として利用できないものをプログラムの中で利用したいとき
 スミルノフ・グラブス検定表は
http://aoki2.si.gunma-u.ac.jp/lecture/Grubbs/Grubbs-table.html
などにあり,これを画面上でコピーしてから自分のパソコンのExcel上に貼り付けると個々の数値を転記しなくてもそのまま利用できる.
 なお,青木先生の表ではNが20までは連続番号となっているがそれよりも大きなNについては主な値のみ示されているので,その表をそのまま利用するときは20よりも大きな値については上に示したように別途処理する必要がある.(VLOOKUPが使えればさらによい.)
○===メニューに戻る