Up

相関係数のシミュレーション

 

相関係数を指定したとき、その相関係数に対する2変量正規分布からランダムに点をとり、その散布図を描くVisual C++プログラムCorSimu.exeを作成した。このプログラムは.NET Framework 3.5対応であり、ファイル名CorSimu.exeをクリックしてダウンロード・実行することが出来る。このプログラムを実行すると図1のフォームが表示される。

図1

 

 

Nの値は点の数、rは相関係数である。適当な値を設定して「GO」ボタンをクリックすると図2のように相関係数rの値に対する2変量正規分布からランダムにサンプルしたN個の点がプロットされる。

図2

 

図の上に表示されている「r=0.47728」は、サンプリングされたデータに対して算出された相関係数である。このデータに対して算出される相関係数は、画面上部に設定されている相関係数とは一致しないが、画面上部の値は分布の真の相関係数であり、データから算出される値は、サンプリングのたびに変動する。図中の赤線は回帰直線である。回帰直線

                            、  

とおいたとき、次式

                           

によってabの値を求めている。該当する箇所のプログラムは以下の通りである。

 

                         //

                         //             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」ボタンをクリックすると設定されているNrの値に対するサンプリングが行われて、図2のように描画される。同じNrの値であっても、サンプリングによって表示される散布図は「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++プログラミング入門勁草書房>を上梓した。

 

Up