我试图在两个矩阵中的行上使用cor.test,即cer和par。
cerParCorTest <-mapply(function(x,y)cor.test(x,y),cer,par)
然而,mapply适用于列。
此问题已在Efficient apply or mapply for multiple matrix arguments by row中讨论过。我尝试了拆分解决方案(如下所示)
cer <- split(cer, row(cer))
par <- split(par, row(par))
它会导致错误(加上它很慢)
In split.default(x = seq_len(nrow(x)), f = f, drop = drop, ...) :
data length is not a multiple of split variable
我也试过t(par)和t(cer)让它在行上运行,但是会导致错误
Error in cor.test.default(x, y) : not enough finite observations
下面显示了martices(对于cer和par相同):
V1698 V1699 V1700 V1701
YAL002W(cer) 0.01860500 0.01947700 0.02043300 0.0214740
YAL003W(cer) 0.07001600 0.06943900 0.06891200 0.0684330
YAL005C(cer) 0.02298100 0.02391900 0.02485800 0.0257970
YAL007C(cer) -0.00026047 -0.00026009 -0.00026023 -0.0002607
YAL008W(cer) 0.00196200 0.00177360 0.00159490 0.0014258
我的问题是为什么转置矩阵不起作用以及什么是允许在cor.test()上使用mapply运行行的简短解决方案。
我为这篇长篇文章道歉,并提前感谢您的帮助。
答案 0 :(得分:3)
我不知道矩阵的尺寸是多少,但这对我来说很好用
N <- 3751 * 1900
cer.m <- matrix(1:N,ncol=1900)
par.m <- matrix(1:N+rnorm(N),ncol=1900)
ll <- mapply(cor.test,
split(par.m,row(par.m)),
split(cer.m,row(cer.m)),
SIMPLIFY=FALSE)
这将为您提供3751个元素的列表(每行的相关性)
编辑没有拆分,你给出了行的索引,这应该是快的
ll <- mapply(function(x,y)cor.test(cer.m[x,],par.m[y,]),
1:nrow(cer.m),
1:nrow(cer.m),
SIMPLIFY=FALSE)
EDIT2 如何获取估算值:
要获取estimate
值,例如:
sapply(ll,'[[','estimate')
答案 1 :(得分:1)
你总是可以用for循环编程,在这些维度上似乎相当快:
x1 <- matrix(rnorm(10000000), nrow = 2000)
x2 <- matrix(rnorm(10000000), nrow = 2000)
out <- vector("list", nrow(x1))
system.time(
for (j in seq_along(out)) {
out[[j]] <- cor.test(x1[j, ], x2[j, ])
}
)
user system elapsed
1.35 0.00 1.36
编辑:如果您只想要估算,我不会将结果存储在列表中,而是一个简单的向量:
out2 <- vector("numeric", nrow(x1))
for (j in seq_along(out)) {
out2[j] <- cor.test(x1[j, ], x2[j, ])$estimate
}
head(out2)
如果您想存储所有结果并简单地从每个结果中提取估算值,那么这应该可以解决问题:
> out3 <- as.numeric(sapply(out, "[", "estimate"))
#Confirm they are the same
> all.equal(out2, out3)
[1] TRUE
权衡是第一种方法将所有数据存储在一个列表中,这可能对进一步处理有用,而不是只能抓住你最初想要的mroe简单方法。