はじめるまえに
本教科書で用いられているデータは著者のwebサイト(http://www.oup.com/grafenhails/)よりダウンロードできると書かれていますが、英語が苦手な人のために少しだけ補足しておきましょう。
まずリンク先へと行くと、Resourcesという項目の下にDatasets and supplementsという項目があるのでその部分をクリックしてください。するとリンク先のページにExcel, Minitab, SAS, SPSSという項目がありますから、Excelの部分をクリックしてください。そうすると、英語の注意書きのようなものが何行か書かれていて、Datasets one sheetとDatasets on separate sheetsという2つの項目があります。
[和訳] ここでは本書で用いたデータセットをExcelのワークシート形式でダウンロードすることができますが、全てのデータが入力されているワークシートはどちらのページからでも入手できます。"one sheet"のほうは1つのシートに各章のデータが全て入力されているので、MNITABやSAS、SPSSを使って解析する人はこちらをダウンロードした方が良いでしょう。一方で"separate sheets"のほうは各章の例データがそれぞれ別のシートに入力されているので、例えば、データをコピー&ペーストして使用する場合はこちらをダウンロードしたほうが便利でしょう。
というわけなので、結局はどちらのページからダウンロードしても構いませんが、separate sheetsのページからダウンロードしたものの方が便利だと思います。
第1章 分散分析への招待
p11 「BOX 1.1 1つの説明変数をもつ分散分析」の解析例
p11の表1.2における収穫量のデータを変数YIELDに代入し、肥料のデータを変数FERTILに代入します。このとき肥料のデータはカテゴリカルデータとして代入することを忘れないようにしてください。なお、Excelワークシートに表1.2と同じように入力してから(というか、webサイトからダウンロードしたワークシートから)、関数excel.w()を使用して読み込んでも構いません。
もしR上で直接やるなら、
> YIELD <- c(6.27, 5.36, 6.39, 4.85, 5.99, 7.14, 5.08, 4.07, 4.35, 4.95, + 3.07, 3.29, 4.04, 4.19, 3.41, 3.75, 4.87, 3.94, 6.28, 3.15, 4.04, + 3.79, 4.56, 4.55, 4.55, 4.53, 3.53, 3.71, 7.00, 4.61) > FERTIL <- as.factor(rep(c(1,2,3), c(10,10,10)))
もしExcelワークシートから読み込むなら、
> dat <- excel.w(2) > YIELD <- c(dat[,2]) > FERTIL <- as.factor(dat[,1])
のようにしてください。これで2つの変数に必要なデータを代入することができました。実際にBOX 1.1と同じ分散分析表を出力させるためには、関数lm()とanova()を使用します。
> result <- lm(YIELD ~ FERTIL) > anova(result) Analysis of Variance Table Response: YIELD Df Sum Sq Mean Sq F value Pr(>F) FERTIL 2 10.8227 5.4114 5.7024 0.008594 ** Residuals 27 25.6221 0.9490 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ちなみに、表1.4のような各群の平均値の信頼区間は、Rで次のようにすれば求めることができます。標準誤差とは標本平均値の標準偏差のことで、これは s / sqrt(n) でもとめられるのでした(sは標本標準偏差でnはサンプルサイズ)。また、自由度27のt分布における片側面積が0.025(両側だと0.05)となるパーセント点は関数qt()を用いれば計算できます。それから、abs()は絶対値を返す関数です。
#肥料1の信頼区間を計算する > SE1 <- 0.976 / sqrt(10) #肥料1の標準誤差 > t.crit <- qt(0.025, 27) #qt(0.975, 27)としても同じ > 5.445 - abs(t.crit) * SE1 [1] 4.811727 > 5.445 + abs(t.crit) * SE1 [1] 6.078273
p18〜19 練習問題
メロンの解析例
p19の「表1.7 YIELDMに対する1元配置分散分析表」を出力するためには次のようにコマンドします。
> Melons <- excel.w(2) > YIELDM <- c(Melons[,1]) > VARIETY <- as.factor(Melons[,2]) > Melons.result <- lm(YIELDM ~ VARIETY) > anova(Melons.result) Analysis of Variance Table Response: YIELDM Df Sum Sq Mean Sq F value Pr(>F) VARIETY 3 1115.28 371.76 23.798 1.735e-06 *** Residuals 18 281.19 15.62 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
問題(4)の平均の標準偏差というのは、標準誤差のことであるから、各群(各品種)のデータの標準偏差を求めて、それをsqrt(n)で割ってあげればよい。標準誤差と信頼区間の求め方は既に述べましたから省略します。
注意) 信頼区間の下側限界と上側限界の値が異なるのは、私は各群の不偏標準偏差を用いたのに対して、教科書では標準偏差をsqrt(EMS)としているからです。
> N1 <- length(VARIETY[VARIETY==1]) #品種1のデータ数 > N2 <- length(VARIETY[VARIETY==2]) > N3 <- length(VARIETY[VARIETY==3]) > N4 <- length(VARIETY[VARIETY==4]) > all.N <- c(N1, N2, N3, N4) > all.N [1] 6 6 4 6 > M1 <- mean(myData[VARIETY==1,][1]) #品種1の平均値 > M2 <- mean(myData[VARIETY==2,][1]) > M3 <- mean(myData[VARIETY==3,][1]) > M4 <- mean(myData[VARIETY==4,][1]) > all.M <- c(M1, M2, M3, M4) > all.M YIELDM YIELDM YIELDM YIELDM 20.49000 37.40333 20.46250 29.89667 > SD1 <- sd(myData[VARIETY==1,][1]) #品種1の標準偏差 > SD2 <- sd(myData[VARIETY==2,][1]) > SD3 <- sd(myData[VARIETY==3,][1]) > SD4 <- sd(myData[VARIETY==4,][1]) > all.SD <- c(SD1, SD2, SD3, SD4) > all.SD YIELDM YIELDM YIELDM YIELDM 4.694422 3.950497 4.764692 2.229894 > t.crit <- qt(0.975, 18) #自由度18のt分布における片側0.025となるパーセント点 > t.crit [1] 2.100922 > all.M - all.SD / sqrt(all.N) #95%信頼区間の下側限界 YIELDM YIELDM YIELDM YIELDM 18.57351 35.79055 18.08015 28.98632 > all.M + all.SD / sqrt(all.N) #95%信頼区間の上側限界 YIELDM YIELDM YIELDM YIELDM 22.40649 39.01612 22.84485 30.80702
メロンの解析例の補足
p18の図1.15のようなものを描きたい場合は以下のようにコマンドすればよい。なお、x軸のデータにカテゴリカルデータ( VARIETY <- as.factor(Melons[,2]) )を指定すると、自動的に箱ひげ図が描かれる。
> plot(Melons[,2], Melons[,1], ylab="収穫量", xlab="メロンの品種", ylim=c(0,45), + main="メロンの収穫量", yaxt="n", xaxt="n", bty="l", pch=18) > axis(1, at=c(1,2,3,4)) > axis(2, at=c(seq(0,45,5)))
またp19の表1.7のように各群の基本統計量を求めたい場合は、データフレームを作成することによって簡単に計算することができる。以下のコマンド例において、もし品種2の平均を求めたければ、VARIETY==1の部分をVARIETY==2とすればよい。
#データフレームの作成 関数data.fram()を使う > myData <- data.frame(YIELDM = YIELDM, VARIETY = VARIETY) > myData YIELDM VARIETY 1 25.12 1 2 17.25 1 3 26.42 1 4 16.08 1 5 22.15 1 6 15.92 1 7 40.25 2 8 35.25 2 9 31.98 2 10 36.52 2 11 43.32 2 12 37.10 2 13 18.30 3 14 22.60 3 15 25.90 3 16 15.05 3 17 28.05 4 18 28.55 4 19 33.20 4 20 31.68 4 21 30.32 4 22 27.58 4 > myData[VARIETY==1,][1] #myDataにおいて、VARIETYが1であるデータのみを抽出 YIELDM 1 25.12 2 17.25 3 26.42 4 16.08 5 22.15 6 15.92 > mean(myData[VARIETY==1,][1]) #品種1の収穫量の平均を求める YIELDM 20.49 > mean(myData[VARIETY==2,][1]) #品種2の収穫量の平均を求める YIELDM 37.40333 > mean(myData[VARIETY==3,][1]) #品種3の収穫量の平均を求める YIELDM 20.4625 > mean(myData[VARIETY==4,][1]) #品種4の収穫量の平均を求める YIELDM 29.89667
さらに、各群のサンプルサイズ(データ数)を求めたい場合、方法はいくつかあるが、最も単純な方法として次のようなものがある。
> length(VARIETY[VARIETY==1]) #品種1のデータ数 [1] 6 > length(VARIETY[VARIETY==2]) #品種2のデータ数 [1] 6 > length(VARIETY[VARIETY==3]) #品種3のデータ数 [1] 4 > length(VARIETY[VARIETY==4]) #品種4のデータ数 [1] 6
雌雄異株の樹木の解析例
> dio.trees <- excel.w(3) Read 150 items > SEX <- as.factor(dio.trees[,1]) > SEX [1] 2 1 2 1 2 1 2 2 1 1 2 1 2 2 1 1 2 2 2 1 2 2 1 1 2 1 1 2 1 2 2 1 2 1 2 2 1 2 [39] 2 2 2 2 2 1 2 2 1 2 1 2 Levels: 1 2 > FLOWERS <- c(dio.trees[,3]) > FLOWERS [1] 234 110 512 133 1107 624 8 333 637 225 512 47 164 1 36 [16] 524 198 225 548 272 164 5 133 133 419 442 3 1482 333 1138 [31] 561 488 282 536 11 148 512 70 1107 941 89 181 8 173 1 [46] 1091 561 3 312 1398 > plot(SEX, FLOWERS) #p274の図15.1 > anova(lm(FLOWERS ~ SEX)) #同じくBOX 15.1 Analysis of Variance Table Response: FLOWERS Df Sum Sq Mean Sq F value Pr(>F) SEX 1 171841 171841 1.1754 0.2837 Residuals 48 7017255 146193