具有不同因变量的R的ANOVA

时间:2018-09-01 02:23:09

标签: r statistics anova

到目前为止,我知道如何在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..

}

有可能吗?

3 个答案:

答案 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一起使用不同的响应变量。

这里是一个例子:

  1. 由于您没有提供示例数据集,因此我将基于npk数据集生成一些示例数据,并在其中添加第二个响应变量yield2,该变量与{{ 1}},并增加了白噪声。

    yield
  2. 基于两个响应变量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 2aov(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))