被験者間2要因分散分析
被験者間2要因分散分析<岡本安晴「データ分析のための統計学入門」おうふう、第4.2節参照>を行うプログラム例TwoFactorsBtwn.exeを作成した。プログラムTwoFactorsBtwn.exeは.NET Framework3.5対応である。プログラム名TwoFactorsBtwn.exeをクリックしてダウンロード・実行すると図1のフォームが現れる。

図1
「設定」ボタンのクリックで図2のフォームが現れる。

図2
各要因の水準数と水準内のデータ数Nを設定して(図3)

図3
「OK」ボタンをクリックすると図1のグリッドが設定値に調整される(図4)。

図4
図4のように要因の水準数と水準内のデータ数を設定した後、データを記入する(図5)。

図5
comboBoxのドロップダウンリストの項目を選ぶとその水準のページが表示される(図6)。

図6
既に用意されているデータを読み込むときは「読込」ボタンをクリックする。
「ラベル変更用ボックス」の文字列を変更すると表示されている水準のラベルが変更される。
「計算」ボタンのクリックで計算が始まるが、まず計算結果などを書き出す出力ファイル名の設定を求めるダイアログ・ボックスが表示される(図7)。

図7
計算が終了して出力用ファイルが閉じられると図8のメッセージ・ウィンドウが表示される。

図8
「OK」ボタンのクリックで図5のフォームに戻るので、「終了」ボタンをクリックしてプログラムの実行終了となる。プログラムの実行終了後、出力ファイルを開くと以下のようになっている。
=================================
要因A<aL1>
       
bL1      
bL2      
bL3
        
1        24       
44        38
        
2       
33        36        29
        
3       
37        25        28
        
4       
29        27        47
        
5       
42        43        48
     
平均    33.00     35.00     38.00
要因A<aL2>
       
bL1      
bL2      
bL3
        
1       
30        35        26
        
2       
21        40        27
        
3       
39        27        36
        
4       
26        31        46
        
5       
34        22        45
     
平均    30.00     31.00     36.00
要因A<aL3>
       
bL1      
bL2      
bL3
        
1       
21        41        42
        
2       
18        39        52
        
3       
10        50        53
        
4       
31        36        49
        
5       
20        34        64
     
平均    20.00     40.00     52.00
       
SV            
SS       
df            
MS             
F
        
A       
190.000        
2        
95.000         
1.520
        
B      
1543.333        
2       
771.667        
12.347
       
AB      
1236.667         4       
309.167         
4.947
     
S/AB      
2250.000        36        
62.500
    
Total      
5220.000        44
=================================
F値に対する確率は<エフ分布の計算>に用意したプログラムで求めることができる。
分散分析表の算出は以下のコードで行っている。
                        double v = 0.0;
                        for (int i = 0; i
< n; i++)
                                for (int j = 0; j
< a; j++)
                                        for (int k = 0; k
< b; k++)
                                                v
+= y[i][j][k];
                        double rn = n;
                        double ss_c = sqr(v) / (rn * a * b);
                        v
= 0.0;
                        for (int i = 0; i
< n; i++)
                                for (int j = 0; j
< a; j++)
                                        for (int k = 0; k
< b; k++)
                                                v
+= sqr(y[i][j][k]);
                        double ss_total = v - ss_c;
                        double ss_a = 0.0;
                        for (int j = 0; j
< a; j++){
                                v
= 0.0;
                                for (int i = 0; i
< n; i++)
                                        for (int k = 0; k
< b; k++)
                                                v
+= y[i][j][k];
                                ss_a
+= sqr(v);
                        }
                        ss_a
= (ss_a / (rn * b)) - ss_c;
                        double ss_b = 0.0;
                        for (int k = 0; k
< b; k++){
                                v
= 0.0;
                                for (int i = 0; i
< n; i++)
                                        for (int j = 0; j
< a; j++)
                                                v
+= y[i][j][k];
                                ss_b
+= sqr(v);
                        }
                        ss_b
