井出草平の研究ノート

ANOVA その6 Type I, Type II, and Type III ANOVA

こちらの続き。

ides.hatenablog.com

bookdown.org

ANOVAには、タイプ1、2、3(またはタイプI、II、III)と呼ばれる3つの異なるタイプがある。これらのタイプは、分散(特に二乗和)の計算方法が異なる。データが比較的バランスのとれたもの、つまり各グループに比較的同数の観測がある場合は、3つのタイプすべてが同じ答えを出す。しかし、データが不均衡で、一部のグループに他のグループよりも多くの観測がある場合は、タイプII(2)またはタイプIII(3)を使用する必要がある。

Rのベースプログラムの標準的なaov()関数は、Type Iの二乗和を使用する。そのため、データが均衡している場合にのみ適している。データが不均衡な場合は、タイプIIまたはタイプIIIの二乗和を用いてANOVAを行うべきである。これを行うには、carパッケージのAnova()関数を使用する。Anova()関数にはtypeという引数があり、計算したいANOVAのタイプを指定することができる。

次のコードチャンクでは、3つの異なるタイプを使って、poopdeckデータから3つの別々のANOVAを計算する。まずlm()で回帰オブジェクトを作成する。Anova()関数では、数式やデータセットではなく、回帰オブジェクトを主な引数として入力する必要がある。つまり、まず lm() (またはglm()) でデータから回帰オブジェクトを作成し、そのオブジェクトをAnova()関数に入力する必要があめ。同じことを標準のaov()関数でもすることができる。

回帰オブジェクトの作成

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

回帰オブジェクトtime.lmを作成したので、このオブジェクトをaov()に入力してType I ANOVA を、carパッケージのAnova()に入力して Type II または Type III ANOVA を行うことで、3 種類の異なる ANOVA を計算することができる。

library(car)
# Type I ANOVA - aov()
time.I.aov <- aov(time.lm)

# Type II ANOVA - Anova(type = 2)
time.II.aov <- car::Anova(time.lm, type = 2)

# Type III ANOVA - Anova(type = 3)
time.III.aov <- car::Anova(time.lm, type = 3)

たまたま、poopdeckのデータフレームのデータは完全にバランスがとれている(従って各ANOVAタイプで全く同じ結果が得られます。しかし、もしバランスが取れていなかったら、aov()関数で計算したType I ANOVAを使うべきではない。

データがバランスされているかどうかを確認するには、関数を使う。

with(poopdeck,
     table(cleaner, type))

結果。

       type
cleaner parrot shark
      a    100   100
      b    100   100
      c    100   100

このようにpoopdeckのデータでは、観測値は完全にバランスがとれているので、データを分析するのにどのタイプのANOVAを使っても問題はない。