Выполните несколько ANOVA одновременно на приборных данных в R - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть фрейм данных, который выглядит следующим образом, но со множеством дополнительных строк. «Content» и «Process» могут быть как «a», так и «n».

dv1  dv2  dv3  content  process
1    3    4    a        a
2    1    2    a        n
5    3    5    n        a
4    3    2    n        n

Я знаю, как запустить несколько ANOVA для данных, которые настроены таким образом. Я бы запустил следующее:

dv <- df[,1:3]
output <- lm(as.matrix(dv) ~ content * proces, data = df, 
    contrasts = list(content = contr.sum, process = contr.sum))
summary(aov(output))

Мне интересно, есть ли способ сделать то же самое на аккуратном фрейме данных, не возвращая его в тот же формат, в котором он был выше, с использованием spread (). Обычно я работаю с аккуратными данными, и анализ ANOVA - это единственный анализ, который я до сих пор выполняю с использованием аккуратных данных. В качестве альтернативы, если вы считаете, что действительно лучше запускать ANOVA так, как я это делал, и что я создаю для себя больше работы, пытаясь сделать все в пределах направления, пожалуйста, дайте мне знать.

Вот как будет выглядеть аккуратный фрейм данных:

dv   value  content  process 
dv1  1      a        a
dv1  2      a        n
dv1  5      n        a
dv1  4      n        n
dv2  3      a        a
dv2  1      a        n
dv2  3      n        a
dv2  3      n        n
dv3  4      a        a
dv3  2      a        n
dv3  5      n        a
dv3  2      n        n

Ответы [ 2 ]

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

"аккуратным" способом было бы nest данные на dv и затем использование purrr::map для выполнения ANOVA для вложенных данных.

library(tidyverse)
df.aov <- df %>%
    group_by(dv) %>%
    nest() %>%
    mutate(aov = map(data, ~aov(value ~ content * process, data = .x)))
df.aov$aov
#[[1]]
#Call:
#   aov(formula = value ~ content * process, data = .x)
#
#Terms:
#                content process content:process
#Sum of Squares        9       0               1
#Deg. of Freedom       1       1               1
#
#Estimated effects may be unbalanced
#
#[[2]]
#Call:
#   aov(formula = value ~ content * process, data = .x)
#
#Terms:
#                content process content:process
#Sum of Squares        1       1               1
#Deg. of Freedom       1       1               1
#
#Estimated effects may be unbalanced
#
#[[3]]
#Call:
#aov(formula = value ~ content * process, data = .x)
#
#Terms:
#                    content process content:process
#Sum of Squares     0.25    6.25            0.25
#Deg. of Freedom       1       1               1
#
#Estimated effects may be unbalanced

df.aov содержит два столбца data и aov, которые содержат list из tibble с и aov с соответственно.


Пример данных

df <- read.table(text =
    "dv   value  content  process
dv1  1      a        a
dv1  2      a        n
dv1  5      n        a
dv1  4      n        n
dv2  3      a        a
dv2  1      a        n
dv2  3      n        a
dv2  3      n        n
dv3  4      a        a
dv3  2      a        n
dv3  5      n        a
dv3  2      n        n", header = T)
0 голосов
/ 05 сентября 2018

Просто используйте tidyr gather(), чтобы изменить форму и запустить тот же процесс:

sdf <- tidyr::spread(tidy_data, dv, value)
sdf
#   content process dv1 dv2 dv3
# 1       a       a   1   3   4
# 2       a       n   2   1   2
# 3       n       a   5   3   5
# 4       n       n   4   3   2

dv <- sdf[,3:5]
output <- lm(as.matrix(dv) ~ content * process, data = sdf, 
             contrasts = list(content = contr.sum, process = contr.sum))
summary(aov(output))

Данные

txt <- "dv   value  content  process 
dv1  1      a        a
dv1  2      a        n
dv1  5      n        a
dv1  4      n        n
dv2  3      a        a
dv2  1      a        n
dv2  3      n        a
dv2  3      n        n
dv3  4      a        a
dv3  2      a        n
dv3  5      n        a
dv3  2      n        n"

tidy_data <- read.table(text = txt, header = TRUE)
...