在R中循环许多单侧ANOVA

时间:2014-11-12 14:22:33

标签: r loops statistics anova

我想为不同的数字向量运行100 ANOVA。

我的数据向量是来自我的data.frame

的(ruy,fjr,akf ....)
aa=aov(data.frame$ruy~data.frame$Group)
anova(aa)
ab=aov(data.frame$fjr~data.frame$Group)
anova(ab)
ac=aov(data.frame$akf~data.frame$Group)
anova(ac)
.....
.....

我的循环技巧很差所以请你好。

2 个答案:

答案 0 :(得分:1)

由于aov基于lm,您可以在LHS上使用cbind因变量,从而导致运行单独的模型:

formula <- as.formula(paste0("cbind(", paste(names(iris)[-5], collapse = ","), ") ~ Species"))

fit <- aov(formula, data=iris)
summary(fit)
# Response Sepal.Length :
#             Df Sum Sq Mean Sq F value    Pr(>F)    
#Species       2 63.212  31.606  119.26 < 2.2e-16 ***
#Residuals   147 38.956   0.265                      
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Response Sepal.Width :
#             Df Sum Sq Mean Sq F value    Pr(>F)    
#Species       2 11.345  5.6725   49.16 < 2.2e-16 ***
#Residuals   147 16.962  0.1154                      
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
#</snip>

答案 1 :(得分:0)

或者,您可以循环回复以创建一个列表,其中每个元素对应一个模型,而不是Roland的优秀答案,它产生一个单一的&#39;具有多个响应的模型。如果你想要(在后面的步骤中)单独使用生成的模型,这可能是usefule:

responseList <- names(iris)[-5]
modelList    <- lapply(responseList, function(resp) {
                           mF <- formula(paste(resp, " ~ Species"))
                           aov(mF, data = iris)
                })

然后,您可以再次使用lapplysummary模型上运行aov

lapply(modelList, summary)

如前所述,Roland的解决方案为您提供了一个多响应模型(class(fit)),而上面的解决方案为您提供了(单个)响应模型列表。无论您喜欢什么,主要取决于您希望如何处理结果。