【问题标题】:Perform several ANOVA's simultaneously on tidy data in R对 R 中的整洁数据同时执行多个 ANOVA
【发布时间】:2018-09-05 20:08:44
【问题描述】:

我有一个如下所示的数据框,但有许多额外的行。 “内容”和“过程”都可以是“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

我知道如何对以这种方式设置的数据运行多个方差分析。我会运行以下命令:

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 真的更好,并且我通过尝试在 tidyverse 中做所有事情来为自己创造更多的工作,请告诉我。

这就是整洁的数据框的样子:

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

【问题讨论】:

    标签: r tidyverse tidyr anova simultaneous


    【解决方案1】:

    “整洁”的方法是通过dv 处理nest 数据,然后使用purrr::map 对嵌套数据执行方差分析。

    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 包含两列 dataaov,它们分别包含 listtibbles 和 aovs。


    样本数据

    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)
    

    【讨论】:

    • 感谢您的回复。我有一个后续问题:我们在使用 map 函数时如何输入 anova 的参数? mutate(aov = map(data, ~anova(type = 2))) 的变体不起作用,但以下工作:mutate(aov = map(data, anova))
    • @coreehi 你可以使用mutate(aov = map(data, anova, type = 2)mutate(aov = map(data, ~anova(.x, type = 2))mutate(aov = map(data, function(x) anova(x, type = 2))map 的函数参数采用函数名称或匿名(lambda 样式)函数(后者作为公式或作为显式匿名函数)。
    【解决方案2】:

    只需使用 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)
    

    【讨论】:

    • 有没有办法在不使用 spread() 的同时保持整洁的格式?还是以不整洁的格式工作的最佳方法是?
    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 2019-05-08
    • 1970-01-01
    • 2017-03-04
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多