在 R 中使用 rcorr() 仅比较两个矩阵之间的成对比较

Compare only pairwise comparisons BETWEEN two matrices using rcorr() in R

希望这个 post 不是重复的,但我已经花了很多时间搜索但未能找到答案。

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

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() 获得 table 的 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 值的矩阵列表实际对矩阵进行子集化,但我发现这里有一些有用的答案需要仔细检查。

可能有一种更简单的方法,但一个选择是对每个列对

执行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) 的输出与估计矩阵进行比较来检查它是否正确,矩阵应该相等。