mardi 8 février 2011

Représenter visuellement une matrice de corrélation

Quand on a plusieurs variables numériques, on peut faire une matrice de corrélation pour voir le coefficient de corrélation entre toutes les variables prises 2 à 2. Mais une telle matrice n'est pas toujours très agréable à lire. Voici une méthode pour représenter visuellement une matrice de corrélation. Cela donnera au final le graphique suivant :



Pour chaque corrélation, on a le nuage de points et le coefficient de corrélation (avec le degré de significativité).

Voici tout d'abord le code pour créer les variables et pour avoir une matrice de corrélation classique :

v1<-c(1,2,4,5,7) # création d'un vecteur v1
v2<-c(7,8,5,9,8) # création d'un vecteur v2
v3<-c(7,5,3,2,1) # création d'un vecteur v3
tab<-matrix(data=c(v1,v2,v3), nrow=5, ncol=3, byrow=F) # création d'une matrice contenant les 3 vecteurs
colnames(tab)=c("variable 1","variable 2","variable 3") # on donne un nom à chaque colonne
cor(tab) # matrice de corrélation classique

Voici maintenant le code pour obtenir le graphique ci-dessus.

# Il faut d'abord créer la fonction suivante (nommée panel.cor)
panel.cor <- function(x, y, digits=2, prefix="", cex.cor)
{
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
    r <- (cor(x, y))
    txt <- format(c(r, 0.123456789), digits=digits)[1]
    txt <- paste(prefix, txt, sep="")
    if(missing(cex.cor)) cex <- 0.8/strwidth(txt)

    test <- cor.test(x,y)
    # borrowed from printCoefmat
    Signif <- symnum(test$p.value, corr = FALSE, na = FALSE,
                  cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1),
                  symbols = c("***", "**", "*", ".", " "))

    text(0.5, 0.5, txt, cex = cex * abs(r))
    text(.8, .8, Signif, cex=cex, col=2)
}

# Puis on utilise la fonction pairs()
pairs(tab[,c(1,2,3)], lower.panel=panel.smooth, upper.panel=panel.cor)

remarque: la fonction panel.cor et l'idée du graphique proviennent du lien suivant (j'ai légèrement modifié le code pour afficher le signe du coefficient de corrélation) :
http://addictedtor.free.fr/graphiques/RGraphGallery.php?graph=137

Aucun commentaire:

Enregistrer un commentaire