ANOVA на R с различными зависимыми переменными - PullRequest
0 голосов
/ 01 сентября 2018

Я до сих пор знаю, как запустить ANOVA на R, но мне всегда приходится дублировать код для запуска de ANOVA для другой переменной, мне было интересно, могу ли я как-то передать его в aov () в цикле имен переменных и сохранить результат ANOVA в переменных, поэтому мне не нужно вручную изменять их путем копирования блока кода.

например:.

Переменные, которые я хочу проверить: 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 голосов
/ 01 сентября 2018

Нет необходимости в for цикле! Вы можете просто cbind разные переменные ответа вместе.

Вот пример:

  1. Поскольку вы не предоставляете образец набора данных, я генерирую некоторые образцы данных на основе набора данных npk, где я добавляю вторую переменную ответа yield2, которая совпадает с yield с некоторыми добавленными белый шум.

    set.seed(2018)
    df <- npk
    df$yield2 <- df$yield + rnorm(nrow(df), mean = 0, sd = 5)
    
  2. Выполнение ANOVA на основе двух переменных ответа 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)

Или, если вы хотите запустить и сохранить результаты из отдельных ANOVA, сохраните переменные ответа в list и используйте lapply:

lapply(list(Y = "Y", Z = "Z"), function(x)
    aov(as.formula(sprintf("%s ~ Treatment", x)), df))

Это дает list результатов ANOVA, где каждый list элемент соответствует переменной ответа.

0 голосов
/ 02 сентября 2018

Другое решение - использовать столбцы списка и 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))
0 голосов
/ 01 сентября 2018

Если вы хотите сделать цикл, хитрость заключается в использовании 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")))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...