R 获取两个大小不同的数据帧之间的所有组合的相关性

R 获取两个大小不同的数据帧之间的所有组合的相关性,r,correlation,R,Correlation,与R中的cor()函数类似,是否有一个R函数来计算所有可能的相关性,并在两个数据帧中的行之间提供p值(列数相似但行数不同) 我找到了cor.test(),但它只接受大小类似的数据帧 据我所知,函数cor.test只接受长度相同的数值向量 您可以通过函数corrplot::cor.mtest实现所需的功能 这是一个可复制的例子。首先加载库并创建假数据 library(corrplot) nbgene1 <- 100 nbgene2 <- 200 n <- 10 df1 <

与R中的
cor()
函数类似,是否有一个R函数来计算所有可能的相关性,并在两个数据帧中的行之间提供p值(列数相似但行数不同)


我找到了
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
(因为在您的例子中,行是基因,列是个体)

这是一个简单的
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
  }
}

pval为什么要获取不同大小数据集的相关性?还有,为什么不合并/绑定它们呢。这两个数据集在某种程度上相关吗?我有一个表达值在df1中的“基因”子集(100行和10个样本)和另一个表达值在df2中的基因子集(1000行和10个样本)。我想对df1中的每一行和df2OK中的每一行进行逐行corr.测试,我们是否正确理解您希望对每个样本中的10个数据点进行100x1000相关性?
res_cortest <- cor.mtest(t(df_combined))
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))
> 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)
}
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
  }
}