到目前为止,我知道如何在R上运行ANOVA,但是我一直不得不复制代码以对另一个变量运行de ANOVA,我想知道是否可以通过某种方式将其循环传递给aov()变量并将ANOVA的结果存储在变量中,因此我不必通过复制代码块来手动更改它们。
E.G。:
我要测试的变量:Z,Y,X
类别变量:治疗
VectorVariables = c(Z,Y,X)
for (i in Vector) {
AnovaZ <- aov(Z ~ Treatment) #then
AnovaY <- aov(Y ~ Treatment) # and so on..
}
有可能吗?
答案 0 :(得分:1)
如果要循环播放,诀窍是使用as.formula(paste())
。
创建一个列表(我们将其称为result
)来存储每个aov
的输出。然后循环遍历存储在Vector
中的因变量名称:
n <- length(Vector)
result <- vector(mode="list", length=n)
for(i in 1:n) {
result[[i]] <- aov(as.formula(paste(Vector[i], "~ Treament")))
}
答案 1 :(得分:1)
不需要for
循环!您可以简单地cbind
一起使用不同的响应变量。
这里是一个例子:
由于您没有提供示例数据集,因此我将基于npk
数据集生成一些示例数据,并在其中添加第二个响应变量yield2
,该变量与{{ 1}},并增加了白噪声。
yield
基于两个响应变量set.seed(2018)
df <- npk
df$yield2 <- df$yield + rnorm(nrow(df), mean = 0, sd = 5)
和yield
yield2
res <- aov(cbind(yield, yield2) ~ block, df)
#Call:
# aov(formula = cbind(yield, yield2) ~ block, data = df)
#
#Terms:
# block Residuals
#resp 1 343.295 533.070
#resp 2 905.0327 847.2597
#Deg. of Freedom 5 18
#
#Residual standard errors: 5.441967 6.860757
#Estimated effects may be unbalanced
和resp 1
给出了分别运行resp 2
和aov(yield ~ block, df)
时得到的平方和。
因此,在您的情况下,该命令将类似于
aov(yield2 ~ block, df)
或者,如果您要运行并存储来自不同方差分析的结果,请将响应变量存储在res <- aov(cbind(Y, Z) ~ Treatment)
中并使用list
:
lapply
这将产生lapply(list(Y = "Y", Z = "Z"), function(x)
aov(as.formula(sprintf("%s ~ Treatment", x)), df))
的方差分析结果,其中每个list
元素都对应一个响应变量。
答案 2 :(得分:1)
另一种解决方案是使用列表列和purrr :: map。在使用许多模型(例如,参见http://r4ds.had.co.nz/many-models.html)时,这很有用。
library(tidyverse)
aov_f <- function(df) {aov(value ~ carb, data = df)}
mtcars_n <- gather(mtcars, obs, value, mpg:gear) %>%
group_by(obs) %>%
nest() %>%
mutate(aov = map(data, aov_f))