dernières ACP et clusterings

This commit is contained in:
thaaoblues 2025-01-03 15:37:48 +01:00
parent fe148415f7
commit 4063d350de

View file

@ -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 ??