迭代包含3000行的大矩阵并计算相关性

时间:2010-07-30 14:09:48

标签: r matrix

我试图循环一个矩阵并做每个两行的相关系数并打印出相关矩阵。

ID A B C D E F G H I
Row01 0.08 0.47 0.94 0.33 0.08 0.93 0.72 0.51 0.55
Row02 0.37 0.87 0.72 0.96 0.20 0.55 0.35 0.73 0.44
Row03 0.19 0.71 0.52 0.73 0.03 0.18 0.13 0.13 0.30
Row04 0.08 0.77 0.89 0.12 0.39 0.18 0.74 0.61 0.57
Row05 0.09 0.60 0.73 0.65 0.43 0.21 0.27 0.52 0.60
Row06 0.60 0.54 0.70 0.56 0.49 0.94 0.23 0.80 0.63
Row07 0.02 0.33 0.05 0.90 0.48 0.47 0.51 0.36 0.26
Row08 0.34 0.96 0.37 0.06 0.20 0.14 0.84 0.28 0.47
........
(30000 rows!)

我希望Pearson相关输出为:

 Row01
Row01 1.000
Row02 0.012
Row03 0.023
Row04 0.820
Row05 0.165
Row06 0.230
Row07 0.376
Row08 0.870

输出为Row01.txt

Row02
Row01 0.012
Row02 1.000
Row03 0.023
Row04 0.820
Row05 0.165
Row06 0.230
Row07 0.376
Row08 0.870

输出为Row02.txt。 。 。 。

输出文件将是30000!

我知道这个算法看起来很愚蠢,matrix<-cor(T(data))会完成整个事情,而corr矩阵的一半就足够了,因为corr结果沿着对角线是对称的。

但我的问题是

  1. 我的数据太大,R无法处理30000x30000。
  2. 很难检索特定行与其余行的特定关联。
  3. 使用我的“愚蠢算法”,我可以轻松地从文件夹中获取我感兴趣的信息。

3 个答案:

答案 0 :(得分:1)

未经测试,但我认为这样的事情应该可行

编辑:更正代码以避免巨大的矩阵

correl <- NULL
for (i in 1:nrow(datamatrix))
    {
    correl <- apply(datamatrix, 1, function(x){cor(datamatrix[,i], x)})
    write.table(correl, paste("col", i, ".txt", sep="")
    }

答案 1 :(得分:1)

谢谢Nico! 我纠正了小错误后几乎到了那里。在这里我附上我的剧本:

datamatrix=read.table("ref.txt",sep="\t",header=T,row.names=1)
correl <- NULL
for (i in 1:nrow(datamatrix)) {
  correl <- apply(datamatrix, 1, function(x){cor(t(datamatrix[,i]))})
  write.table(correl, paste(row.names(datamatrix)[i], ".txt", sep=""))
}

但我担心函数(x)部分有问题,似乎是t(datamatrix[i,j]),它将计算任意两行的corr。

实际上我需要遍历矩阵。 第一个cor(row01, row02)获得rwo01和row02之间的一个相关性;然后cor(row01, row03)得到row01和rwo03的相关性,......直到row01 row30000之间的相关性。现在我得到了

的第一列
      row01
Row01 **1.000**
Row02 0.012
Row03 0.023
Row04 0.820
Row05 0.165
Row06 0.230
Row07 0.376
Row08 0.870

并将其保存到文件row01.txt;

同样获得

      Row02
Row01 0.012
Row02 **1.000**
Row03 0.023
Row04 0.820
Row05 0.165
Row06 0.230
Row07 0.376
Row08 0.870

并将其保存到文件row02.txt。

我将获得30000个文件。这是愚蠢的,但这可以跳过内存限制,并且可以很容易地处理特定行的相关性。

答案 2 :(得分:0)

我建议查看bigmemory包和foreach包,在大内存映射文件中进行这些计算(即输入矩阵是一个文件,相关矩阵是另一个)。这样,您就可以使用多个内核而不会在RAM中存储太多内容。