From 4063d350dece6bbd514b047f7df08da3cd22708f Mon Sep 17 00:00:00 2001 From: thaaoblues Date: Fri, 3 Jan 2025 15:37:48 +0100 Subject: [PATCH] =?UTF-8?q?derni=C3=A8res=20ACP=20et=20clusterings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projet.Rmd | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 208 insertions(+), 1 deletion(-) diff --git a/Projet.Rmd b/Projet.Rmd index 9d504da..2545b8e 100644 --- a/Projet.Rmd +++ b/Projet.Rmd @@ -17,6 +17,10 @@ library(FactoMineR) library(factoextra) library(cluster) library(mclust) +library(dplyr) +library(tidyr) +library(dbscan) +library(klaR) ``` ```{r} @@ -460,7 +464,7 @@ La classification obtenue est en accord avec les observations faites lors de l'A # ANALYSE DES GENES -## DataExpMoy +## Generation de dataExpMoy ```{r} # Liste des traitements, heures et réplicats traitements <- c("T1", "T2", "T3") @@ -490,7 +494,210 @@ for (t in traitements) { # Convertir en data.frame pour manipulation DataExpMoy <- as.data.frame(DataExpMoy) +DataExpMoy$ExpT1 = T$ExpT1 +DataExpMoy$ExpT2 = T$ExpT2 +DataExpMoy$ExpT3 = T$ExpT3 head(DataExpMoy) ``` +## ACP de DataExpMoy +```{r, fig.width=13} + +# Effectuer l'ACP +res_pca2 <- PCA(DataExpMoy, scale.unit = TRUE,quali.sup = c(19:21), graph = FALSE) +# Création des graphiques +plot1 <- fviz_eig(res_pca2, title = "Participation de chaque valeur propre à l'inertie totale des données") +plot2 <- fviz_pca_ind(res_pca2, label = "point", title = "Projection des individus sur un plan factoriel") +plot3 <- fviz_pca_var(res_pca2, axes = c(1, 2), label = "all", title = "Corrélations des variables avec les composantes principales") +plot1 + +# Affichage côte à côte des graphiques +grid.arrange(plot2,plot3, ncol = 2) + +``` +### Ajout des variables qualitatives +```{r} +fviz_pca_ind(res_pca2,habillage=19,geom=c("point")) +fviz_pca_ind(res_pca2,habillage=20,geom=c("point")) +fviz_pca_ind(res_pca2,habillage=21,geom=c("point")) +``` + + +## Clustering De L'ACP + + +```{r,fig.cap="Visualisation de l'inertie intra-classe en fonction du nombre de classes demandées pour le clustering"} +#centrage et réduction des données +s_2 = scale(DataExpMoy[-c(19:21)]) + +Kmax<-15 +reskmeanscl_2<-matrix(0,nrow=nrow(s_2),ncol=Kmax-1) +Iintra<-NULL +for (k in 2:Kmax){ + resaux<-kmeans(s_2,k) + reskmeanscl_2[,k-1]<-resaux$cluster + Iintra<-c(Iintra,resaux$tot.withinss) +} + +df<-data.frame(K=2:15,Iintra=Iintra) +ggplot(df,aes(x=K,y=Iintra))+ + geom_line()+ + geom_point()+ + xlab("Nombre de classes")+ + ylab("Inertie intraclasse") + +``` +```{r,fig.cap="Visualisation du critère de Silhouette en fonction du nombre de classes demandées pour le clustering"} +Silhou<-NULL +for (k in 2:Kmax){ + aux<-silhouette(reskmeanscl_2[,k-1], daisy(s)) + Silhou<-c(Silhou,mean(aux[,3])) +} + +df<-data.frame(K=2:Kmax,Silhouette=Silhou) +ggplot(df,aes(x=K,y=Silhouette))+ + geom_point()+ + geom_line()+theme(legend.position = "bottom") + +aux<-silhouette(reskmeanscl_2[,3-1], daisy(s)) +fviz_silhouette(aux)+ + theme(plot.title = element_text(size =9)) +rm(df,Silhou,aux) + +``` + + + + +```{r,fig.cap="Visualisation des clusters générés par la méthode kmeans dnas le plan factoriel 1,2"} +#graphes des clusters +res_kmeans_2 = kmeans(s_2,3) +fviz_cluster(res_kmeans_2,data=s_2, + ellipse.type="norm",labelsize=8, + geom=c("point"))+ggtitle("Visualisation des clusters générés par la méthode kmeans dnas le plan factoriel 1,2") +``` + + +```{r, fig.cap="Visualisation des clusters générés par la méthode PAM dnas le plan factoriel 1,2"} +res = pam(s_2,3,metric="euclidean") +fviz_cluster(res,data=s_2, + ellipse.type="norm",labelsize=8, + geom=c("point"))+ggtitle("Visualisation des clusters générés par la méthode PAM dnas le plan factoriel 1,2") +``` + +```{r, fig.width=9, fig.cap="Dendogramme du clustering de l'ACP, obtenu par méthode CAH"} + +dx=dist(s_2,method="euclidian") +hward=hclust(dx,method = "ward.D2") + + +fviz_dend(hward,k=3, + show_labels = FALSE, + rect=TRUE, + rect_fill = TRUE, + palette = "npg", + rect_border = "npg", + labels_track_height = 0.8)+ggtitle("Dendogramme du clustering de l'ACP, obtenu par méthode CAH") +``` + +### nul de fou zinzin DBSCAN +```{r} + +kNNdistplot(s_2,k=round(log(nrow(s_2)))) +# on observe un coude à eps=3 + +# On prend les paramètres eps=3 et minPts=log(500) (environ 6) pour essayer de coller avec les demandes faites aux autres méthodes de clustering +set.seed(123) # Pour rendre les résultats reproductibles +dbscan_res = dbscan::dbscan(s_2, eps = 2, minPts = round(log(nrow(s_2)))) + +# Ajouter les clusters résultants à DataExpMoy +DataExpMoy$DBSCAN_Cluster <- as.factor(dbscan_res$cluster) # Les clusters DBSCAN + +# Visualiser les clusters +fviz_cluster(dbscan_res, data = data_for_clustering, + geom = "point", ellipse = FALSE, # Pas d'ellipse pour DBSCAN + show.clust.cent = FALSE, # Pas de centres pour DBSCAN + palette = "jco") + + ggtitle("Visualisation des clusters générés par DBSCAN") +``` + + +## Evolution de l'expression des genes en fonction de leur traitement et cluster : +```{r,fig.width=13} +# Ajouter une colonne unique d'identification pour chaque gène +DataExpMoy$GeneID = rownames(DataExpMoy) # Ajouter les identifiants des gènes +DataExpMoy$Cluster = as.factor(res_kmeans_2$cluster) # Ajouter les clusters comme une colonne + +# Restructurer les données en format long +data_long = DataExpMoy %>% + pivot_longer( + cols = -c(ExpT1, ExpT2, ExpT3, Cluster, GeneID), # Colonnes des expressions moyennes + names_to = "Condition", + values_to = "Expression" + ) %>% + separate(Condition, into = c("Traitement", "Temps"), sep = "_") %>% # Séparer Traitement et Temps + mutate( + Temps = as.numeric(gsub("H", "", Temps)) # Supprimer "H" et convertir en numérique + ) + +#head(data_long) + +# Tracer les courbes +ggplot(data_long, aes(x = Temps, y = Expression, group = GeneID, color = Cluster)) + + geom_line(alpha = 0.6) + # Ajout des courbes avec transparence + facet_wrap(~ Traitement, scales = "free_y") + # Un graphique par traitement + labs(title = "Évolution de l'expression génique par traitement et cluster", + x = "Temps (heures)", + y = "Expression génique") + + theme_minimal() + + scale_color_manual(values = c("red", "blue", "green")) # Définir des couleurs fixes pour les clusters +``` + + + + +## Clustering des gènes à partir des variables ExpT1, ExpT2 et ExpT3. + +Comme ce sont des données qualitatives, on doit utiliser des méthodes alternatives de clustering comme les kmodes ou les kmeans mais sur les coordonnées de points projetés dans le plan d'une ACM +### K-modes +```{r,fig.cap=""} +MatriceExp = matrix(nrow = nrow(T),ncol=3) +rownames(MatriceExp) = rownames(T) +colnames(MatriceExp) = c("ExpT1","ExpT2","ExpT3") +MatriceExp = as.data.frame(MatriceExp) +MatriceExp$ExpT1 = T$ExpT1 +MatriceExp$ExpT2 = T$ExpT2 +MatriceExp$ExpT3 = T$ExpT3 + +clkmodes=kmodes(MatriceExp,3,iter.max=100,weight=FALSE) +clusplot(MatriceExp, clkmodes$cluster, color=TRUE, shade=TRUE, labels=0, lines=0) +``` +### K-means sur ACM +```{r,fig.cap=""} +head(MatriceExp) +afcm=MCA(MatriceExp,graph = FALSE) +coeff=afcm$ind$coord +clkmeans=kmeans(coeff,3) +# Visualisation des clusters +fviz_cluster(clkmeans, + data = coeff, + geom = "point", + ellipse.type = "norm", + main = "Clustering des gènes basé sur l'ACM et k-means") +``` + + + + + +J'ai absolument rien compris à ce qu'il se passe là, il y a beaucoup moins de nuance dans les données donc les points sont empilés. On dénote peut-être des clusters vaguement ressemblant à ceux sur L'ACP des moyennes ? ExpT étant calculée sur les relevés à 6h, on s'éloigne tout de même des clustering précédents. + + + +# TODO : +- présenter chaque méthode/algo et pourquoi on l'utilise avant le code +- analyser la seconde et troisième acp et les clustering qu'on en fait +- refaire l'analyse de la première acp +- choisir des graphes +- voir si la troisième acp est bien ce qu'il faut psq wtf ?? \ No newline at end of file