実装関連事項

各種プログラミング言語の基本的な書き方やソフトウェア等の使用方法について.

R にて一元配置分散分析 (one-way ANOVA) を行う.一元配置分散分析とは,例えば,数学のテストの得点といったような1要因に対して,ある学校のある学年のクラスA,BおよびCの平均点に差があるかどうか,というような3群以上の標本の平均値の差の有無を検定する手法である.R では,コマンド oneway.test(),または,コマンド aov() および anova() の組み合わせで一元配置分散分析を実行することができる.aov() と anova() による分散分析では,1要因に限らず,2要因の二元配置分散分析等も可能である.ただし,分散分析はチューキー・クレーマー検定やダネット検定等のアドホックな検定法に比べて得られる情報が少ないので第一選択からは外した方が良い.

ある要因 (数学のテストの点数) に対して,ある4群 (クラスA,B,C,D) にて以下の観測値 (各生徒の得点) が得られたときの分散分析を行う.帰無仮説 (H0) は全ての群間において平均値に差がないことである.

データA56, 48, 72, 60, 55
データB60, 62, 76, 84
データC78, 53, 62, 44, 90, 57
データD77, 72, 83, 81, 91, 83

p値の計算

以下のコマンドにて,上のデータAからDをまとめて変数 vx に格納する.

$ vx=c(56, 48, 72, 60, 55, 60, 62, 76, 84, 78, 53, 62, 44, 90, 57, 77, 72, 83, 81, 91, 83)

次に,以下のコマンドで上で読み込んだデータにラベルをつけるための変数を作成する.クラスAからDの標本数はそれぞれ,5,4,6,6なので rep(...) にてその標本数に対応するAからDの文字列ベクトルを発生させ,factor(...) にてそのベクトルを因子に変換したものを変数 fx に格納する.

$ fx=factor(rep(c("A", "B", "C", "D"), c(5, 4, 6, 6)))

以上で作成した vx は従属変数であり,fx は独立変数である.分散分析はこれらの変数を用い, aov() および anova() にて anova(aov(従属変数 ~ 独立変数)) という形式で実行する.従属変数と独立変数を繋ぐ記号はチルダ (~) である.もし,独立変数が2つある場合,すなわち二元配置分散分析の場合は anova(aov(従属変数 ~ 独立変数1 + 独立変数2 + 独立変数1:独立変数2)) という形式で実行する.一元配置分散分析は,実際には以下のように打つ.

$ anova(aov(vx~fx))

これを実行した結果は以下のようになる.

 
Analysis of Variance Table

Response: vx
          Df Sum Sq Mean Sq F value  Pr(>F)  
fx         3 1629.2  543.06  3.9141 0.02708 *
Residuals 17 2358.6  138.74                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’

結果の fx の行の Df は級間 (群間) の自由度を意味しており,(級の個数 - 1) で計算される値である.この場合,データAからBの4個から1を引いた値 (3) となる.一方,Residuals の行の Df は級内 (郡内) の自由度を意味しており,(全標本の個数 - 級の個数) で計算される.この場合標本の数が21個なので,そこから級の個数4を引いた値 (17) となる.Sum Sq の列の数値はそれぞれ級間および級内の平方和を示す.また,Mean Sq の列の数値は級間および級内の平均平方であり,それぞれの平方和をそれぞれの自由度で割ることで算出される値である.F value はF値を意味しており,級間の平均平方を級内の平均平方で割った値である.最後の Pr(>F) は得られたF値をF分布に適用したときに得られるp値である.有意水準を5%に設定していた場合であると,p < 0.05 であるため,帰無仮説は棄却され,データAからDの平均値は全て等しいとはいえないという結論が導かれる.以上が一元配置分散分析である.

別の入力方法によるp値の計算

また,コマンド aov() に対するデータの読み込ませ方には別の方法がある.データフレームを読み込む方法である.上と同様のデータをテキストファイル等に以下のように成型したとする.

fx	vx
A	56
A	48
A	72
A	60
A	55
B	60
B	62
B	76
B	84
C	78
C	53
C	62
C	44
C	90
C	57
D	77
D	72
D	83
D	81
D	91
D	83

このデータをコピーし,以下のようにデータフレームとして変数 dx に格納する.

$ dx=read.table("clipboard",header=T)

以上のデータフレーム dx を用い,分散分析は以下のように行う.dx には読み込むデータフレームを指定する.

$ anova(aov(vx~fx, data=dx))

これを実行した結果は以下のようになる.結果は上と完全に一致する.

 
Analysis of Variance Table

Response: vx
          Df Sum Sq Mean Sq F value  Pr(>F)  
fx         3 1629.2  543.06  3.9141 0.02708 *
Residuals 17 2358.6  138.74                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’

その他の方法によるp値の計算

一元配置分散分析は他のコマンド oneway.test() でも実行できるが,その場合もデータの読み込み方は上の2つの場合と同様である.以下のようにする.オプション"var.equal=T は各データに等分散性を仮定する際に指定するオプションである.普通は指定する.

$ oneway.test(vx~fx, data=dx, var.equal=T)

これを実行した結果は以下のようになる.上と同様の結果が得られる.

 
        One-way analysis of means

data:  vx and fx
F = 3.9141, num df = 3, denom df = 17, p-value = 0.02708

Hatena Google+