我有两个矩阵列表(列表A和列表B,每个矩阵的维度为14x14,列表A包含10个矩阵,列表B包含11个矩阵)我想对每个坐标做一个t检验,比较a组和B组每个坐标的均值。因此,我希望有一个维度为14x14的矩阵,其中包含与每个t检验相关的p值。
提前感谢您的回答。
这是一个使用for循环然后应用lm()函数的方法。
首先,我们将生成问题中描述的一些假数据。
#generating fake matrices described by OP
listA <- vector(mode = "list", length = 10)
listB <- vector(mode = "list", length = 10)
for (i in 1:10) {
listA[[i]] <- matrix(rnorm(196),14,14,byrow = TRUE)
}
for (i in 1:11) {
listB[[i]] <- matrix(rnorm(196),14,14,byrow = TRUE)
}
然后我们将按照dcarlson在for循环中描述的方式展开每个矩阵。
Unwrapped.Mats <- NULL
for (ID in 1:10) {
unwrapped <- as.vector(as.matrix(listA[[ID]])) #Unwrapping each matrix into a vector
withID <- c(ID, "GroupA", unwrapped) #labeling it with ID# and which group it belongs to
UnwrappedCorMats <- rbind(Unwrapped.Mats, withID)
}
for (ID in 1:11) {
unwrapped <- as.vector(as.matrix(listB[[ID]]))
withID <- c(PID, "GroupB", unwrapped)
UnwrappedCorMats <- rbind(UnwrappedCorMats, withID)
}
然后编写并应用一个函数来运行lm()。在这种情况下,lm()在统计上等同于非配对t检验,但如果有人想添加混合效应,我使用它更容易适应混合效应模型。
UnwrappedDF <- as.data.frame(UnwrappedCorMats)
lmPixel2Pixel <- function(i) { #defining function to run lm
lmoutput <- summary(lm(i ~ V2, data= UnwrappedDF))
lmoutputJustP <- lmoutput$coefficients[2,4] #Comment out this line to return full lm output rather than just p value
}
Vector_pvals <- sapply(UnwrappedDF[3:length(UnwrappedDF)], lmPixel2Pixel)
最后,我们将把向量转换成与原始矩阵相同的形状,以便更容易地解释结果
LM_mat.again <- as.data.frame(matrix(Vector_pvals, nrow = nrow(listA[[1]]), ncol = ncol(listA[[1]]), byrow = T))
colnames(LM_mat.again) <- colnames(listA[[1]]) #if your matrix has row or column names then restoring them is helpful for interpretation
rownames(LM_mat.again) <- colnames(listB[[1]])
head(LM_mat.again)
我相信有更快的方法,但这个方法非常直接,我很惊讶还没有这种类型的操作的答案