井出草平の研究ノート

ANOVA その5 二元配置分散分析(Two-way ANOVA)

こちらの続き。

ides.hatenablog.com

bookdown.org

二元配置のANOVAを行うには、回帰モデルの式に+印で追加の独立変数を入れるだけであるこれだけです。すべてのステップは同じだ。。クリーナーとタイプの両方を独立変数とした二元配置のANOVAを行ってみよう。これを行うために、 formula = time ~ cleaner + type とする。

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

One-way ANOVA

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

Two-way ANOVA

cleaner.type.aov <- aov(formula = time ~ cleaner + type,
                        data = poopdeck)
summary(cleaner.type.aov)

結果。

             Df Sum Sq Mean Sq F value  Pr(>F)    
cleaner       2   6057    3028   6.945 0.00104 ** 
type          1  81620   81620 187.177 < 2e-16 ***
Residuals   596 259891     436                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

両方の独立変数が有意であることがわかった。

事後検定

TukeyHSD(cleaner.type.aov)
  Tukey multiple comparisons of means
    95% family-wise confidence level

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

$cleaner
     diff        lwr       upr     p adj
b-a -0.42  -5.326395  4.486395 0.9779465
c-a -6.94 -11.846395 -2.033605 0.0027112
c-b -6.52 -11.426395 -1.613605 0.0053376

$type
                 diff      lwr      upr p adj
shark-parrot 23.32667 19.97811 26.67522     0

クリーナーbとクリーナーaの間は有意ではなかった。その他の比較はすべて有意だった。

回帰分析

cleaner.type.lm <- lm(formula = time ~ cleaner + type,
                      data = poopdeck)
summary(cleaner.type.lm)
Call:
lm(formula = time ~ cleaner + type, data = poopdeck)

Residuals:
    Min      1Q  Median      3Q     Max 
-59.743 -13.792  -0.683  13.583  83.583 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   54.357      1.705  31.881  < 2e-16 ***
cleanerb      -0.420      2.088  -0.201 0.840665    
cleanerc      -6.940      2.088  -3.323 0.000944 ***
typeshark     23.327      1.705  13.681  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 20.88 on 596 degrees of freedom
Multiple R-squared:  0.2523,    Adjusted R-squared:  0.2485 
F-statistic: 67.02 on 3 and 596 DF,  p-value: < 2.2e-16

ここで、2つのデフォルト値(ここでは、cleaner = a and type = parrot)に関して、結果を解釈する必要がある。 切片は、オウムのウンチを掃除するクリーナーaの平均時間が54.36分だったことを意味している。さらに、サメのウンチを掃除するときの平均時間は、オウムのウンチを掃除するときよりも23.33分遅くなった。

交互作用を考慮したANOVA

変数間の交互作用は,ある変数の効果が他の変数に依存するかどうかを検証するものである。例えば、相互作用を使って次の質問に答えることができる。クリーナーの効果は、洗浄に使われるウンチの種類に依存するか? ANOVAに交互作用項を含めるには、式の中で項の間にプラス(+)を入れる代わりにアスタリスク(*)を使うだけである。回帰オブジェクトに交互作用項を含めると、Rは自動的に主効果も含めることに注意。

2つの独立変数を持つ前のANOVAを繰り返すが、今度はクリーナーとタイプの間の交互作用を含める。これを行うために、式をtime ~ cleaner * typeに設定する。

cleaner.type.int.aov <- aov(formula = time ~ cleaner * type,
                          data = poopdeck)
summary(cleaner.type.int.aov)

結果。

              Df Sum Sq Mean Sq F value   Pr(>F)    
cleaner        2   6057    3028   7.824 0.000443 ***
type           1  81620   81620 210.863  < 2e-16 ***
cleaner:type   2  29968   14984  38.710  < 2e-16 ***
Residuals    594 229923     387                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

クリーナーとタイプの間には、確かに有意な相互作用があることがわかった。つまり、クリーナーの効果は、適用されるウンチの種類によって異なるということです。これは、章の最初に行ったデータのプロットからも納得できる。

この違いの本質を理解するために、回帰オブジェクトから回帰係数を見てみよう。

cleaner.type.int.lm <- lm(formula = time ~ cleaner * type,
                          data = poopdeck)

summary(cleaner.type.int.lm)

結果。

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

Residuals:
   Min     1Q Median     3Q    Max 
-54.28 -12.83  -0.08  12.29  74.87 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)          45.760      1.967  23.259  < 2e-16 ***
cleanerb              8.060      2.782   2.897 0.003908 ** 
cleanerc             10.370      2.782   3.727 0.000212 ***
typeshark            40.520      2.782  14.563  < 2e-16 ***
cleanerb:typeshark  -16.960      3.935  -4.310 1.91e-05 ***
cleanerc:typeshark  -34.620      3.935  -8.798  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 19.67 on 594 degrees of freedom
Multiple R-squared:  0.3385,    Adjusted R-squared:  0.3329 
F-statistic: 60.79 on 5 and 594 DF,  p-value: < 2.2e-16

繰り返しになるが、この表を解釈するには、まずデフォルト値が何であるかを知る必要がある。これは、表に「欠けている」係数からわかります。cleaneraやtypeparrotの項が見当たらないので、cleaner = "a "とtype = "parrot "がデフォルトであることを意味している。ここでも、係数をレベルとデフォルトとの差として解釈することができます。オウムのウンチの場合、クリーナーbとcの両方が、クリーナーa(デフォルト)よりも時間がかかるようだ。さらに、サメのウンチはオウムのウンチよりも掃除に時間がかかる傾向がある(typesharkの推定値は正)。

交互作用項は、サメのウンチを掃除しているときに、掃除の効果がどのように変化するかを示しています。cleanerb:typesharkの負の推定値(-16.96)は、オウムのウンチと比較して、サメのウンチを掃除する場合、平均して16.96分、清掃員bの方が速いことを意味している。クリーナーbの前回の推定値(オウムのウンチ)は8.06だったので、クリーナーbはオウムのウンチではクリーナーaよりも遅いが、サメのウンチではクリーナーaよりも速いことを示唆している。同じことがクリーナーcにも当てはまり、どちらの方向にも強い効果があることがわかる。