在 R 中自动执行多个主题内方差分析
Automatically performing multiple within-subject ANOVA in R
我的数据如下
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 来获得,以便在 .()
.
中允许该函数
欢迎任何解决方案!
对 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
我建议您 运行 逐步查看代码以了解其工作原理。
尝试手动检查结果是否正确。
如果您对输出感到满意,或者是否需要任何修改,请告诉我。
我的数据如下
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 来获得,以便在 .()
.
欢迎任何解决方案!
对 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
我建议您 运行 逐步查看代码以了解其工作原理。 尝试手动检查结果是否正确。 如果您对输出感到满意,或者是否需要任何修改,请告诉我。