Analyse en composantes principales et autres réductions dimensionnelles en lang
Analyse en composantes principales et autres réductions dimensionnelles en langage R L'essentiel de cette page ! L'analyse en composante principale (ACP ou PCA en anglais) permet de réduire le nombre de dimensions d'un jeu de données multidimensionnel. Cette page explique comment réaliser une ACP avec R mais aussi comment visualiser les résultats. Elle dirige vers d'autres pages pour la mise en forme. Si en revanche, l'ACP ne donne pas des résultats satisfaisants, il existe d'autres solutions ! Les plus basiques sont expliquées dans cette page. Si vous voulez être formé (en Aquitaine) aux autres solutions, plus performantes, n'hésitez-pas à demander un devis ! L'analyse en composantes principales permet, d'après Wikipedia (septembre 2017) de transformer des variables liées entre elles (dites « corrélées » en statistique) en nouvelles variables décorrélées les unes des autres. Ces nouvelles variables sont nommées « composantes principales », ou axes principaux. Elle permet à l'analyste de réduire le nombre de variables et de rendre l'information moins redondante. Cette page s'intéresse ici non pas à l'ACP en elle-même (présentation succincte rubrique 1) mais à la représentation graphiques des composantes dans le cadre d'une étude ou d'une publication. 1. Réaliser une analyse en composantes principales L'analyse des données dans le cadre des statistiques multivariées se fait par plusieurs méthodes dont l'ACP (Analyse en Composantes Principales). Voici comment réaliser une telle étude. Réaliser une ACP (exemple d'ACP pas à pas avec R par défaut ou les librairies ade4 et FactoMineR) Étape 1 - Ouvrir des données Ouverture des données - données cancers.txt data = read.table("cancers.txt",sep="\t",header=T) colnames(data) rownames(data) = data[,1] # On donne à chaque ligne le nom de son cancer (Cancer 1, Cancer 2) x = data[1:7,-1] ;x # On exclue la colonne 1 qui contenait les noms des cancers. Données téléchargeables ici Dans cet exemple, on ouvre des données simulées présentant des résultats moyens de concentration de 10 marqueurs sanguins (M1 à M10) pour 7 catégories de cancers (Cancer 1 à 7). Chaque catégorie de cancer présente ainsi un taux moyen de marqueurs variable d'une catégorie à l'autre. On cherche à voir s'il existe des cancers qui présenterait une signature sanguine caractéristique. Pour cela on réalise une ACP. Étape 2 - Réaliser l'ACP Plusieurs librairies permettent de réaliser des ACP avec R. 1) La commande par défaut prcomp() (installé sur R par défaut), renvoie une acp dont la description est délicate à obtenir 2) ade4 (dudi.pca()) permet d'obtenir facilement une acp et sa description. On peut facilement voir un diagramme de Pareto pour sélectionner les composantes qui ont du poids 3) factomineR (PCA()) est un package très performant qui permet d'aller bien au-delà de l'ACP. Méthode par défaut de R (prcomp()) acp1 <- prcomp(x, scale = F) acp1 Avec la librairie ade4 install.packages("ade4") library(ade4) acp2 <- dudi.pca(x , scannf= F,scale=FALSE,,nf=3) acp2 Avec la librairie FactoMineR install.packages("FactoMineR") library(FactoMineR) acp3 = PCA(x, scale.unit=F, ncp=5, graph=T) acp3 Paramétrage de la commande prcomp() (R par défaut) center = T ==> permet de centrer les données (soustraction de la moyenne) scale = T ==> permet de normer les données ==> center et scale = T donnent des données centrées-réduites. Paramétrage de la commande dudi.pca() (librairie ade4) center = T ==> permet de centrer les données (soustraction de la moyenne) scale = T ==> permet de normer les données ==> center et scale = T donnent des données centrées-réduites. scalenf = F ==> permet d'afficher un graphique indiquant le poids de chaque composante sur la variabilité totale (diagramme de Pareto) ==> On peut alors sélectionner le nombre de composantes que l'on désire conserver. nf = 3 == indique le nombre de composantes à conserver Paramétrage de la commande PCA() (librairie FactoMineR) scale.unit = T ==> permet de normer les données ==> center et scale = T donnent des données centrées-réduites. graph = T ==> permet d'afficher automatiquement les graphs de visulisation des données ncp = 3 == indique le nombre de composantes à conserver Étape 3 - Contrôler la pertinence de l'ACP par un diagramme de Pareto Le principe de Pareto suppose que la variabilité globale se concentre sur les premières composantes. Afin de pouvoir travailler sur seulement quelques composantes, il faut s'assurer que ce principe de Pareto est respecté. Il est possible de contrôler la pertinence de l'ACP, non déformation du nuage en s'assurant que les composantes retenues couvrent bien 95%, 97.5% ou plus selon son choix de la variabilité du nuage. La démarche est le suivante : 1) Il faut identifier où se positionnent les résultats des poids de chaque composante dans la sortie d'ACP. 2) Il faut récupérer une fonction de réalisation d'un diagramme de Pareto 3) Il faut tracer le graphique Dans cet exemple, comme les 2 premières composantes couvrent 95% de la variabilité, on peut réduire ainsi le nombre de dimensions des données à seulement 2 au lieu de 10. Pareto de contrôle de l'ACP Les 2 premières composantes couvrent ici plus de 95% de la variabilité. Méthode par défaut de R # Récupérer et copier-coller avant dans la console la fonction pareto() pareto(acp1$sdev) # Attention : il ne s'agit pas des variances mais des déviations standards : prcomp() ne permet pas une analyse pertinente Avec la librairie ade4 # Récupérer et copier-coller avant dans la console la fonction pareto() pareto(acp2$eig, h=95) # h = 95 : afficher un seuil de cumul de la variance à 95% Avec la librairie FactoMineR # Récupérer et copier-coller avant dans la console la fonction pareto() pareto(acp3$eig[,2], h=95) # h = 95 : afficher un seuil de cumul de la variance à 95% Étape 4 - Afficher les données en 2 dimensions - Ex : Axe1 = Composante 1 & Axe2 = Composante2 Une fois que l'on sait sur quelles composantes s'attarder, la première envie est de voir comment vont se répartir les points sur un nombre réduit de dimensions. Chaque librairie possède ses propres outils de visualisations. Tous sont très limités dans la mise en forme. Le mieux est donc d'utiliser les commandes de base R comme plot(). Vous trouverez sur ce site une page dédiée aux représentations graphiques avec ade4 (commande s.label()) ou FactoMineR. On peut aussi se référer aux aides de ces différents packages. Courbe sur les composantes 1 et 2 (on peut aussi bien représenter d'autres composantes en remplaçant les 1 et 2 par 3 et 4 dans axeX et axeY # Avec des données ACP issues de prcomp() de R par défaut axeX <- acp1$x[,1] ; axeY <- acp1$x[,2] # Avec des données ACP issues de dudi.pca() de ade4 axeX <- acp2$li[,1] ; axeY <- acp2$li[,2] # Avec des données ACP issues de PCA() de FactoMineR axeX <- acp3$ind$coord[,1] ; axeY <- acp3$ind$coord[,2] Tracer le graphique plot(axeX,axeY,pch=16);grid() text(axeX,axeY,rownames(x)) Étape 5 - (Optionnelle) - Visualiser la corrélation et l'influence des différentes variables avec les composantes (diagramme circulaire, radial, en radiant) Un tel diagramme permet de calculer comment chaque variable intervient dans une composante. Il est utile pour comprendre le lien entre variables et va donner des résultats équivalents à un clustering sur variables. Dans cet exemple qui met en relation composante 1 (horizontale) et composante 2 (verticale), on voit que les composantes M4 et M5, longues, jouent fortement. M7 se superpose à la composante 1 sans en être la seule part. A) Récupérer les données nécessaire à tracer le diagramme Méthode par défaut de R # Récupérer la description donnant la corrélation de chaque variable par composante # 1 et 2 pour composantes 1 et 2 poids_var_x <- acp1$rotation[,1] poids_var_y <- acp1$rotation[,2] vecnames <- rownames(acp1$rotation) Avec la librairie ade4 # Récupérer la description donnant la corrélation de chaque variable par composante poids_var_x <- acp2$c1[,1] poids_var_y <- acp2$c1[,2] vecnames <- rownames(acp2$c1) Avec la librairie FactoMineR # Récupérer la description donnant la corrélation de chaque variable par composante # Pas de contenu prêt à l'emploi mais des fonctions font directement le diagramme B) Optionnel : filtrer les variables pour n'afficher que celles qui ont un poids suffisant #OPTIONNEL poids_var_global <- sqrt(poids_var_x^2+poids_var_y^2) barplot(poids_var_global,names.arg=vecnames) # FILTRER : Ex : les variables dont le poids est > 0.25 seuil = 0.25 ; abline(h=seuil,col="red",lwd=2) poids_var_x <- poids_var_x[poids_var_global>seuil] poids_var_y <-poids_var_y[poids_var_global>seuil] vecnames <- vecnames[poids_var_global>seuil] On voit ici que le seuil de 0.25 va éliminer les variables M2, M6 et M9 de l'affichage. C) Tracer le diagramme # Tracer un fond blanc orthonormé plot(c(-1,1),c(-1,1),type="n",xlab="",ylab="",asp=1,axes=F) ; grid() # Tracer le cercle install.packages('plotrix') ; library("plotrix") ;draw.circle(0,0,1,lwd=3) # Tracer les flèches arrows(0,0,poids_var_x,poids_var_y,length=0.1,angle=17,lwd=2) # Calculer la position du nom de chaque vecteur // aux pointes des flèches poids_x_bin <- poids_var_x ; poids_x_bin[poids_x_bin<0]<- -1 ; poids_x_bin[poids_x_bin>0]<- 1 poids_y_bin <- poids_var_y ; poids_y_bin[poids_y_bin<0]<- -1 ; poids_y_bin[poids_y_bin>0]<- 1 poids_x <- poids_var_x^2 ; poids_y <- poids_var_y^2; poids_z <- poids_x + poids_y poids_x <- poids_x / poids_z * poids_x_bin * 0.08 ; poids_y <- poids_y / poids_z * poids_y_bin * 0.08 # Tracer les noms des vecteurs text(poids_var_x+poids_x,poids_var_y+poids_y,vecnames,cex=0.75,col="red") Étape 6 - Combiner les étapes 4 et 5 pour visualiser la distributions des résultats selon 2 composantes et superposer la projection de chaque variable. (biplot) Il suffit tout simplement de réaliser le graphique de l'étape 4 puis de uploads/Management/aide-a-l-x27-utilisation-de-r-analyse-en-composantes-principales-et-autres-reductions-dimensionnelles.pdf
Documents similaires
-
21
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Mar 30, 2022
- Catégorie Management
- Langue French
- Taille du fichier 0.9476MB