【问题标题】:Compare only pairwise comparisons BETWEEN two matrices using rcorr() in R在 R 中使用 rcorr() 仅比较两个矩阵之间的成对比较
【发布时间】:2016-07-28 08:41:10
【问题描述】:

希望这篇文章不是重复的,但我花了相当长的时间搜索并没有找到答案。

我有两个矩阵,我试图在它们之间进行成对相关,看起来像这样。

Matrix 1
       gene1     gene2     gene3
ID1    12        32        43
ID2    94        34        95
ID3    90        54        23
ID4    43        76        65

Matrix2
       TE1       TE2       TE3    
ID1    94        90        82
ID2    23        46        94
ID3    23        49        39
ID4    39        34        46

我可以使用基函数 cor() 获得一个 R^2 值表,它只在矩阵之间进行比较,以成对的方式。结果如下所示:

     gene1        gene2        gene3
TE1  0.98         0.48         0.45
TE2  0.77         0.46         0.76
TE3  0.45         0.56         0.76

这太棒了!但问题是我也需要 p 值,所以我可以将矩阵缩减为只有 p 值小于某个截止值的矩阵(因为我的真实矩阵是 [30,800] 和 [30,1000],我需要一种方法来将数据减少到可以理解的程度)。

rcorr() 包在这方面做得很好,因为它产生了一个相关矩阵r,一个p 值矩阵P,以及一个观察次数的向量。但是,我还没有找到一种只比较矩阵之间的方法——它也比较矩​​阵之间。我得到的结果如下所示:

       gene1   gene2   gene3   TE1   TE2   TE3
gene1  1.0     0.5     0.5     0.5   0.3   0.9
gene2          1.0     0.4     0.7   0.7   0.5
gene3                  1.0     0.8   0.8   0.5
TE1                            1.0   0.8   0.2
TE2                                  1.0   0.7
TE3                                        1.0

这是组成的数据,但它说明了这一点。这会产生两倍于我实际需要的数据,并减慢计算速度,并产生视觉上无意义的相关图。

所以我的问题是:有没有办法使用 Hmisc 包函数 rcorr() 仅在矩阵之间进行比较,而不是在矩阵内进行比较?

我还在矩阵列表上尝试了 cor.test:

cor.test(c(matrix1),c(matrix2), method="pearson")

但我收到一个错误,'x' and 'y' must have the same length

接下来,我必须弄清楚如何根据具有高相关性和低 p 值的列表来实际对矩阵进行子集化,但我发现这里有一些有用的答案需要仔细检查。

【问题讨论】:

    标签: r matrix correlation


    【解决方案1】:

    可能有一种更简单的方法来做到这一点,但一种选择是为每一列对做一个cor.test

    tmp <- with(expand.grid(seq(ncol(matrix1)), seq(ncol(matrix2))),
                mapply(function(i, j) cor.test(matrix1[, i], matrix2[, j]),
                       Var1, Var2))
    

    然后从测试对象中提取元素

    matrix(unlist(tmp['estimate', ]), nrow=ncol(matrix1),
           dimnames=list(colnames(matrix1), colnames(matrix2)))
    #             TE1        TE2          TE3
    #gene1 -0.8757869 -0.4755768 -0.008312574
    #gene2 -0.3567850 -0.7585136 -0.834883959
    #gene3 -0.2723512 -0.3764091  0.546779587
    
    matrix(unlist(tmp['p.value', ]), nrow=ncol(matrix1),
           dimnames=list(colnames(matrix1), colnames(matrix2)))
    #             TE1       TE2        TE3
    #gene1 0.05156122 0.4181472 0.98941622
    #gene2 0.55555798 0.1371765 0.07851595
    #gene3 0.65756758 0.5323119 0.34025894
    

    您可以通过将cor(matrix1, matrix2) 的输出与估计矩阵进行比较来检查它是否正确,矩阵应该相等。

    【讨论】:

    • 所以,我会接受这个答案,因为它有效,我将来可能会使用它。谢谢!但我最终使用 rcorr() 完成了同样的事情,使用这篇博文link 中的函数。我使用“flatten”函数为每个成对比较提取 pvalues 和相关值,然后使用名称中的字符串特征排除除我想要的成对比较之外的所有内容,然后使用dcast() 制作矩阵。
    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2016-08-03
    • 2013-11-24
    • 2010-10-30
    • 2012-09-22
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多