0

我正在尝试在 2 个矩阵中的行上使用 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

我的问题是为什么转置矩阵不起作用,什么是一个简短的解决方案,它允许使用 mapply for cor.test() 在行上运行。

对于这篇长篇文章,我深表歉意,并提前感谢您的帮助。

4

2 回答 2

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')
于 2013-03-19T20:41:26.643 回答
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 简单方法只获取您最初想要的内容。

于 2013-03-19T21:07:51.320 回答