获取两个不同大小的数据帧之间所有组合的相关性
Get correlations for all combinations between two differently sized dataframes
是否有一个 R 函数可以计算所有可能的相关性并提供两个数据帧(列数相似但行不同)的行之间的 p 值,类似于 R 中的 cor()
函数?
我找到了 cor.test(
),但它只需要一个相似大小的数据框。
据我所知,函数 cor.test
只接受长度相同的数值向量。
您可以使用函数 corrplot::cor.mtest
.
实现您想要的
这是一个可重现的例子。首先加载库并创建假数据...
library(corrplot)
nbgene1 <- 100
nbgene2 <- 200
n <- 10
df1 <- matrix(rnorm(nbgene1 * n), nbgene1, n)
rownames(df1) <- paste0("Df1_gene", 1:nbgene1)
colnames(df1) <- paste0("Subject", 1:n)
df2 <- matrix(rnorm(nbgene2 * n), nbgene2, n)
rownames(df2) <- paste0("Df2_gene", 1:nbgene2)
colnames(df2) <- paste0("Subject", 1:n)
函数cor.mtest
只接受一个单个数据框,个体为行,变量为列,所以你需要合并两个数据框。 ..
df_combined <- rbind(df1, df2)
... 并将转置数据框输入 cor.mtest
(因为在您的情况下,行是基因,列是个体)。
res_cortest <- cor.mtest(t(df_combined))
然后您需要做的就是从结果中提取正确的 p 值。
pval <- res_cortest$p[1:nbgene1, (nbgene1+1):(nbgene1+nbgene2)]
您可能需要重命名此矩阵的行和列以获得更易于解释的结果。
dimnames(pval) <- list(rownames(df1), rownames(df2))
此外,不要忘记更正多重测试!
# For example with Banjamini and Hochberg's method
padj <- matrix(p.adjust(pval, "BH"), nbgene1, nbgene2, dimnames = dimnames(pval))
比使用cor.mtest
更有趣的是看看里面有什么!
> corrplot::cor.mtest
function (mat, ...)
{
mat <- as.matrix(mat)
n <- ncol(mat)
p.mat <- lowCI.mat <- uppCI.mat <- matrix(NA, n, n)
diag(p.mat) <- 0
diag(lowCI.mat) <- diag(uppCI.mat) <- 1
for (i in 1:(n - 1)) {
for (j in (i + 1):n) {
tmp <- cor.test(x = mat[, i], y = mat[, j], ...)
p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
if (!is.null(tmp$conf.int)) {
lowCI.mat[i, j] <- lowCI.mat[j, i] <- tmp$conf.int[1]
uppCI.mat[i, j] <- uppCI.mat[j, i] <- tmp$conf.int[2]
}
}
}
list(p = p.mat, lowCI = lowCI.mat, uppCI = uppCI.mat)
}
这是一个简单的 for
循环!
在我们的可重现示例的上下文中,此循环的等效项是...
pval <- matrix(NA, nbgene1, nbgene2,
dimnames = list(rownames(df1),
rownames(df2)))
for (i in 1:nbgene1) {
for (j in 1:nbgene2) {
pval[i, j] <- cor.test(df1[i, ], df2[j, ])$p.value
}
}
倍数校正步骤相同
是否有一个 R 函数可以计算所有可能的相关性并提供两个数据帧(列数相似但行不同)的行之间的 p 值,类似于 R 中的 cor()
函数?
我找到了 cor.test(
),但它只需要一个相似大小的数据框。
据我所知,函数 cor.test
只接受长度相同的数值向量。
您可以使用函数 corrplot::cor.mtest
.
这是一个可重现的例子。首先加载库并创建假数据...
library(corrplot)
nbgene1 <- 100
nbgene2 <- 200
n <- 10
df1 <- matrix(rnorm(nbgene1 * n), nbgene1, n)
rownames(df1) <- paste0("Df1_gene", 1:nbgene1)
colnames(df1) <- paste0("Subject", 1:n)
df2 <- matrix(rnorm(nbgene2 * n), nbgene2, n)
rownames(df2) <- paste0("Df2_gene", 1:nbgene2)
colnames(df2) <- paste0("Subject", 1:n)
函数cor.mtest
只接受一个单个数据框,个体为行,变量为列,所以你需要合并两个数据框。 ..
df_combined <- rbind(df1, df2)
... 并将转置数据框输入 cor.mtest
(因为在您的情况下,行是基因,列是个体)。
res_cortest <- cor.mtest(t(df_combined))
然后您需要做的就是从结果中提取正确的 p 值。
pval <- res_cortest$p[1:nbgene1, (nbgene1+1):(nbgene1+nbgene2)]
您可能需要重命名此矩阵的行和列以获得更易于解释的结果。
dimnames(pval) <- list(rownames(df1), rownames(df2))
此外,不要忘记更正多重测试!
# For example with Banjamini and Hochberg's method
padj <- matrix(p.adjust(pval, "BH"), nbgene1, nbgene2, dimnames = dimnames(pval))
比使用cor.mtest
更有趣的是看看里面有什么!
> corrplot::cor.mtest
function (mat, ...)
{
mat <- as.matrix(mat)
n <- ncol(mat)
p.mat <- lowCI.mat <- uppCI.mat <- matrix(NA, n, n)
diag(p.mat) <- 0
diag(lowCI.mat) <- diag(uppCI.mat) <- 1
for (i in 1:(n - 1)) {
for (j in (i + 1):n) {
tmp <- cor.test(x = mat[, i], y = mat[, j], ...)
p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
if (!is.null(tmp$conf.int)) {
lowCI.mat[i, j] <- lowCI.mat[j, i] <- tmp$conf.int[1]
uppCI.mat[i, j] <- uppCI.mat[j, i] <- tmp$conf.int[2]
}
}
}
list(p = p.mat, lowCI = lowCI.mat, uppCI = uppCI.mat)
}
这是一个简单的 for
循环!
在我们的可重现示例的上下文中,此循环的等效项是...
pval <- matrix(NA, nbgene1, nbgene2,
dimnames = list(rownames(df1),
rownames(df2)))
for (i in 1:nbgene1) {
for (j in 1:nbgene2) {
pval[i, j] <- cor.test(df1[i, ], df2[j, ])$p.value
}
}
倍数校正步骤相同