= (ss_b / (rn * a)) - ss_c;
                        double ss_ab = 0.0;
                        for (int j = 0; j
< a; j++)
                                for (int k = 0; k
< b; k++){
                                        v
= 0.0;
                                        for (int i = 0; i
< n; i++)
                                                v
+= y[i][j][k];
                                        ss_ab
+= sqr(v);
                                }
                        ss_ab
= (ss_ab / rn) - ss_c - ss_a - ss_b;
                        double ss_err = ss_total - ss_a - ss_b - ss_ab;
                        double * sum;
                        sum
= new double[b];
                        fout->WriteLine();
                        fout->WriteLine();
                        for (int j = 0; j
< a; j++){
                                fout->WriteLine();
                                fout->WriteLine("要因A<" + FctrALabel[j] + ">");
                                fout->Write(" ");
                                for (int k = 0; k
< b; k++){
                                        fout->Write(FctrBLabel[k]->PadLeft(10));
                                        sum[k]
= 0.0;
                                }
                                fout->WriteLine();
                                for (int i = 0; i
< n; i++){
                                        fout->Write(((i+1).ToString())->PadLeft(10));
                                        for (int k = 0; k
< b; k++){
                                                fout->Write((y[i][j][k].ToString())->PadLeft(10));
                                                sum[k]
+= y[i][j][k];
                                        }
                                        fout->WriteLine();
                                }
                                fout->Write("      平均");
                                for (int k = 0; k
< b; k++)
                                        fout->Write(
((sum[k]/n).ToString("F2"))->PadLeft(10));
                                fout->WriteLine();
                        }
                        fout->WriteLine();
                        fout->WriteLine();
                        fout->WriteLine(String("SV").PadLeft(10) + String("SS").PadLeft(15) + String("df").PadLeft(10) + String("MS").PadLeft(15) + String("F").PadLeft(15));
                        fout->WriteLine(String("A").PadLeft(10) + ss_a.ToString("F3")->PadLeft(15) +
(a-1).ToString()->PadLeft(10) + (ss_a/(a-1)).ToString("F3")->PadLeft(15) +
                                                        ((ss_a/(a-1))
/ (ss_err/(a * b * (n-1.0)))).ToString("F3")->PadLeft(15));
                        fout->WriteLine(String("B").PadLeft(10) + ss_b.ToString("F3")->PadLeft(15) +
(b-1).ToString()->PadLeft(10) + (ss_b/(b-1)).ToString("F3")->PadLeft(15) +
                                                        ((ss_b/(b-1))
/ (ss_err/(a * b * (n-1.0)))).ToString("F3")->PadLeft(15));
                        fout->WriteLine(String("AB").PadLeft(10) + ss_ab.ToString("F3")->PadLeft(15) +
((a-1)*(b-1)).ToString()->PadLeft(10) + (ss_ab/((a-1.0)*(b-1.0))).ToString("F3")->PadLeft(15) +
                                                        ((ss_ab/((a-1.0)*(b-1.0)))
/ (ss_err/(a * b * (n-1.0)))).ToString("F3")->PadLeft(15));
                        fout->WriteLine(String("S/AB").PadLeft(10) + ss_err.ToString("F3")->PadLeft(15) +
(a*b*(n-1)).ToString()->PadLeft(10) + (ss_err / (a * b * (n -
1.0))).ToString("F3")->PadLeft(15));
                        fout->WriteLine(String("Total").PadLeft(10) +
ss_total.ToString("F3")->PadLeft(15)
+ (a * b * n - 1).ToString()->PadLeft(10));
上のプログラムのソースコードファイルなどは圧縮ファイルTwoFactorsBtwn.zipとしてまとめた。圧縮ファイル名TwoFactorsBtwn.zipをクリックしてダウンロードしたものをマウスの右ボタンでクリックして表示されるメニュから「展開」あるいは「解凍」を選ぶと解凍することが出来る。解凍したファイルは、Visual C++2008で開くことが出来る。
また、標準C++準拠プログラム例は本ウェブサイトとは別のウェブサイト<被験者間2要因分散分析>に用意した。
なお、Visual C++プログラミングの入門書<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>を上梓した。