2011-07-15 4 views
7

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

> 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,e) = 0.6964286 

ответ

4

я бы, вероятно, лично просто использовать 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 
9

Первый ответ выше вычисляет все попарные корреляции, которая является штраф, если матрицы не являются большими, а второй один не работает. Насколько я могу сказать, эффективное вычисление должно быть сделано непосредственно, например, этим кодом заимствованного из заимствовано из пакета 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 
+0

Можно ли добавить p-значения, а также скорректированные значения p для нескольких сравнений? – user1883491

0

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 

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

 Смежные вопросы

  • Нет связанных вопросов^_^