Come posso creare una matrice di correlazione in R?


86

Ho 92 set di dati dello stesso tipo.

Voglio creare una matrice di correlazione per due combinazioni possibili.

cioè voglio una matrice di 92 x92.

tale che l'elemento (ci, cj) dovrebbe essere correlazione tra ci e cj.

Come lo faccio?


5
Dai un'occhiata alla corfunzione, o alla rcorrfunzione nel Hmiscpacchetto
Manuel Ramón

Sono in grado di trovare il cor tra due parametri. Il fatto è come disporli in matrice?
Swapnil 'Tux' Takle

6
Come diavolo ha fatto a ottenere così tanti voti positivi?
Finanzia la causa di Monica

Risposte:


104

Un esempio,

 d <- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
cor(d) # get correlations (returns matrix)

72

Potresti usare il pacchetto 'corrplot'.

d <- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
M <- cor(d) # get correlations

library('corrplot') #package corrplot
corrplot(M, method = "circle") #plot matrix

inserisci qui la descrizione dell'immagine

Maggiori informazioni qui: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html


È possibile ottenere il grafico simile a questi cran.r-project.org/web/packages/corrplot/vignettes/… , o una semplice matrice, ma con la correlazione R al quadrato invece di Pearson, Kendall o Spearman?
FraNut

R2 è uguale al quadrato del coefficiente di correlazione di Pearson. Quindi tutto ciò di cui hai bisogno è moltiplicare M per M (moltiplica la matrice di correlazione per se stessa), prima di creare il grafico.
Jot eN

17

La funzione cor utilizzerà le colonne della matrice nel calcolo della correlazione. Quindi, il numero di righe deve essere lo stesso tra la matrice x e la matrice y . Ex.:

set.seed(1)
x <- matrix(rnorm(20), nrow=5, ncol=4)
y <- matrix(rnorm(15), nrow=5, ncol=3)
COR <- cor(x,y)
COR
image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, xlab="x column", ylab="y column")
text(expand.grid(x=seq(dim(x)[2]), y=seq(dim(y)[2])), labels=round(c(COR),2))

inserisci qui la descrizione dell'immagine

Modificare:

Di seguito è riportato un esempio di etichette di riga e colonna personalizzate su una matrice di correlazione calcolata con una singola matrice:

png("corplot.png", width=5, height=5, units="in", res=200)
op <- par(mar=c(6,6,1,1), ps=10)
COR <- cor(iris[,1:4])
image(x=seq(nrow(COR)), y=seq(ncol(COR)), z=cor(iris[,1:4]), axes=F, xlab="", ylab="")
text(expand.grid(x=seq(dim(COR)[1]), y=seq(dim(COR)[2])), labels=round(c(COR),2))
box()
axis(1, at=seq(nrow(COR)), labels = rownames(COR), las=2)
axis(2, at=seq(ncol(COR)), labels = colnames(COR), las=1)
par(op)
dev.off()

inserisci qui la descrizione dell'immagine


L'esempio di @Manuel Ramón è probabilmente il migliore per il tuo caso (una singola matrice): organizza i tuoi set di dati come colonne.
Marc nel box

nell'immagine sopra, come si possono 'invertire' i colori, se il rosso è vicino a -1 o 1 e il bianco quando è vicino a 0?
tagoma

image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column")
Marc nel box il

@ Marcinthebox come aggiungeresti le etichette delle variabili agli assi xey (invece dei numeri)? Grazie
Agustín Indaco

@ AgustínIndaco - Ho aggiornato la mia risposta con un ulteriore esempio. La imagefunzione non accetta automaticamente i nomi di riga e colonna, quindi questo deve essere aggiunto.
Marc nel box

15

Dai un'occhiata a qtlcharts . Ti permette di creare matrici di correlazione interattive :

library(qtlcharts)
data(iris)
iris$Species <- NULL
iplotCorr(iris, reorder=TRUE)

inserisci qui la descrizione dell'immagine

È più impressionante quando si correlano più variabili, come nella vignetta del pacchetto: inserisci qui la descrizione dell'immagine


1

Ci sono altri modi per ottenere questo risultato qui: ( Tracciare la matrice di correlazione in un grafico ), ma mi piace la tua versione con le correlazioni nelle caselle. C'è un modo per aggiungere i nomi delle variabili alla colonna xey invece che solo quei numeri di indice? Per me, ciò renderebbe questa una soluzione perfetta. Grazie!

modifica: stavo cercando di commentare il post di [Marc in the box], ma chiaramente non so cosa sto facendo. Tuttavia, sono riuscito a rispondere a questa domanda da solo.

se d è la matrice (o il data frame originale) ei nomi delle colonne sono ciò che desideri, allora funziona quanto segue:

axis(1, 1:dim(d)[2], colnames(d), las=2)
axis(2, 1:dim(d)[2], colnames(d), las=2)

las = 0 riportava i nomi alla loro posizione normale, i miei erano lunghi, quindi ho usato las = 2 per renderli perpendicolari all'asse.

edit2: per sopprimere la funzione image () che stampa i numeri sulla griglia (altrimenti si sovrappongono alle etichette delle variabili), aggiungi xaxt = 'n', ad esempio:

image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column", xaxt='n')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.