井出草平の研究ノート

ANOVA その7 ANOVAオブジェクトからの追加情報の取得

こちらの続き。

ides.hatenablog.com

bookdown.org

ANOVAオブジェクトからは、多くの興味深い情報を得ることができる。1つに保存されているすべてを見るには、ANOVAオブジェクト上でコマンドを実行する。

二元配置分散分析(Two-way ANOVA)のデータをもう少し掘っていく。まずはTwo-way ANOVAのデータを作ろう。
詳しくはこちらから。

ides.hatenablog.com

「交互作用を考慮したANOVA」のところのデータ。

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

オプション

names(cleaner.type.int.aov)

出力。

 [1] "coefficients"  "residuals"     "effects"       "rank"          "fitted.values" "assign"        "qr"            "df.residual"   "contrasts"    
[10] "xlevels"       "call"          "terms"         "model"   

例えば、"fitted.values "には、データセットのすべての観測データに対する従属変数(時間)のモデルフィットが含まれています。これらのフィット値は、 $ operatorと代入によってデータセットに戻すことができます。例えば、相互作用モデル(cleaner.type.aov)と非相互作用モデル(cleaner.type.int.aov)の両方からモデルのフィット値を取得し、データフレームの新しい列に割り当ててみよう。

相互作用モデルのフィット値をint.fitとしてデータフレームに追加する

poopdeck$int.fit <- cleaner.type.int.aov$fitted.values

主効果モデルのフィットをme.fitとしてデータフレームに追加する

poopdeck$me.fit <- cleaner.type.aov$fitted.values

それでは、表の最初の数行を見て、最初の数個の観測値の適合性を見よう。

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

このフィットを使って、モデルがデータにどれだけフィットしたか(あるいはフィットしなかったか)を確認することができる。例えば、各モデルの適合度が真のデータからどれだけ離れているかを、次のように計算することができる。

相互作用モデルのフィットは、平均してどのくらいデータから離れていたか?

mean(abs(poopdeck$int.fit - poopdeck$time))

[1]15.35173

主効果モデルのフィットは、平均してどのくらいデータから離れていたか?

mean(abs(poopdeck$me.fit - poopdeck$time))

[1] 16.5351

、交互作用モデルは平均で15.35分、主効果モデルは平均で16.54分、データから外れている。交互作用モデルは主効果のみのモデルよりも複雑なので、これは驚くことではありません。しかし、交互作用モデルの方がデータへの適合性が高いからといって、必ずしも交互作用に意味があり、信頼できるとは限らない。