【问题标题】:Automatically performing multiple within-subject ANOVA in R在 R 中自动执行多个主体内方差分析
【发布时间】:2016-02-12 07:58:24
【问题描述】:

我的数据正在关注

 time   id  var1    var2    var3    var4    var5    var6
a   1   36.9    82.7    22.2    24.2    37.9    46.5
a   2   35.0    88.9    27.4    27.3    37.4    44.9
a   3   39.6    85.6    23.1    24.0    35.4    46.0
a   4   37.1    87.6    25.2    25.5    39.7    47.1
a   5   36.9    87.1    25.8    25.1    36.7    44.4
a   6   37.7    89.7    25.8    26.6    41.9    41.2
a   7   36.2    87.3    25.6    26.0    34.5    42.0
a   8   37.1    88.3    25.5    26.0    39.7    41.6
a   9   34.9    87.8    26.2    26.9    35.7    45.1
a   10  39.7    87.4    24.7    23.3    40.0    41.3
b   1   37.3    91.7    27.9    27.1    39.0    46.4
b   2   41.0    87.3    23.4    23.5    39.0    49.1
b   3   36.9    91.0    27.7    27.1    43.0    44.6
b   4   34.1    91.3    28.6    28.9    38.6    42.7
b   5   35.7    87.3    25.9    26.3    41.4    44.8
b   6   39.7    89.5    25.3    25.0    39.1    45.5
b   7   42.4    89.8    25.6    22.2    43.2    50.3
b   8   37.3    89.9    26.1    26.8    38.3    42.9
b   9   37.5    93.5    29.0    27.7    40.1    50.8
b   10  39.4    91.7    26.0    26.5    42.0    51.6
c   1   38.5    89.3    24.6    26.3    41.7    48.9
c   2   38.4    85.8    24.0    24.3    35.4    40.8
c   3   40.2    94.3    27.0    27.9    40.7    44.1
c   4   35.9    88.4    26.7    26.5    37.8    44.5
c   5   37.7    88.0    25.9    24.6    36.4    44.1
c   6   34.1    84.7    25.4    25.3    37.4    43.4
c   7   36.1    84.8    24.5    24.8    39.6    44.7
c   8   38.6    90.1    26.4    25.6    38.7    47.8
c   9   34.5    84.7    25.1    25.2    37.7    42.1
c   10  35.2    84.6    24.9    24.9    33.7    38.9

时间是受试者内因素,var1 到 var6 是不同的结果度量。我想对每个结果测量执行受试者内方差分析,以检查其时间变化。我正在使用 ez 包中的 ezANOVA 函数进行分析。

由于我的真实数据集中有很多结果变量(列)(此处仅描述了六个以进行说明),我希望编写一个 for 循环,以便可以自动执行多个受试者内 ANOVA 测试。

我正在使用以下代码:

library(ez)
obj<-NULL
for(i in 1:6){
    obj[[i]] <- ezANOVA(data = data, 
                        dv = .(as.factor(colnames(data)[i+2])), 
                        wid = .(id), 
                        within = .(time), 
                        detailed = T, type = 3)
}

很遗憾,我收到以下错误消息:

