как рассчитать корреляцию между соответствующими столбцами двух матриц и не получить другие корреляции в качестве вывода

у меня есть эти данные

> a
     a    b    c
1    1   -1    4
2    2   -2    6
3    3   -3    9
4    4   -4   12
5    5   -5    6

> b
     d    e    f
1    6   -5    7
2    7   -4    4
3    8   -3    3
4    9   -2    3
5   10   -1    9

> cor(a,b)
           d            e             f
a  1.0000000    1.0000000     0.1767767
b -1.0000000    -1.000000    -0.1767767
c  0.5050763    0.5050763    -0.6964286

Результат, который я хочу, это просто:

cor(a,d) = 1
cor(b,e) = -1
cor(c,f) = -0.6964286

person rder    schedule 15.07.2011    source источник


Ответы (3)


Я бы, вероятно, лично просто использовал diag:

> diag(cor(a,b))
[1]  1.0000000 -1.0000000 -0.6964286

Но вы также можете использовать mapply:

> mapply(cor,a,b)
         a          b          c 
 1.0000000 -1.0000000 -0.6964286
person Joshua Ulrich    schedule 15.07.2011

Первый ответ выше вычисляет все попарные корреляции, что нормально, если только матрицы не большие, а второй не работает. Насколько я могу судить, эффективные вычисления должны выполняться напрямую, например, этот код, заимствованный из пакета arrayMagic Bioconductor, эффективно работает для больших матриц:

> colCors = function(x, y) { 
+   sqr = function(x) x*x
+   if(!is.matrix(x)||!is.matrix(y)||any(dim(x)!=dim(y)))
+     stop("Please supply two matrices of equal size.")
+   x   = sweep(x, 2, colMeans(x))
+   y   = sweep(y, 2, colMeans(y))
+   cor = colSums(x*y) /  sqrt(colSums(sqr(x))*colSums(sqr(y)))
+   return(cor)
+ }

> set.seed(1)
> a=matrix(rnorm(15),nrow=5)
> b=matrix(rnorm(15),nrow=5)
> diag(cor(a,b))
[1]  0.2491625 -0.5313192  0.5594564
> mapply(cor,a,b)
 [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
> colCors(a,b)
[1]  0.2491625 -0.5313192  0.5594564
person user1048410    schedule 15.11.2011
comment
Можно ли добавить p-значения, а также скорректировать p-значения для множественных сравнений? - person ferrelwill; 07.10.2016

mapply работает с фреймами данных, но не с матрицами. Это связано с тем, что во фреймах данных каждый столбец является элементом, а в матрицах каждая запись является элементом.

В ответе выше mapply(cor,as.data.frame(a),as.data.frame(b)) работает просто отлично.

set.seed(1)
a=matrix(rnorm(15),nrow=5)
b=matrix(rnorm(15),nrow=5)
diag(cor(a,b))
[1]  0.2491625 -0.5313192  0.5594564
mapply(cor,as.data.frame(a),as.data.frame(b))
    V1         V2         V3 
 0.2491625 -0.5313192  0.5594564 

Это намного эффективнее для больших матриц.

person Cão    schedule 08.03.2018