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