井出草平の研究ノート

ANOVA その4 一元配置分散分析(One-way ANOVA)

こちらの続き。 ides.hatenablog.com

bookdown.org

poopdeckのデータに一元配置のANOVA(one-way ANOVA)の実行例をする。掃除時間を従属変数に、クリーナーの種類を独立変数にしする。データをpirateplotで表すことができる。

library(yarrr)
head(poopdeck)

データはこちら

  day cleaner   type time
1   1       a parrot   47
2   1       b parrot   55
3   1       c parrot   64
4   1       a  shark  101
5   1       b  shark   76
6   1       c  shark   63

パイレーツプロットは以下のように書く。

pirateplot(time ~ cleaner, 
                  data = poopdeck, 
                  theme = 2, 
                  cap.beans = TRUE,
                  main = "formula = time ~ cleaner")

cap.beans:データに見られる限界値を上限とすべきか否か?デフォルトはFALSE。

f:id:iDES:20210924103904p:plain

プロットを見ると、クリーナーaとbは同じで、クリーナーcは少し速いように見える。これをテストするために、aovでANOVAオブジェクトを作成する。 時間が従属変数で、クリーナーが独立変数なので、式をformula = time ~ cleanerに設定する。

cleaner.aov <- aov(formula = time ~ cleaner,
                   data = poopdeck)
summary(cleaner.aov) ##結果表示

結果。

             Df Sum Sq Mean Sq F value  Pr(>F)   
cleaner       2   6057    3028   5.294 0.00526 **
Residuals   597 341511     572                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

表からの主な結果は、清掃時間に対するクリーナーの効果が有意であることだF(2.597) =5.29, p = 0.005. しかし、ANOVA表は、独立変数のどのレベルが異なるかはわからない。言い換えれば、どのクリーナーがどのクリーナーよりも優れているかはわからない。これに答えるためには、事後検定を行う必要がある。

要因による有意な効果が見つかった場合は、独立変数のレベルの各ペア間の差を検定するために、事後検定を行うことができる。一対比較には、さまざまな仮定を用いた多くの種類がある。異なる事後検定の背後にある論理については、こちらのWikipediaのページを参照: https://en.wikipedia.org/wiki/Post_hoc_analysis.

標準的なANOVAの最も一般的な事後検定の1つは、Tukeyの正直な有意差(HSD)検定である。 検定についての追加情報は、こちらのウィキペディアのページを参照: https://en.wikipedia.org/wiki/Tukey's_range_test HSD 検定を行うには、以下のようにTukeyHSD()関数をANOVAオブジェクトに適用する。

TukeyHSD(cleaner.aov)

結果

  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = time ~ cleaner, data = poopdeck)

$cleaner
     diff        lwr        upr     p adj
b-a -0.42  -6.039575  5.1995746 0.9831441
c-a -6.94 -12.559575 -1.3204254 0.0107324
c-b -6.52 -12.139575 -0.9004254 0.0180906

この表は、各グループペア間のペアワイズの差を示している。diff列は、グループ間の平均差(前の回帰オブジェクトの要約で見つけたものと同じ)、差の信頼区間、およびグループ差が異ならないという帰無仮説を検定するp値を示す。

私は、ほとんどの場合、ANOVA要約表と回帰要約表を組み合わせるのが便利である。ANOVAは回帰(すべての独立変数が因子である場合)の特別なケースに過ぎないので、回帰オブジェクトでもANOVAオブジェクトと同じ結果が得られる。しかし、結果の形式は異なり、解釈しやすくなっている。

回帰オブジェクトを作成するには、lm()関数を使用します。この関数への入力は、aov()関数への入力と同じになります。

cleaner.lm <- lm(formula = time ~ cleaner,
                 data = poopdeck)
summary(cleaner.lm)

結果

Call:
lm(formula = time ~ cleaner, data = poopdeck)

Residuals:
   Min     1Q Median     3Q    Max 
-63.02 -16.60  -1.05  16.92  71.92 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   66.020      1.691  39.037  < 2e-16 ***
cleanerb      -0.420      2.392  -0.176  0.86066    
cleanerc      -6.940      2.392  -2.902  0.00385 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.92 on 597 degrees of freedom
Multiple R-squared:  0.01743,   Adjusted R-squared:  0.01413 
F-statistic: 5.294 on 2 and 597 DF,  p-value: 0.005261

回帰表は、ANOVA表のように各変数の検定を提供しない。代わりに、独立変数の各レベルがデフォルト値からどれだけ異なるかを示す。独立変数のどの値がデフォルト変数であるかは、表からどの値が欠けているかを見るだけでわかる。このケースでは、クリーナーaの係数が見当たらないので、これがデフォルト値になる。参照カテゴリーであり、Estimateは0である。

表の切片は、デフォルト値の平均である。このケースでは、クリーナーaの平均時間は66.02だった。他のレベルの係数を見ると、クリーナーbはクリーナーaよりも平均0.42分速く、クリーナーcはクリーナーaよりも平均6.94分速いことがわかる。驚くことではないがこれらはTukey HSDテストで見られたのと同じ違いである。