【问题标题】:Pearson coefficient per rows on large matrices大型矩阵上每行的皮尔逊系数
【发布时间】:2018-05-07 18:52:20
【问题描述】:

我目前正在处理一个大型矩阵(4 列和大约 8000 行)。 我想使用构成该矩阵的不同行之间的 Pearson 相关系数进行相关分析。

我想按照以下方式进行:

求第 1 行和第 2 行之间的 Pearson 相关系数。然后在第 1 行和第 3 行之间……以此类推,其余行。

  • 然后找到第 2 行和第 3 行之间的 Pearson 相关系数。然后在第 2 行和第 4 行之间……以此类推,其余行。注意我不会再找到第1行的系数了......

  • 对于那些分别高于或低于 0.7 或 -0.7 的系数,我想在单独的文件中列出与这些系数相对应的行名以及系数。例如。: 第 230 行 - 第 5812 行 - 0.76

我为此目的编写了以下代码。不幸的是,它需要的运行时间太长(我估计差不多一个星期:()。

for (i in 1:7999) {
print("Analyzing row:")
print(i)    
for (j in (i+1):8000) {
    value<- cor(alpha1k[i,],alpha1k[j,],use = "everything",method = "pearson")
    if(value>0.7 | value<(-0.7)){
        aristi <- c(row.names(alpha1k)[i],row.names(alpha1k)[j],value)
        arist1p<-rbind(arist1p,aristi)

    }
}

那么我的问题是是否有任何方法可以让我更快地做到这一点。我阅读了有关并行进行这些计算的信息,但我不知道如何进行这项工作。我希望我已经足够清楚了,提前谢谢你!

【问题讨论】:

  • 如果你使用cor接受矩阵输入,你可以避免在循环中嵌套一层。
  • 另外,不要循环增长对象。

标签: r


【解决方案1】:

正如 Roland 所指出的,您可以使用cor 的矩阵版本来简化您的任务。只需转置矩阵以获得“行”比较。

mydf <- data.frame(a = c(1,2,3,1,2,3,1,2,3,4), b = rep(5,2,10), c = c(1:10))
cor_mat <- cor(t(mydf)) # correlation of your transposed matrix
idx <- which((abs(cor_mat) > 0.7), arr.ind = T) # get relevant indexes in a matrix form
cbind(idx, cor_mat[idx]) # combine coordinates and the correlation

请注意,参数use = everythingmethod = "pearson" 默认情况下用于关联。无需指定它们。

【讨论】:

    猜你喜欢
    • 2015-07-18
    • 2019-08-31
    • 2021-08-29
    • 1970-01-01
    • 2014-04-11
    • 2018-06-18
    • 1970-01-01
    • 2011-09-10
    • 2016-08-24
    相关资源
    最近更新 更多