No.10818 aov関数で求められる平方和  【aor】 2009/09/08(Tue) 19:10

Rjpwikiに同じ質問をしたのですが,返答がいただけず,こちらでお教えいただければと考え投稿させていただきました。こうした複数のところに同じ質問をするのがよくないということであれば,ご指摘いただければ削除しますのでよろしくお願いいたします。

以下投稿内容====
aov関数で求められる平方和について教えていただきたく,投稿いたします。
Jonathan Baronによる解説 (http://www.psych.upenn.edu/~baron/rpsych/rpsych.html#SECTION00078000000000000000)
を読んで疑問が出てきました。
上記の解説,Unbalanced (Nonorthogonal) DesignsのセクションによるとSPSSで平方和のタイプを2と設定すれば,aov関数の結果と一致する,とあります。

aovで求められる平方和はタイプ2,ということなのでしょうか。現在,SPSS,SASを使用できる環境ではなく,検証できておりません。aovでの平方和についてご存知の方,あるいは検証方法についてのヒントでも
いただけたら幸いです。よろしくお願いいたします。環境はR2.9.2,windows vistaです。

なお,平方和について不勉強で,色々検索し,中澤先生の解説, 岸本先生の解説 などを参考にしました。
anova関数ではタイプ1,という記述は色々なところで散見されるのですが, aov関数でどのように行っているかは (自分としては) 不明です。
また,筑波大学の井関先生の作成された分散分析関数 により,平方和をタイプ2に指定して検証してみましたが,aov関数の結果と一致するようです。
以下はJonathan Baronの解説で記載されていた混合計画の分散分析のコードです。

##Jonathan Baronの解説でのaov関数を使うコード (少し修正を加えました)
#データ生成
data1<-c(49,47,46,47,48,47,41,46,43,47,46,45,48,46,47,45,49,44,44,45,42,45,
45,40,49,46,47,45,49,45,41,43,44,46,45,40,45,43,44,45,48,46,40,45,40,45,47,40)
### 交互作用ありにしたいときのデータ (これは私が加えたものです)
####data1<-c(49,10,46,47,48,47,41,46,43,5,46,5,48,46,47,45,100,44,44,45,42,45,
####45,40,49,46,47,45,49,45,41,43,44,46,100,40,45,43,44,45,48,46,40,45,10,45,10,40)
####data1<-c(49,10,46,47,48,47,41,46,43,5,46,5,48,46,47,45,100,44,44,45,42,45,
####45,40,49,46,47,45,49,45,41,43,44,46,100,40,49,10,46,47,48,47,41,46,43,5,46,5)
## 行列化 (データ確認のため)
matrix(data1, ncol= 4, dimnames = list(paste("subj", 1:12),
c("Shape1.Color1", "Shape2.Color1" ,"Shape1.Color2", "Shape2.Color2")))
# aov用のデータフレーム作成
Hays.df <- data.frame(rt = data1, subj = factor(rep(paste("subj", 1:12, sep=""), 4)),
shape = factor(rep(rep(c("shape1", "shape2"), c(12, 12)), 2)),
color = factor(rep(c("color1", "color2"), c(24, 24))))
# 非釣合型のデータにするため,grp変数を付け加える
Hays.df$grp <- factor(rep(c(1,1,1,1,1,1,1,1,2,2,2,2), 4))
# aovで分析
aovres <- aov(rt ~ grp*color*shape + Error(subj/(color+shape)), data=Hays.df)
summary(aovres)

## anovakun (井関先生の分散分析関数) でも検証するためにデータフレームに
## 分散分析関数を読み込めるようにしないと動作しません。
datkun <- data.frame(matrix(data1, ncol= 4, dimnames = list(paste("subj", 1:12),
c("Shape1.Color1", "Shape2.Color1" ,"Shape1.Color2", "Shape2.Color2"))))
grp <- c(1,1,1,1,1,1,1,1,2,2,2,2)
datkun <- data.frame(cbind(grp, datkun))
# anovakunで分析
anovakun(datkun, "AsBC", 2, 2, 2, type2=TRUE)

以上の分析で,結果が一致したため,aov関数の平方和について疑問を抱いたしだいです。
どうぞよろしくお願いいたします。
投稿内容終わり====

No.10832 Re: aov関数で求められる平方和  【波音】 2009/09/09(Wed) 20:28

例えば,summary(aov(lm(y ~ x)))として得られる分散分析表の平方和はSASでいうところのType IIの平方和ではないです。RでType IIの平方和を得るにはcarパッケージのAnova()を利用します。

result <- lm(y ~ x)
Anova(result, type="II")

とすることでType IIの平方和が得られます。Type IIIならば引数にtype="III"と指定すればよいです。たぶん,他にも色々とやり方があるのでしょうが(^_^;)

ただし,これは分散分析モデルの解析に対しての方法で,線形混合効果モデル(nlme()などで解析される)で同じように得られるか(対応しているか)どうかは把握していません。

だから少なくともaov()で得られるのはType IIの平方和ではないでしょう(あまり質問の答えになっていませんが・・・)。

No.10848 Re: aov関数で求められる平方和  【知ったかぶり】 2009/09/10(Thu) 15:35

Anova()は,変量効果モデルには対応していないようなので,変量効果を除いて比較すると,

aovres <- aov(rt ~ grp*color*shape, Hays.df)
summary(aovres)
Anova(aovres,type=2) #Type2平方和
Anova(lm(rt ~ grp*color*shape,contrasts=list(grp="contr.sum",color="contr.sum",shape="contr.sum"), Hays.df),type=3) #Type3平方和

aov() とAnova( ,type=2)の平方和は,確かに一致しますが,これはaov()がType2平方和を出力しているからではなく,このデータの場合は,Type1と Type2が一致するためです.ちゃんと確認していませんが,各水準の繰り返し数が異なっていても,周辺度数に比例する場合は,Type1とType2は 同じになるようです.

Hays.df <- head(Hays.df,47) #最後の行を削る

などとすると,aov()とAnova( ,type=2)は異なる平方和を返します.

No.10850 Re: aov関数で求められる平方和  【aor】 2009/09/10(Thu) 22:56

波音さま,知ったかぶりさま

ご回答ありがとうございました。やはりType IIではないのですね。
勉強になりました。そうすると,Jonathan Baronは誤りなんですね…
平方和の話,勉強になりました。
ご回答,心から感謝いたします。

● 「統計学関連なんでもあり」の過去ログ--- 042 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る