web-dev-qa-db-fra.com

Comment créer une matrice de corrélation dans R?

J'ai 92 ensembles de données du même type.

Je veux créer une matrice de corrélation pour deux combinaisons possibles.

c'est-à-dire que je veux une matrice de 92 x92.

tel que l'élément (ci, cj) devrait être une corrélation entre ci et cj.

Comment je fais ça?

82

Un exemple,

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

Vous pouvez utiliser le paquet "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

enter image description here

Plus d'informations ici: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html

70
Jot eN

La fonction cor utilisera les colonnes de la matrice pour le calcul de la corrélation. Donc, le nombre de lignes doit être identique entre votre matrice x et votre 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))

enter image description here

Modifier:

Voici un exemple d'étiquettes de lignes et de colonnes personnalisées sur une matrice de corrélation calculée avec une seule 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()

enter image description here

16
Marc in the box

Jetez un oeil à qtlcharts . Il vous permet de créer des matrices de corrélation interactives :

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

enter image description here

C'est plus impressionnant quand vous corrélez plus de variables, comme dans la vignette du paquet: enter image description here

14
epo3

Il existe d'autres moyens d'y parvenir ici (( matrice de corrélation de tracé dans un graphique ), mais j'aime bien votre version avec les corrélations dans les cases. Existe-t-il un moyen d’ajouter les noms de variables à la colonne x et y au lieu de simplement les numéros d’index? Pour moi, cela en ferait une solution parfaite. Merci!

edit: J'essayais de commenter le message de [Marc dans la boîte], mais je ne sais pas ce que je fais. Cependant, j'ai réussi à répondre à cette question pour moi-même.

si d est la matrice (ou le bloc de données d'origine) et que les noms de colonne correspondent à vos souhaits, les opérations suivantes fonctionnent:

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

las = 0 retournerait les noms à leur position normale, les miens étaient longs, alors j'ai utilisé las = 2 pour les rendre perpendiculaires à l'axe.

edit2: pour supprimer les numéros d’impression de la fonction image () sur la grille (sinon ils chevauchent vos étiquettes de variable), ajoutez xaxt = 'n', par exemple:

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')
1
TSeymour