Error in ezANOVA_main(data = data, dv = dv, wid = wid, within = within,  : 
  "as.factor(colnames(data)[i + 2])" is not a variable in the data frame provided.

当我将“var1”放在括号内时,该函数在以下代码中运行良好:

ezANOVA(data = data3, 
        dv = .(var1), 
        wid = .(id), 
        within = .(time), 
        detailed = T, type = 3)

我认为可能 ezANOVA 函数只接受 .() 中的确切变量名称。那里不允许使用函数。

我可以知道是否有一种方法可以同时运行多个受试者内方差分析测试,而无需手动将每个结果测量的名称输入到.()

或者如果我们可以对ezANOVA源代码进行一些修改,可以通过在R中键入ezANOVA来获得,以便.()中允许该函数。

欢迎任何解决方案!

【问题讨论】:

    标签: r for-loop anova


    【解决方案1】:

    ezANOVA 包不是很熟悉,但我没有修改包,而是使用dplyr 进行更多数据操作。 检查一下,让我知道它是否适合您,或者您是否希望我改进它。 您将所有结果作为数据框获得。

    library(dplyr)
    library(ez)
    
    dt = read.table(text=" time   id  var1    var2    var3    var4    var5    var6
                    a   1   36.9    82.7    22.2    24.2    37.9    46.5
                    a   2   35.0    88.9    27.4    27.3    37.4    44.9
                    a   3   39.6    85.6    23.1    24.0    35.4    46.0
                    a   4   37.1    87.6    25.2    25.5    39.7    47.1
                    a   5   36.9    87.1    25.8    25.1    36.7    44.4
                    a   6   37.7    89.7    25.8    26.6    41.9    41.2
                    a   7   36.2    87.3    25.6    26.0    34.5    42.0
                    a   8   37.1    88.3    25.5    26.0    39.7    41.6
                    a   9   34.9    87.8    26.2    26.9    35.7    45.1
                    a   10  39.7    87.4    24.7    23.3    40.0    41.3
                    b   1   37.3    91.7    27.9    27.1    39.0    46.4
                    b   2   41.0    87.3    23.4    23.5    39.0    49.1
                    b   3   36.9    91.0    27.7    27.1    43.0    44.6
                    b   4   34.1    91.3    28.6    28.9    38.6    42.7
                    b   5   35.7    87.3    25.9    26.3    41.4    44.8
                    b   6   39.7    89.5    25.3    25.0    39.1    45.5
                    b   7   42.4    89.8    25.6    22.2    43.2    50.3
                    b   8   37.3    89.9    26.1    26.8    38.3    42.9
                    b   9   37.5    93.5    29.0    27.7    40.1    50.8
                    b   10  39.4    91.7    26.0    26.5    42.0    51.6
                    c   1   38.5    89.3    24.6    26.3    41.7    48.9
                    c   2   38.4    85.8    24.0    24.3    35.4    40.8
                    c   3   40.2    94.3    27.0    27.9    40.7    44.1
                    c   4   35.9    88.4    26.7    26.5    37.8    44.5
                    c   5   37.7    88.0    25.9    24.6    36.4    44.1
                    c   6   34.1    84.7    25.4    25.3    37.4    43.4
                    c   7   36.1    84.8    24.5    24.8    39.6    44.7
                    c   8   38.6    90.1    26.4    25.6    38.7    47.8
                    c   9   34.5    84.7    25.1    25.2    37.7    42.1
                    c   10  35.2    84.6    24.9    24.9    33.7    38.9", header=T)
    
    # create a vector of names of variables of interest
    variables_of_interest = dt %>% select(matches("var")) %>% names()
    
    
    dt_res =
    data.frame(variables_of_interest,                         ## create a data frame with variable names as a column
               stringsAsFactors = F) %>%
      group_by(variables_of_interest) %>%                     ## for each variable of interest
      do({dt2 = dt[,c(.$variables_of_interest,"id","time")]   ## pick that variable along with id and time
          names(dt2)[1] = "var"                               ## rename that variable to "var" (to be used as a name within ezANOVA)
          res = ezANOVA(data = dt2,                           ## run ezANOVA
                        dv = .(var), 
                        wid = .(id), 
                        within = .(time), 
                        detailed = T, type = 3)
          data.frame(res)})                                   ## save results as a dataframe to be returned next to the variable name
    

    我建议您逐步运行代码,看看它是如何工作的。 尝试手动检查结果是否正确。 让我知道您对输出是否满意,或者是否需要任何修改。

    【讨论】:

    • 非常感谢。我对输出很满意!看来我需要从你的代码中学习一些新功能,我认为这些功能会很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2015-01-09
    • 2015-02-19
    相关资源
    最近更新 更多