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 回答