相関係数のシミュレーション
相関係数を指定したとき、その相関係数に対する2変量正規分布からランダムに点をとり、その散布図を描くVisual C++プログラムCorSimu.exeを作成した。このプログラムは.NET Framework 3.5対応であり、ファイル名CorSimu.exeをクリックしてダウンロード・実行することが出来る。このプログラムを実行すると図1のフォームが表示される。
図1
Nの値は点の数、rは相関係数である。適当な値を設定して「GO」ボタンをクリックすると図2のように相関係数rの値に対する2変量正規分布からランダムにサンプルしたN個の点がプロットされる。
図2
図の上に表示されている「r=0.47728」は、サンプリングされたデータに対して算出された相関係数である。このデータに対して算出される相関係数は、画面上部に設定されている相関係数とは一致しないが、画面上部の値は分布の真の相関係数であり、データから算出される値は、サンプリングのたびに変動する。図中の赤線は回帰直線である。回帰直線は
、
とおいたとき、次式
によってaとbの値を求めている。該当する箇所のプログラムは以下の通りである。
//
// Calculation
of the regression line.
//
myMat XX(2,2), InvXX(2,2), XY(2,1),
B(2,1);
XX[0][0] = sxx;
XX[0][1] = sx;
XX[1][0] = sx;
XX[1][1] = n;
XY[0][0] = sxy;
XY[1][0] = sy;
B = gInv(XX) * XY;
double a = B[0][0], b = B[1][0];
関数gInvは一般逆行列を求める関数であり、行列を扱うクラス型myMat型を用いてBの値を求めている。
図2の状態で「GO」ボタンをクリックすると設定されているNとrの値に対するサンプリングが行われて、図2のように描画される。同じNとrの値であっても、サンプリングによって表示される散布図は「GO」ボタンのクリックにより毎回異なった散布図が表示される。これにより、設定されたrの値に対してデータがどの程度変動するかを見ることが出来る。
データのサンプリングは次のコードによって行っている。
for (int i = 0; i < n; i++){
do{
x[i]
= rn.normal();
}while(Math::Abs(x[i])
> 3.5);
if
(Math::Abs(r) < 1.0){
do{
y[i] = r * x[i] + Math::Sqrt(1 - r * r) *
rn.normal();
}while(Math::Abs(y[i])
> 3.5);
}else{
if (r
> 0.0){
y[i]
= x[i];
}else{
y[i]
= -x[i];
}
}
g->DrawEllipse(pn, xpos(x[i])-4,
ypos(y[i])-4, 8, 8);
}
絶対値が3.5を超えるものは捨てているが、これは描画が正方形の枠内に収まるようにするためである。標準正規分布において絶対値が3.5を超える確率は0.0005以下であるので、絶対値が3.5を超えるものを捨てることの影響は無視できると思われる。
プログラムのソースコードなどは圧縮ファイルCorSimu.zipとしてまとめた。ファイル名CorSimu.zipをマウスボタンでクリックしてダウンロードできる。ダウンロードしたファイルは、マウスの右ボタンクリックで表示されるメニュから「解凍」あるいは「展開」を選ぶと解凍される。解凍したファイルは、Visual C++2008などで開くことが出来る。
散布図を描いて、それに対する相関係数を算出するプログラムを<散布図の相関係数>に用意した。
Visual C++プログラミングの入門書として<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>を上梓した。