分散分析の関数aov()が返す結果オブジェクトの中味

2009.1.12(2009.1.12より)

 分散分析を扱う、Rの関数aov()が返してくる、オブジェクトの中味のメモです。lmの結果オブジェクトについてのメモもあわせてご覧ください。

 簡単な例で、関数aov()の結果が入っているオブジェクトの中味を見てみます。まず、使ったデータです。

> xx1

[1] -0.02200638 -0.83324486 -0.13286507 -0.38450436 -0.62018209 1.17125525
[7] 1.45493928 0.28285581 0.93453867 0.35931916 -0.16567208 1.26241003
[13] 1.01350960 1.27537514 0.06872908 -0.09904672 1.77924695 0.83414760
[19] -0.13415046 1.25867121

> yy1

[1] 2.59714182 0.57236250 0.69361070 0.09675884 -0.39145645 -0.97270887
[7] -2.00000237 1.05336004 1.62480638 -0.88612664 0.33637389 -0.37688844
[13] -1.66779639 0.34957694 -1.78839061 1.59459188 -1.08877186 1.59174162
[19] -0.04579673 1.80961643

 関数aov()を適用し、その結果をres1.aovに入れておきます。その中味を見ます。

> res1.aov<-aov(yy1~xx1)
> res1.aov

Call:
aov(formula = yy1 ~ xx1)

Terms:
xx1 Residuals
Sum of Squares 2.047151 30.565004
Deg. of Freedom 1 18

Residual standard error: 1.303095
Estimated effects may be unbalanced

上記のように分散分析表の一部(平均平方やFがありません)などが表示されます。

> str(res1.aov)

List of 12
$ coefficients : Named num [1:2] 0.354 -0.427
..- attr(*, "names")= chr [1:2] "(Intercept)" "xx1"
$ residuals : Named num [1:20] 2.234 -0.137 0.283 -0.421 -1.01 ...
..- attr(*, "names")= chr [1:20] "1" "2" "3" "4" ...
$ effects : Named num [1:20] -0.6936 -1.4308 -0.0642 -0.7383 -1.299 ...
..- attr(*, "names")= chr [1:20] "(Intercept)" "xx1" "" "" ...
$ rank : int 2
$ fitted.values: Named num [1:20] 0.363 0.709 0.41 0.518 0.618 ...
..- attr(*, "names")= chr [1:20] "1" "2" "3" "4" ...
$ assign : int [1:2] 0 1
$ qr :List of 5
..$ qr : num [1:20, 1:2] -4.472 0.224 0.224 0.224 0.224 ...
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr [1:20] "1" "2" "3" "4" ...
.. .. ..$ : chr [1:2] "(Intercept)" "xx1"
.. ..- attr(*, "assign")= int [1:2] 0 1
..$ qraux: num [1:2] 1.22 1.36
..$ pivot: int [1:2] 1 2
..$ tol : num 1e-07
..$ rank : int 2
..- attr(*, "class")= chr "qr"
$ df.residual : int 18
$ xlevels : list()
$ call : language aov(formula = yy1 ~ xx1)
$ terms :Classes 'terms', 'formula' length 3 yy1 ~ xx1
.. ..- attr(*, "variables")= language list(yy1, xx1)
.. ..- attr(*, "factors")= int [1:2, 1] 0 1
.. .. ..- attr(*, "dimnames")=List of 2
.. .. .. ..$ : chr [1:2] "yy1" "xx1"
.. .. .. ..$ : chr "xx1"
.. ..- attr(*, "term.labels")= chr "xx1"
.. ..- attr(*, "order")= int 1
.. ..- attr(*, "intercept")= int 1
.. ..- attr(*, "response")= int 1
.. ..- attr(*, ".Environment")=<environment: R_GlobalEnv>
.. ..- attr(*, "predvars")= language list(yy1, xx1)
.. ..- attr(*, "dataClasses")= Named chr [1:2] "numeric" "numeric"
.. .. ..- attr(*, "names")= chr [1:2] "yy1" "xx1"
$ model :'data.frame': 20 obs. of 2 variables:
..$ yy1: num [1:20] 2.5971 0.5724 0.6936 0.0968 -0.3915 ...
..$ xx1: num [1:20] -0.022 -0.833 -0.133 -0.385 -0.62 ...
..- attr(*, "terms")=Classes 'terms', 'formula' length 3 yy1 ~ xx1
.. .. ..- attr(*, "variables")= language list(yy1, xx1)
.. .. ..- attr(*, "factors")= int [1:2, 1] 0 1
.. .. .. ..- attr(*, "dimnames")=List of 2
.. .. .. .. ..$ : chr [1:2] "yy1" "xx1"
.. .. .. .. ..$ : chr "xx1"
.. .. ..- attr(*, "term.labels")= chr "xx1"
.. .. ..- attr(*, "order")= int 1
.. .. ..- attr(*, "intercept")= int 1
.. .. ..- attr(*, "response")= int 1
.. .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv>
.. .. ..- attr(*, "predvars")= language list(yy1, xx1)
.. .. ..- attr(*, "dataClasses")= Named chr [1:2] "numeric" "numeric"
.. .. .. ..- attr(*, "names")= chr [1:2] "yy1" "xx1"
- attr(*, "class")= chr [1:2] "aov" "lm"

