用于行cor.test函数的mapply

时间:2013-03-19 19:57:42

标签: r

我试图在两个矩阵中的行上使用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运行行的简短解决方案。

我为这篇长篇文章道歉,并提前感谢您的帮助。

2 个答案:

答案 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简单方法。