如何计算R中不同列维数矩阵之间的相关性

如何计算R中不同列维数矩阵之间的相关性,r,matrix,R,Matrix,我有两个矩阵,行数相同,列数不同,如下所示: mat1 <- matrix(rnorm(20), 4, 5) mat2 <- matrix(rnorm(12), 4, 3) 由于行数相同,我希望计算矩阵列之间的以下相关性: cor.test(mat1[,1], mat2[,1]) cor.test(mat1[,1], mat2[,2]) cor.test(mat1[,1], mat2[,3]) cor.test(mat1[,2], mat2[,1]) cor.test(m

我有两个矩阵,行数相同,列数不同,如下所示:

mat1 <- matrix(rnorm(20), 4, 5)
mat2 <- matrix(rnorm(12), 4, 3)
由于行数相同,我希望计算矩阵列之间的以下相关性:

 cor.test(mat1[,1], mat2[,1])
 cor.test(mat1[,1], mat2[,2])
 cor.test(mat1[,1], mat2[,3])
 cor.test(mat1[,2], mat2[,1])
 cor.test(mat1[,2], mat2[,2])
 cor.test(mat1[,2], mat2[,3])
 ...........
 ...........
 cor.test(mat1[,5], mat2[,3])

for(i in 1:5){
  for(j in 1:3){
    pv[i,j] <- cor.test(mat1[, i], mat2[ , j])$p.value
  }
}
最后我想要一个矩阵x5*3或包含相关值的向量,有人能帮忙吗

我可以用它来返回p.value和estimate吗

 FUN <- function(x, y) { 
    res <- cor.test(x, y, method="spearman", exact=F) 
    return(list(c = res$estimate, p = res$p.value)) 
  }

 r1 <- outer(colnames(mat1), colnames(mat2), Vectorize(function(i,j) FUN(mat1[,i], mat2[,j])$p))
 r2 <- outer(colnames(mat1), colnames(mat2), Vectorize(function(i,j) FUN(mat1[,i], mat2[,j])$c))
谢谢。

为什么不直接用cor函数来计算皮尔逊相关性呢

seed(1)
mat1 <- matrix(rnorm(20), 4, 5)
mat2 <- matrix(rnorm(12), 4, 3)
cor(mat1, mat2)
       [,1]        [,2]        [,3]
[1,]  0.4406765 -0.70959590  0.10731768
[2,] -0.2566199 -0.01588993 -0.63630159
[3,] -0.9813313  0.85082165 -0.77172317
[4,]  0.6121358 -0.38564314  0.87077092
[5,] -0.6897573  0.66272015 -0.08380553
再核实一下,

> col_1 <- 3
> col_2 <- 2
# all.equal is used to compare numeric equality where `==` is discouraged
> all.equal(cor(mat1, mat2)[col_1, col_2], cor(mat1[,col_1], mat2[,col_2]))
[1] TRUE
他们是平等的

为什么不直接用cor函数来计算皮尔逊相关性呢

seed(1)
mat1 <- matrix(rnorm(20), 4, 5)
mat2 <- matrix(rnorm(12), 4, 3)
cor(mat1, mat2)
       [,1]        [,2]        [,3]
[1,]  0.4406765 -0.70959590  0.10731768
[2,] -0.2566199 -0.01588993 -0.63630159
[3,] -0.9813313  0.85082165 -0.77172317
[4,]  0.6121358 -0.38564314  0.87077092
[5,] -0.6897573  0.66272015 -0.08380553
再核实一下,

> col_1 <- 3
> col_2 <- 2
# all.equal is used to compare numeric equality where `==` is discouraged
> all.equal(cor(mat1, mat2)[col_1, col_2], cor(mat1[,col_1], mat2[,col_2]))
[1] TRUE

他们是平等的

我想你所需要的就是先定义你的矩阵

mat_cor <- matrix(nrow=ncol(mat1), ncol=ncol(mat2))
for(i in 1:5)
    {
        for(j in 1:3)
            {
                mat_cor[i,j] <- cor.test(mat1[, i], mat2[ , j])$p.value
            }
    }

我想你只需要先定义你的矩阵

mat_cor <- matrix(nrow=ncol(mat1), ncol=ncol(mat2))
for(i in 1:5)
    {
        for(j in 1:3)
            {
                mat_cor[i,j] <- cor.test(mat1[, i], mat2[ , j])$p.value
            }
    }

我想你会不带着我去做的。对于基础材料,以下是双重应用方法:

apply(mat1, 2, function(col_mat1){
  apply(mat2, 2, function(col2, col1) {
    cor.test(col2, col1)$p.value
  }, col1=col_mat1)
})

outter apply在mat1列上迭代,并服务于cor.test的一侧。内部的一个也会这样做,但是现在填充了cor.test的第二个面。实际上,apply正在取代for。我想您可能希望在没有for的情况下使用它。对于基础材料,以下是双重应用方法:

apply(mat1, 2, function(col_mat1){
  apply(mat2, 2, function(col2, col1) {
    cor.test(col2, col1)$p.value
  }, col1=col_mat1)
})

outter apply在mat1列上迭代,并服务于cor.test的一侧。内部的一个也会这样做,但是现在填充了cor.test的第二个面。实际上,apply正在取代for。

您可以尝试这样的方法

pv <- c()
for(i in 1:dim(mat1)[2]){
  for(j in 1:dim(mat2)[2]){
    pv <-c(c, cor.test(mat1[, i], mat2[ , j])$estimate)
  }
}

dim(pv) <- c(dim(mat1)[2], dim(mat2)[2])

你可以试试这样的东西

pv <- c()
for(i in 1:dim(mat1)[2]){
  for(j in 1:dim(mat2)[2]){
    pv <-c(c, cor.test(mat1[, i], mat2[ , j])$estimate)
  }
}

dim(pv) <- c(dim(mat1)[2], dim(mat2)[2])

另一种选择,在我看来比循环更容易理解:

sapply(
  data.frame(mat1),
  function(x) Map(function(a,b) cor.test(a,b)$p.value,
                                list(x),
                                as.data.frame(mat2))
)
结果:

#     X1        X2        X3        X4        X5       
#[1,] 0.7400541 0.8000358 0.5084979 0.4441933 0.9104712
#[2,] 0.2918163 0.2764817 0.956807  0.6072979 0.4395218
#[3,] 0.2866105 0.4095909 0.5648188 0.1746428 0.9125866

另一种选择,在我看来比循环更容易理解:

sapply(
  data.frame(mat1),
  function(x) Map(function(a,b) cor.test(a,b)$p.value,
                                list(x),
                                as.data.frame(mat2))
)
结果:

#     X1        X2        X3        X4        X5       
#[1,] 0.7400541 0.8000358 0.5084979 0.4441933 0.9104712
#[2,] 0.2918163 0.2764817 0.956807  0.6072979 0.4395218
#[3,] 0.2866105 0.4095909 0.5648188 0.1746428 0.9125866


我会把两者都提取出来,我没有问题。我唯一的问题是如何比较每个Column向量。我将同时提取这两个向量,我对此没有问题。我唯一的问题是如何比较每个列向量。从?cor-如果'x'和'y'是矩阵,则计算'x'列和'y'列之间的相关性。我还需要Pvalue,{cor.test}是我要看的。p.值不是相关系数。我可以轻松地用estimate替换p.value,反正我需要这两个。谢谢。请编辑您的问题,清楚地说明您需要什么。是的。从?cor-如果'x'和'y'是矩阵,则计算'x'列和'y'列之间的相关性。我还需要Pvalue,{cor.test}是我要看的。p.值不是相关系数。我可以轻松地用estimate替换p.value,反正我需要这两个。谢谢。请编辑您的问题以清楚地说明您需要什么。编辑以重命名输出矩阵这与问题底部的代码相同。@Athos这就是为什么要编写它的原因,我认为您只需要先定义您的矩阵。编辑以重命名输出矩阵这与问题底部的代码相同。@Athos这就是为什么要编写它的原因我想你只需要先定义你的矩阵。@aliocee-你已经得到了很多解决方案,为什么不使用其中一个呢?@aliocee-你已经得到了很多解决方案,为什么不使用其中一个呢?我可以同时提取“p.value”和“estimate”吗cor.testcol2,col1[[1][2]],我将如何做呢?是的,您可以,但需要一些努力来考虑输出格式。我的意思是,它将如何呈现?两个矩阵?带有p.value和estimate列的data.frame?还有其他一些库可以方便地完成这类工作。我可以同时提取“p.value”和“evaluate”吗cor.testcol2,col1[[1][2]],我将如何做呢?是的,您可以,但需要一些努力来考虑输出格式。我的意思是,它将如何呈现?两个矩阵?带有p.value和estimate列的data.frame?还有其他一些库可以很容易地完成这类工作。