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


86

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

Je veux rendre possible une matrice de corrélation pour n'importe quelle combinaison de deux.

c'est à dire 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?


5
Jetez un œil à la corfonction, ou à la rcorrfonction dans le Hmiscpackage
Manuel Ramón

Je suis capable de trouver le cor entre deux paramètres. La chose est de savoir comment les organiser en matrice?
Swapnil 'Tux' Takle

6
Comment diable cela a-t-il obtenu autant de votes positifs?
Fund Monica's Lawsuit

Réponses:


104

Un exemple,

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

72

Vous pouvez utiliser le package «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

entrez la description de l'image ici

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


Est-il possible d'obtenir le graphe similaire à ceux-ci cran.r-project.org/web/packages/corrplot/vignettes/... , ou une simple matrice, mais avec le R-carré au lieu de la corrélation de Pearson, Kendall ou Spearman?
FraNut

R2 est égal au carré du coefficient de corrélation de Pearson. Il vous suffit donc de multiplier M par M (multiplier la matrice de corrélation par elle-même), avant de créer le graphique.
Jot eN

17

La fonction cor utilisera les colonnes de la matrice dans le calcul de la corrélation. Ainsi, le nombre de lignes doit être le même 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))

entrez la description de l'image ici

Éditer:

Voici un exemple d'étiquettes de ligne et de colonne 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()

entrez la description de l'image ici


L'exemple de @Manuel Ramón est probablement le meilleur pour votre cas (une seule matrice) - organisez vos ensembles de données sous forme de colonnes.
Marc dans la boîte

dans l'image ci-dessus, comment peut-on «inverser» les couleurs, la corrélation du rouge est-elle proche de -1 ou 1 et du blanc proche de 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 dans la boîte

@Marcinthebox comment ajouteriez-vous des étiquettes de variables aux axes x et y (au lieu de nombres)? Merci
Agustín Indaco

@ AgustínIndaco - J'ai mis à jour ma réponse avec un autre exemple. La imagefonction ne prend pas automatiquement les noms de ligne et de colonne, cela doit donc être ajouté.
Marc dans la boîte le

15

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

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

entrez la description de l'image ici

C'est plus impressionnant lorsque vous corrélez plus de variables, comme dans la vignette du package: entrez la description de l'image ici


1

Il existe d'autres moyens d'y parvenir ici: ( Tracez la matrice de corrélation 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 ces 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 clairement 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 colonnes sont ce que vous voulez, alors les opérations suivantes:

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

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

edit2: pour supprimer la fonction image () en imprimant les nombres sur la grille (sinon ils chevauchent vos étiquettes de variables), 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')
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.