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
È possibile aggiungere valori p e anche valori p regolati per confronti multipli? – user1883491