2011-07-15 8 views

risposta

4

avrei probabilmente personalmente basta usare diag:

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

Ma si potrebbe anche usare mapply:

> mapply(cor,a,b) 
     a   b   c 
1.0000000 -1.0000000 -0.6964286 
9

La prima risposta sopra calcola tutte le correlazioni a coppie, che va bene a meno che le matrici sono grandi, e la seconda non funziona. Per quanto posso dire, efficiente calcolo deve essere fatto direttamente, come ad esempio questo codice preso in prestito dal prestito dal pacchetto arrayMagic Bioconductor, funziona in modo efficiente per grandi matrici:

> 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

È possibile aggiungere valori p e anche valori p regolati per confronti multipli? – user1883491

0

mapply opere con i frame di dati, ma non matrici. Questo perché nei frame di dati ogni colonna è un elemento, mentre nelle matrici ogni voce è un elemento.

Nella risposta sopra mapply(cor,as.data.frame(a),as.data.frame(b)) funziona bene.

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 

Questo è molto più efficiente per le matrici di grandi dimensioni.

Problemi correlati