0

aov()私はループの中を走っていました。各反復の出力は、リスト項目として保存されました。以前model.frame()に各aovオブジェクトのデータ フレームを確認したところ、それらはすべて同一でした。実際、それらはすべて、基本的に最後の反復のデータ フレームでした。さらに興味深いことに、これaovは誤差項を含むモデルでのみ発生するようです。 これを説明するために、R の ChickWeight データを使用します (以下を参照)。

results<-list()
length(results2)<-4
counter<-1
for(i in unique(ChickWeight$Diet)){
results[[counter]] <- aov(weight~factor(Time) + Error(Chick),    
                              ChickWeight[ChickWeight$Diet==i,])
counter<-counter+1
}
head(model.frame(results[[1]]), 2)
#    weight factor(Time) Chick
#461     42            0    41
#462     51            2    41
head(model.frame(results[[2]]), 2)
#    weight factor(Time) Chick
#461     42            0    41
#462     51            2    41
head(model.frame(results[[3]]), 2)
#    weight factor(Time) Chick
#461     42            0    41
#462     51            2    41
head(model.frame(results[[4]]), 2)
#    weight factor(Time) Chick
#461     42            0    41
#462     51            2    41

対照的に、これはエラー項がない場合には起こりません。

results2<-list()
length(results2)<-4
counter<-1
for(i in unique(ChickWeight$Diet)){
results2[[counter]] <- aov(weight~factor(Time),    
                               ChickWeight[ChickWeight$Diet==i,])
counter<-counter+1
}
head(model.frame(results2[[1]]), 2)
#  weight factor(Time)
#1     42            0
#2     51            2
head(model.frame(results2[[2]]), 2)
#    weight factor(Time)
#221     40            0
#222     50            2
head(model.frame(results2[[3]]), 2)
#    weight factor(Time)
#341     42            0
#342     53            2
head(model.frame(results2[[4]]), 2)
#    weight factor(Time)
#461     42            0
#462     51            2

何が起こっているのか誰かが知っているのだろうか。

4

1 に答える 1

2

私が理解している限り、誤差項がモデルの一部である場合model.frame.aovlist、フィットの呼び出し属性を評価することによってデータを取得します- attr(*, "call")= language aov(formula = weight ~ factor(Time) + Error(Chick), data = ChickWeight[ChickWeight$Diet == i, ])。ご覧のとおり、呼び出しは の値に依存しますi。さらに、aovlistオブジェクトはデータを検索するために環境の名前を保存します。この場合はR_GlobalEnv.

これを見てください:

results<-list()
counter<-1
for(i in unique(ChickWeight$Diet)){
  results[[counter]] <- aov(weight~factor(Time) + Error(Chick),    
                            data=ChickWeight[ChickWeight$Diet==i,])
  counter<-counter+1
}

head(model.frame(results[[1]]), 2)
#     weight factor(Time) Chick
# 461     42            0    41
# 462     51            2    41

i <- 1
head(model.frame(results[[1]]), 2)
#   weight factor(Time) Chick
# 1     42            0     1
# 2     51            2     1

split-apply-combine アプローチを使用すると、この問題を回避できます。を使用した例を次に示しbyます。

res <- by(ChickWeight,ChickWeight$Diet,FUN=function(DF) {
  aov(weight~factor(Time)+ Error(Chick) ,    
      data=DF)
})

head(model.frame(res[[1]]),2)
#  weight factor(Time) Chick
#1     42            0     1
#2     51            2     1

このアプローチを使用すると、データを検索するための正しい環境、つまり に渡された無名関数の呼び出しの環境が保存されbyます。

于 2013-03-22T21:19:27.647 に答える