【问题标题】:Iterating over the big matrix containing 3000 rows and calculate the correlation迭代包含 3000 行的大矩阵并计算相关性
【发布时间】:2010-07-30 14:09:48
【问题描述】:

我正在尝试遍历 a 矩阵并计算每两行的相关系数并打印出相关矩阵。

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. 使用我的“愚蠢算法”,我可以轻松地从文件夹中获取我感兴趣的 corr。

【问题讨论】:

    标签: r matrix


    【解决方案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="")
        }
    

    【讨论】:

    • 嗯,我担心那不会飞。原始海报声称datamatrix 太大而无法记忆。
    • @Dirk Eddelbuettel:嗯,没错,我以为他在谈论输出矩阵,但输入矩阵也很大......没有考虑到这一点。是不是有一个包可以处理内存中的巨大矩阵,还是我错了?
    • 谢谢!我想使用的 SUSE 有问题。我会尝试代码并很快回来。
    【解决方案2】:

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

    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=""))
    }
    

    但恐怕function(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 个文件。这很愚蠢,但这可以跳过内存限制,并且可以轻松处理特定行的相关性。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-06-12
        • 2012-10-01
        • 2018-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        相关资源
        最近更新 更多