方差分析对多个数据帧的重复测量r

问题描述 投票:0回答:1

我有几百个数据帧,我需要对每个数据帧进行方差分析RM检验。我需要对这些数据帧中的每一个进行方差分析RM测试。输出的结果应该是一个单一的数据帧,每个p值的平均值。

我试过了,我有几百个数据帧,我需要对每个数据帧进行方差分析RM测试。

#crate dataframes
df1 <- data.frame(replicate(16,sample(-10:10,10,rep=TRUE)))
df2 <- data.frame(replicate(16,sample(-10:10,10,rep=TRUE)))
df3 <- data.frame(replicate(16,sample(-10:10,10,rep=TRUE)))
Group <- c(rep("A",8),rep("B",8))
Time <- c(rep("before",4),rep("after",4),rep("before",4),rep("after",4))
Name <- rep(rep(1:4, 4))
conds <- data.frame(Name,Time,Group)
#create list
list <- list(df1,df2,df3)

#for loop ANOVA repeated measures
for ( i in list){
  data <- cbind(conds,i)
  t=NULL
  name <- colnames(data)[4:ncol(data)]
  for(i in 4:ncol(data)) { z <- aov(data[,i] ~ Group*Time+Error(Name/(Group*Time)), data=data) 
  sz <- as.list(summary(z))
  t <- as.data.frame(c(t,sz[4]$`Error: Name:Group:Time`[[1]]$`Pr(>F)`[1]))
  t
  }
}
mean(t)
r for-loop anova
1个回答
1
投票

R作为一种矢量化的语言,是为了避免 for 尽可能的循环。你可以做一个 sapply 的方法。

当你列出你的数据框架时,使用像 df1=,这在以后的工作中会有帮助。result对其中的哪些做了计算。

(不要用 list 作为对象名称,因为你会感到困惑,因为还有一个 list 功能。另外 data, df 和朋友都是 "不好 "的名字,你可以随时检查,使用如。?list 如果名字已经被占用,您可以随时检查,例如使用)

list1 <- list(df1=df1, df2=df2, df3=df3)

res <- sapply(list1, function(x) {
  dat <- cbind(conds, x)
  sapply(dat[-(1:3)], function(y) {
    z <- aov(y ~ Group*Time + Error(Name/(Group*Time)), data=dat)
    sz <- summary(z)
    p <- sz$`Error: Name:Group:Time`[[1]][1, 5]
    p
  })
})

从结果矩阵中,我们取列平均值。

colMeans(res)
#       df1       df2       df3 
# 0.4487419 0.4806528 0.4847789

数据。

set.seed(42)
df1 <- data.frame(replicate(16,sample(-10:10,16,rep=TRUE)))
df2 <- data.frame(replicate(16,sample(-10:10,16,rep=TRUE)))
df3 <- data.frame(replicate(16,sample(-10:10,16,rep=TRUE)))
conds <- data.frame(Name=c(rep("A",8),rep("B",8)), 
                    Time=c(rep("before",4),rep("after",4),
                           rep("before",4),rep("after",4)),
                    Group=rep(1:4, 4))
© www.soinside.com 2019 - 2024. All rights reserved.