関数lm()の結果によく似ています。分散分析表の個々の内容はこれ(res1.aov)から取り出すよりも、summary()の結果オブジェクトからの方が簡単なようです。

 res1.aovにsummary()を適用してその結果をres1s.aovに入れておき、表示させます。

> res1s.aov<-summary(res1.aov)

> res1s.aov

Df Sum Sq Mean Sq F value Pr(>F)
xx1 1 2.0472 2.0472 1.2056 0.2867
Residuals 18 30.5650 1.6981

と分散分析表(平均平方やFもあります)が表示されます。

> str(res1s.aov)

List of 1
$ :Classes ‘anova’ and 'data.frame': 2 obs. of 5 variables:
..$ Df : num [1:2] 1 18
..$ Sum Sq : num [1:2] 2.05 30.57
..$ Mean Sq: num [1:2] 2.05 1.7
..$ F value: num [1:2] 1.21 NA
..$ Pr(>F) : num [1:2] 0.287 NA
- attr(*, "class")= chr [1:2] "summary.aov" "listof"

res1s.aovはデータフレームでもあるとなっているので、たとえば、DFの列を取り出すには次のようにすればいいように見えるかもしれないが、

> res1s.aov["Df"]

NULL

となってしまう。よく見ると、res1s.aovは1つの要素からなるリストで、その要素がデータフレームなので、

> res1s.aov[[1]]["Df"]

Df
xx1 1
Residuals 18

とか

> res1s.aov[[1]]["Residuals","Df"]

[1] 18

とすれば取り出せる。

 aov()の結果に関数anovaを適用すると、以下のようにsummary()のときとほぼ同じ、分散分析表が表示される

> res1.anova1<-anova(res1.aov)

> res1.anova1

Analysis of Variance Table

Response: yy1
Df Sum Sq Mean Sq F value Pr(>F)
xx1 1 2.0472 2.0472 1.2056 0.2867
Residuals 18 30.5650 1.6981

> str(res1.anova1)

Classes ‘anova’ and 'data.frame': 2 obs. of 5 variables:
$ Df : int 1 18
$ Sum Sq : num 2.05 30.57
$ Mean Sq: num 2.05 1.7
$ F value: num 1.21 NA
$ Pr(>F) : num 0.287 NA
- attr(*, "heading")= chr "Analysis of Variance Table\n" "Response: yy1"

こちらはそのものがデータフレームなので、

> res1.anova1["xx1","Sum Sq"]

[1] 2.047151

のように取り出せる。