【问题标题】:How to calculate correlation between matrices with different column dimention in R如何计算R中具有不同列维度的矩阵之间的相关性
【发布时间】:2014-11-21 01:32:24
【问题描述】:

我有两个行数相同但列数不同的矩阵:

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
  }
}

最后我想要一个包含相关值的矩阵(5 * 3)或向量,有人可以帮忙吗?

我可以使用它来返回 p.value 和估计值吗?

 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))

谢谢。

【问题讨论】:

  • 我会提取两者,我对此没有任何问题。我唯一的问题是如何比较每个列向量。

标签: r matrix


【解决方案1】:

为什么不直接使用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 - “如果‘x’和‘y’是矩阵,则计算‘x’列和‘y’列之间的相关性。
  • 我也想要 pvalues,{cor.test} 就是我在看的东西。
  • p.values 不是相关系数。
  • 我可以轻松地将 p.value 替换为估计值,无论如何我都需要这两个。谢谢
  • 那么请编辑您的问题以明确说明您需要什么。
【解决方案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

【讨论】:

  • @aliocee - 你已经得到了许多解决方案,为什么不直接使用其中一个呢?
【解决方案3】:

我想你想在没有 for 的情况下这样做。有了基本的东西,这里是双重应用方法:

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

外部 apply 在 mat1 列处迭代并服务于 cor.test() 的一侧。内部的也是如此,但现在填充了cor.test() 的第二面。实际上,apply 是替换 for 的。

【讨论】:

  • 我可以同时提取“p.value”和“estimate”吗? 'cor.test(col2, col1)[[1][2]]',请问我该怎么做?
  • 是的,你可以,但需要一些努力来考虑输出格式。我的意思是,它将如何呈现?两个矩阵?带有 p.value 和估计列的 data.frame?还有其他一些库可以用来轻松完成这类工作。
【解决方案4】:

我认为你只需要先定义你的矩阵

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

          [,1]      [,2]        [,3]
[1,] 0.9455569 0.8362242 0.162569342
[2,] 0.7755360 0.9849619 0.775006329
[3,] 0.8799139 0.8050564 0.001358697
[4,] 0.1574388 0.1808167 0.618624825
[5,] 0.8571844 0.8897125 0.879818822

【讨论】:

  • 编辑重命名输出矩阵
  • 这是问题底部的相同代码。
  • @Athos 这就是为什么它写成“我认为你需要的只是先定义你的矩阵”。
【解决方案5】:

你可以试试这样的

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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多