projet-analyse-donnees/Projet.Rmd

691 lines
No EOL
32 KiB
Text
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "Projet"
output:
pdf_document: default
html_document: default
date: "2024-12-04"
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(ggplot2)
library(gridExtra)
library(grid)
library(reshape2)
library(corrplot)
library(FactoMineR)
library(factoextra)
library(cluster)
library(mclust)
library(dplyr)
library(tidyr)
library(dbscan)
library(klaR)
library(clusterSim)
library(circlize)
```
```{r,echo=FALSE,results = FALSE,message=FALSE,warning=FALSE,fig.show='hide'}
set.seed(1234)
T = read.table("DataProjet3MIC-2425.txt",header=TRUE,sep=";")
T$ExpT1 = as.factor(T$ExpT1)
T$ExpT2 = as.factor(T$ExpT2)
T$ExpT3 = as.factor(T$ExpT3)
#centrer T
head(T)
summary(T)
str(T)
levels(T$ExpT1)
```
# Contenu du jeu de données :
- 3 variables qualitatives nominales représentant l'expression du gêne $$g$$ dont les modalités sont $$\{"sur","sous","non"\}$$. chaque variable correspond respectivement à la différence d'expression du gêne mesurée à la 6ème heure lors du traitement $$T \in \{T1,T2,T3\}$$ en moyenne, sur les réplicats $$\{R1,R2\}$$
- $$3*6 + 3*6 = 36$$ variables quantitatives continues représentant les effets des traitements sur l'expression des gênes T1 T2 et T3 à 1h,2h,3h,4h,5h,6h après l'administration pour les replicats R1 et R2, par rapport à leur expression à T=0 ( sans traitement).
- Ce jeu de données contient des relevés sur 542 individus, ici des gênes.
# Analyse unidimentionnelle :
## Expression des gênes lors des traitements T1,T2 et T3
Nous avons réalisé 3 histogrammes pour visualiser les effectifs des gènes en fonction de leur expression relative moyenne à 6h suite aux traitements T1,T2 et T3, cette moyenne est représenté par les variables qualitatives nominales ExpT1,ExpT2 et ExpT3
```{r,warning=FALSE}
#fig.cap="Visualualisation des expressions relative des gènes lors du traitement T1,T2 et T3"
g1<-ggplot(T, aes(x=T$ExpT1))+
geom_bar()+
ylab("Effectifs")+ggtitle("Effectifs")
g2<-ggplot(T, aes(x=T$ExpT2))+
geom_bar()+
ylab("Effectifs")+ggtitle("Effectifs")
g3<-ggplot(T, aes(x=T$ExpT3))+
geom_bar()+
ylab("Effectifs")+ggtitle("Effectifs")
grid.arrange(g1,g2,g3,ncol=3,top=textGrob("Visualualisation des expressions relative des gènes lors du traitement T1,T2 et T3"))
```
### Analyse des résultats
On remarque que les traitements T2 et T3 semblent avoir un effet assez similaire sur l'expression des gênes relevée à la 6ème heure : Une polarisation entre la sous expression et la sur expression qui se partagent presque la totalité des relevés, avec un poids légèrement superieur à 55% pour la sur-expression au détriment de la sous-expression. Cela a peut être un rapport avec le fait que T3 est une combinaison des traitement T1 et T2.
T1 quant à lui se démarque grandement par une large majorité (Un peu plus de 80%), de gêne n'ayant pas changé d'expression après 6h de traitement.
## Expression relative des gênes mesurées à intervalle régulier
```{r, fig.height=5,fig.cap="Histogrammes de l'expression relative des gènes aux différents relevés lors du traitement T1",echo=FALSE,results = FALSE,message=FALSE,warning=FALSE,fig.show='hide'}
#apply(T[-c(37:39)],2,function(col){
# which(T == col)
#hist(col, main = paste("Histogram of", colnames(T)[which(T == col)[2]]),
# xlab = "Values", col = "lightblue", border = "black")
#})
T_long = melt(T[c(1,2,3,4,5,6,19,20,21,22,23,24)])
ggplot(T_long, aes(x = value)) +
geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
facet_wrap(~variable,scales = "free",ncol=6) +
labs(title = "Histogrammes de l'expression relative des gènes aux différents relevés lors du traitement T1", x = "Valeurs", y = "Effectifs")
```
```{r, fig.height=5,fig.cap="Histogrammes de l'expression relative des gènes aux différents relevés lors du traitement T2",echo=FALSE,results = FALSE,message=FALSE,warning=FALSE,fig.show='hide'}
T_long = melt(T[c(7,8,9,10,11,12,25,26,27,28,29,30)])
ggplot(T_long, aes(x = value)) +
geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
facet_wrap(~variable,scales = "free",ncol=6) +
labs(title = "Histogrammes de l'expression relative des gènes aux différents relevés lors du traitement T2", x = "Valeurs", y = "Effectifs")
```
```{r, fig.height=5,fig.cap="Histogrammes de l'expression relative des gènes aux différents relevés lors du traitement T3",echo=FALSE,results = FALSE,message=FALSE,warning=FALSE,fig.show='hide'}
T_long = melt(T[c(13,14,15,16,17,18,31,32,33,34,35,36)])
ggplot(T_long, aes(x = value)) +
geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
facet_wrap(~variable,scales = "free",ncol=6) +
labs(title = "Histogrammes de l'expression relative des gènes aux différents relevés lors du traitement T3", x = "Valeurs", y = "Effectifs")
```
Lors d'une analyse supplémentaire des fréquences d'expression des gènes à chaque heure et chaque traitement, nous observons bien une concordance avec l'analyse des expressions des gênes figure <celle de la question precedente>. En effet, les histogrammes en rapport avec le traitement 1 sont très nettement regroupés vers 0, soit une expression relative des gênes qui ne change peu. Les histogrammes pour les relevés des variables en lien avec T2 et T3 sont tout aussi similaires aux résultats précédents : La variance de l'expression relative des gênes est plus élevée et on observe bien une polarisation "sous-exprimé-"sur-exprimé" sur les relevés à 6h. Attention, ici on observe aussi que T2 et T3 n'ont pas leur effet caractéristique directement : à 2h, la distribution de l'expression des genes semble presque Gaussienne, et à 1h elle ne se distingue pas beaucoup du traitement 1 avec un regroupement sur 0.
c.f le document RMarkdown pour les histogrammes.
## boxplots pour faire joli
```{r}
ggplot(melt(T[1:18]),aes(x=variable,y=value))+
geom_boxplot()+ theme(axis.text.x = element_text(angle=90, vjust = 0.5, hjust = 1))
ggplot(melt(T[19:36]),aes(x=variable,y=value))+
geom_boxplot() + theme(axis.text.x = element_text(angle=90, vjust = 0.5, hjust = 1))
```
L'analyse des boxplots montre que, même sans effectuer de réduction des données, chaque variable présente une dispersion similaire, ce qui suggère qu'il n'est pas nécessaire de procéder à un centrage et à une réduction avant de réaliser l'Analyse en Composantes Principales.
# Analyse bi-dimensionnelle
## Boxplots par paire de variables (qualitative,quantitative)
Nous avons ensuite générés des graphes contenants des boxplots d'expression des gènes moyennes d'un traitement par rapport à l'expression des gènes à 6h sur un autre traitement.
Cela nous a permis d'identifier les changements d'expressions de chaque groupes de gènes sur, sous ou non-exprimés entre un traitement et les deux autres.
Les deux réplicats ayant des résultats très similaires, pour ne pas surcharger le rapport nous avons décidé d'afficher seulement le réplicat R1.
```{r,fig.cap="Boxplots par paire de variables (qualitative,quantitative)" ,warning=FALSE}
# traitement 1 corrélation avec l'expression des genes du T1 T2 et T3
p1 = ggplot(T,aes(y=T$T1_6H_R1,x=T$ExpT2))+
geom_boxplot()
#ggplot(T,aes(y=T$T1_6H_R2,x=T$ExpT2))+
# geom_boxplot()
p2 = ggplot(T,aes(y=T$T1_6H_R1,x=T$ExpT3))+
geom_boxplot()
#ggplot(T,aes(y=T$T1_6H_R2,x=T$ExpT3))+
# geom_boxplot()
# traitement 2 corrélation avec l'expression des genes du T1 T2 et T3
p3 = ggplot(T,aes(y=T$T2_6H_R1,x=T$ExpT1))+
geom_boxplot()
#ggplot(T,aes(y=T$T2_6H_R2,x=T$ExpT1))+
# geom_boxplot()
p4 = ggplot(T,aes(y=T$T2_6H_R1,x=T$ExpT3))+
geom_boxplot()
#ggplot(T,aes(y=T$T2_6H_R2,x=T$ExpT3))+
# geom_boxplot()
# traitement 3 corrélation avec l'expression des genes du T1 T2 et T3
p5 = ggplot(T,aes(y=T$T3_6H_R1,x=T$ExpT1))+
geom_boxplot()
#ggplot(T,aes(y=T$T3_6H_R2,x=T$ExpT1))+
# geom_boxplot()
p6 = ggplot(T,aes(y=T$T3_6H_R1,x=T$ExpT2))+
geom_boxplot()
#ggplot(T,aes(y=T$T3_6H_R2,x=T$ExpT2))+
# geom_boxplot()
# Utiliser grid.arrange pour afficher les graphiques dans une grille
grid.arrange(p1, p3, p6, p2, p4, p5, ncol = 3)
```
### Analyse des boxplots :
> Traitement 1
Les genes sur-exprimés au T1 sont non-exprimé durant le T2 et T3 (Boxplots T1/ExpT2 et T1/ExpT3) .
Il est difficile d'observer une catégorie de genes de T1 qui se soient sous exprimés ou sur exprimés dans T2 et T3, ceux qui n'avaient pas changés d'expression relative durant T1, se sont soit sous exprimé soit sur exprimé (Boxplots T1/ExpT2 et T1/ExpT3).
> traitements 2 et 3
On observe une légère tendance des genes s'étant sous-exprimé avec T1 à se sous exprimer avec T2 et T3 (Boxplots T2/ExpT1 et T3/expT1). En revanche, il est très clair que T2 et T3 ont les même effet sur les mêmes genes à 6h, toutes les expressions relevées par T2 concordent aux modalités qualitatives moyennes calculées sur T3 (Boxplots T2/ExpT3 et T3/ExpT2).
## matrice de covariance des variables quantitatives
Nous avons généré la matrice de covariance de nos données sans les variables quantitatives. Suite à cela nous avons remarqué qu'il était inutile d'afficher le réplicat R2 dans la matrice et que cela rendait le graphe moins lisible. Nous avons donc décidé de seulement afficher le graphe de la matrice de covariance avec le réplicat R1.
```{r, fig.height = 10,fig.cap="Visualisation de la matrice de covariance des variables quantitatives"}
cr = cor(T[c(1:18)])
corrplot(cr,method="ellipse", type="lower", bg = "lightgrey",title ="Visualisation de la matrice de covariance des variables quantitatives" )
```
### analyse de la matrice de covariance
On observe clairement de grandes zones de de corrélation entre T2 et T3 délimitées par une correlation plus moyenne à la première heure des deux traitements sûrement dues au fait que T3 est influencé par T1 aux premières heures.
On remarque que T3 est plus fortement corrélé à T1 à 1H que T2 (qui ne l'est que légèrement), semblant indiquer que T1 s'exprime avant T2; T3 étant la combinaison des deux traitements.
## Rapport de correlation Eta2
```{r}
library(BioStatR)
print("T1 vs T2")
cat("Replicat 1 : ", eta2(T$T1_6H_R1, T$ExpT2), "\n")
cat("Replicat 2 : ", eta2(T$T1_6H_R2, T$ExpT2), "\n")
print("T1 vs T3")
cat("Replicat 1 : ", eta2(T$T1_6H_R1, T$ExpT3), "\n")
cat("Replicat 2 : ", eta2(T$T1_6H_R2, T$ExpT3), "\n")
print("T2 vs T3")
cat("Replicat 1 : ", eta2(T$T2_6H_R1, T$ExpT3), "\n")
cat("Replicat 2 : ", eta2(T$T2_6H_R2, T$ExpT3), "\n")
```
Le calcul du rapport de correlation eta² bien notre observation de la grande similarité d'expression des genes traités avec T2 et T3 et la dissimilarité des expression des genes lorsque la plante est traitée avec T1 comparée à T2 et T3, chose normale au vu du peu de genes affectés par T1.
## table de contingence pour les variables quali 2 à 2, mosaic plot ?
```{r}
print("table de contingence entre T1 et T2")
table(T$ExpT1,T$ExpT2)
print("table de contingence entre T1 et T3")
table(T$ExpT1,T$ExpT3)
print("table de contingence entre T2 et T3")
table(T$ExpT2,T$ExpT3)
```
Nouvelle confirmation de nos résultats de manière encore plus précise, on observe que T1 ne change pas l'expression de la très grande majorité des genes. Plus finement, on peut confirmer l'observation faite sur les boxplots tendant à dire que le peu de genes s'étant sous exprimés avec T1 se sont aussi sous-exprimés avec T2 et T3.
La grande valeur des effectifs partiels sur la diagonale de la table de contingence entre T2 et T3 montre bien la similarité de l'effet de ces deux traitement sur l'expression des genes.
# Analyse en composantes principales où les Tt sH Rr sont les individus décrits par les gènes.
L'ACP permet d'obtenir une vision synthétique des données en réduisant leur complexité tout en préservant l'information essentielle. Elle facilite l'identification des tendances et profils d'individus, ainsi que la construction de méta-variables, plus simples à interpréter, tout en évitant les redondances entre les variables.
Pour faire cela, nous devons transposer la matrice de données originale qui elle décrivait les gènes (individus) en fonction des Tt sH Rr.
Nous décidons de faire directement une ACP car, comme mentionné plus tôt lors de l'analyse de la figure <insérer un numéro>, nous n'avons pas besoin de centrer et réduire le jeu de données.
```{r, fig.width=10, fig.height=5, fig.cap="Participation des chaque valeur propre de la matrice de correlation à l'intertie totale des données"}
donnees_transposees = t(T[-c(37:39)])
res_pca<-PCA(donnees_transposees,scale.unit=FALSE,graph=FALSE)
fviz_eig(res_pca,title="Participation des chaque valeur propre de la matrice de correlation à l'intertie totale des données")
```
Ce graphique représente la participation de chaque valeur propre de la matrice de corrélation du jeu de données dans l'inertie totale. L'inertie totale étant la somme des valeurs propres ( qui elles sont les inerties axiale associées à l'axe de vecteur directeur le vecteur propre associé ), chaque valeur propre est donc une fraction de l'inertie totale.
On voit qu'on dépasse 80% de l'inertie totale rien qu'avec les deux premieres valeurs propres, on en prend donc les vecteurs propres associés comme axes principaux de l'analyse.
```{r,fig.cap="Corrélations des variables avec les composantes principales"}
fviz_pca_ind(res_pca,label="all",title="Projection des individus sur un plan factoriel")
fviz_pca_var(res_pca,axes=c(1,2),label="none",title="Corrélations des variables avec les composantes principales")
```
Contexte : les relevés aux heures sont décrits par les gènes ( les gènes sont considérés comme les variables).
- les genes proches d'un axe sont très représentés par celui-ci
- les genes dont l'angle entre eux est petit sont corrélés entre eux
## Interprétation globale du couple de graphes
On voit que les genes se polarisent principalement sur l'axe 1 dans un sens ou l'autre.
Certaines flèches sont d'une longueur presque du rayon du cercle, indiquant une participation très forte des genes dans la variance expliquée par ces dimensions.
Il n'y a pas de tendance particulière sur la direction selon l'axe 2 des flèches : Dans chaque "polarité" de fleches selon l'axe 1, il y a des fleches dont la direction est negative d'autres positive selon l'axe 2. Bien que l'on dénote une quantité plus grande de gènes corrélés positiviement à la dimension 2.
Le traitement 1 est entièrement groupé sur des valeurs très negatives de l'axe 1. On remarque dans ce groupement la présence des T2 et T3 à la première heure de relevés d'expression des gènes.
Pour le traitement 2 et 3, on les retrouves formant 2 groupements, 1 en haut à droite du graphe contenant les relevés à 2 et 3h puis un groupement s'étalant sur la droite du graphe du centre jusqu'en bas contenant les relevés à partir de 4h.
## Clustering
L'objectif du clustering est de regrouper des individus (ici, les Tt_sH_Rr) en groupes homogènes selon leurs similarités, sans connaissance préalable des catégories. Cela permet didentifier des profils ou des comportements communs, facilitant linterprétation des données et la mise en évidence de structures sous-jacentes.
Nous avons commencé par effectuer un clustering avec la méthode K-means basée sur des estimations de nombre de clusters optimaux avec Silhouette et Calinski-Harabasz ainsi que l'inertie intra-classe, pour finir par effectuer un clustering avec la méthode CAH dont le nombre de classes est déterminé par l'indice de Calinski-Harabasz calculé sur des coupures du dendogramme.
Pour le dendogramme, nous avons utilisé la mesure d'agrégation de Ward car il y a trop de points pour utiliser la mesure euclidienne avec efficacité.
### Clustering k-means
On commence par afficher l'inertie intra classe en fonction du nombre de classe pour le clustering avec k-means, le but étant de la minimiser tout en gardant un nombre de classes raisonnable.
```{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 = donnees_transposees
set.seed(1234)
Kmax<-15
reskmeanscl=matrix(0,nrow=nrow(s),ncol=Kmax-1)
Iintra<-NULL
for (k in 2:Kmax){
resaux<-kmeans(s,k)
reskmeanscl[,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")
```
On dénote un coude dans la courbe d'inertie intraclasse aux alentours de 4 clusters.
À présent on va afficher l'évolution de l'indicateur Silouhette en fonction du nombre de classe ainsi que l'évolution de l'indice de Calinski-Harabasz en fonction du nombre de classe.
```{r,fig.cap="Visualisation du critère de Silhouette et de Calinski-Harabasz en fonction du nombre de classes demandées pour le clustering",fig.width=5}
set.seed(1234)
Silhou<-NULL
for (k in 2:Kmax){
aux<-silhouette(reskmeanscl[,k-1], daisy(s))
Silhou<-c(Silhou,mean(aux[,3]))
}
df<-data.frame(K=2:Kmax,Silhouette=Silhou)
p11=ggplot(df,aes(x=K,y=Silhouette))+
geom_point()+
geom_line()+theme(legend.position = "bottom")+
xlab("Nombre de classes")+
ylab("Silhouette")
CH<-NULL
for (k in 2:Kmax){
CH<-c(CH,index.G1(x=s , cl=reskmeanscl[,k-1]))
}
daux<-data.frame(NbClust=2:Kmax,CH=CH)
p12 =ggplot(daux,aes(x=NbClust,y=CH))+
geom_line()+
geom_point()+
xlab("Nombre de classes")+
ylab("CH")
grid.arrange(p11,p12,ncol=2)
```
Silhouette et l'indice de Calinski-Harabasz ont un pic à 2, mais cela est normal sachant que Silhouette et l'indice de Calinski-Harabasz ont tendance à sous-estimer le nombre de clusters.
### visualisation du clustering
```{r,fig.cap="Visualisation des clusters générés par la méthode kmeans dnas le plan factoriel 1,2"}
set.seed(1234)
#graphes des clusters
res_kmeans = kmeans(s,4)
p11 = fviz_cluster(res_kmeans,data=donnees_transposees,
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")
# on choisis 2 clusters
aux<-silhouette(reskmeanscl[,4-1], daisy(s))
p12 = fviz_silhouette(aux)+
theme(plot.title = element_text(size =9))
#graphes des clusters
res_kmeans = kmeans(s,2)
p21 = fviz_cluster(res_kmeans,data=donnees_transposees,
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")
# on choisis 2 clusters
aux<-silhouette(reskmeanscl[,2-1], daisy(s))
p22 = fviz_silhouette(aux)+
theme(plot.title = element_text(size =9))
grid.arrange(p11,p12,p21,p22,ncol=2)
```
Après comparaison, on choisit 2 classes car cela nous semble plus optimal que 4.
### clustering CAH
À présent on va afficher l'évolution de l'indice de Calinski-Harabasz en fonction du nombre de classes utilisées pour découper le dendogramme.
```{r, fig.width=5, fig.cap="Visualisation du critère de Calinski-Harabasz en fonction du nombre de classes demandées pour le clustering"}
set.seed(1234)
dx<-dist(donnees_transposees)
hward<-hclust(dx,method = "ward.D2")
CH<-NULL
for (k in 2:Kmax){
CH<-c(CH,index.G1(x=donnees_transposees, cl= cutree(hward,k)))
}
daux<-data.frame(NbClust=2:Kmax,CH=CH)
ggplot(daux,aes(x=NbClust,y=CH))+
geom_line()+
geom_point()+
xlab("Nombre de classes")+
ylab("CH")
```
On choisit alors de prendre 2 classes par observation du maximum du graphe.
```{r, fig.width=5, fig.cap="Dendogramme du clustering de l'ACP des variables Tt en tant qu'individus, obtenu par méthode CAH"}
set.seed(1234)
ClustCH<-cutree(hward,k=2)
fviz_dend(hward,k=2,show_labels=FALSE)+ggtitle("Dendogramme du clustering de l'ACP des variables Tt en tant qu'individus, obtenu par méthode CAH")
fviz_pca_ind(res_pca, habillage = as.factor(ClustCH), geom = c("point"))
```
### Comparaison des clusterings
A 2 classes nous obtenons une classification qui ne change pas entre chaque méthode. Nous décidons donc qu'il s'agit donc d'un bon choix de nombre de classes.
La classification obtenue est en accord avec les observations faites lors de l'ACP, on y retrouve plus ou moins les mêmes groupements : celui majoritarement composé des relevés de T1 avec une majorité de gènes sans changement d'expression relative et celui composé des relevés de T2 et T3.
```{r,fig.width=5}
# kmeans et CAH
clust1f = paste("CLkm-",res_kmeans$cluster, sep="")
clust2f = paste("CLCAH-", cutree(hward,2), sep="")
chordDiagram(table(clust1f,clust2f))
```
# ANALYSE DES GENES
## Generation de dataExpMoy
Nous construisons le jeu de données DataExpMoy contenant la moyenne des expressions sur les réplicats de chaque gène, pour chaque traitement et chaque heure. DataExpMoy est donc une matrice de taille 542× 18.
```{r,echo=FALSE,results = FALSE,message=FALSE,warning=FALSE,fig.show='hide'}
# Liste des traitements, heures et réplicats
traitements <- c("T1", "T2", "T3")
heures <- c("1H", "2H", "3H", "4H", "5H", "6H")
replicats <- c("R1", "R2")
# Initialiser une matrice vide pour stocker les moyennes
G <- nrow(T) # Nombre de gènes
DataExpMoy <- matrix(NA, nrow = G, ncol = length(traitements) * length(heures))
colnames(DataExpMoy) <- paste(rep(traitements, each = length(heures)), heures, sep = "_")
rownames(DataExpMoy) <- rownames(T)
colnames(T)
# Calcul des moyennes
for (t in traitements) {
for (h in heures) {
# Colonnes correspondant au traitement et à l'heure pour R1 et R2
col_R1 <- paste(t, h, "R1", sep = "_")
col_R2 <- paste(t, h, "R2", sep = "_")
#print(col_R1)
#print(col_R2)
# Calculer la moyenne sur les deux réplicats
DataExpMoy[, paste(t, h, sep = "_")] <- rowMeans(T[, c(col_R1, col_R2)], na.rm = TRUE)
}
}
# Convertir en data.frame pour manipulation
DataExpMoy <- as.data.frame(DataExpMoy)
head(DataExpMoy)
```
## ACP de DataExpMoy
A partir d'ici, nous avons centré et réduit les données car cela donnait des résultats sensiblement plus exploitables au niveau des indicateurs pour le clustering.
```{r, fig.width=5}
# Effectuer l'ACP
res_pca2 <- PCA(DataExpMoy, scale.unit = TRUE, graph = FALSE)
# Création des graphiques
plot1 <- fviz_eig(res_pca2, title = "Participation de chaque valeur propre à l'inertie totale des données")
plot1
```
On voit qu'on dépasse 80% de l'inertie totale avec les deux premières valeurs propres, on prend donc les vecteurs propres associés à ces deux valeurs propres comme composantes principales de notre ACP.
```{r, fig.width=7}
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")
# Affichage côte à côte des graphiques
grid.arrange(plot2,plot3, ncol = 2)
```
Il semble y avoir deux groupes principaux de gènes (individus), ce qui pourrait refléter une différenciation claire entre les niveaux d'expression sous différents traitements.
Les points plus éloignés du centre vers le haut représentent des gènes ayant des comportements plus spécifiques ou atypiques.
Le premier axe (DIM 1) est fortement corrélé avec les traitements T2, T3 à des moments précis, en particulier pour les temps plus avancés (par exemple, T3 4H, T3 5H, T3 6H). Cela suggère que Dim1 reflète les différences d'expression liées à l'effet des traitements T2 au fil du temps, qui a la particularité de faire exprimer ses gènes sur les temps plus longs. Cela explique aussi la corrélation des variables de relevés de T3 à cette dimension, car T3 est un mélange de T1 et T2.
Le deuxième axe (DIM2) semble corrélé avec des effets à court terme, typiques de T1. Cela pourrait indiquer des gènes qui réagissent rapidement mais dont l'effet s'atténue à long terme.
En regardant la correlations des variables qui représentent les relevés sur T1, comme elles sont très positivement corrélées avec la dimension 2, on en déduis que les gènes vers les valeurs élevées de la dimension 2 sont ceux ciblés par le traitement 1, et 3.
Comme T3 est une combinaison des traitements T1 et T2, il semble structurer fortement l'axe principal (Dim1) pour des temps intermédiaires et avancés, mais est notablement corrélé positivement à la dimension 2 pour les premières heures de traitement, correspondant bien avec le fait que T1 fait exprimer les gènes qu'il vise de manière très rapide. On retrouve bien le fait que T3 est la somme des deux autres traitements.
### Ajout des variables qualitatives
Nous allons maintenant afficher les points en dans les dimensions de l'ACP, colorés en fonction des modalités des 3 variables qualitatives ExpT1, ExpT2 et ExpT3. Cela peut nous permettre d'affiner notre interprétation des résultats de l'ACP.
```{r, fig.height=7}
p11 = fviz_pca_ind(res_pca2,habillage=T$ExpT1,geom=c("point"))
p12 = fviz_pca_ind(res_pca2,habillage=T$ExpT2,geom=c("point"))
p13 = fviz_pca_ind(res_pca2,habillage=T$ExpT3,geom=c("point"))
grid.arrange(p11,p12,p13)
```
### analyse
On observe donc 3 clusters de gènes :
- Les gènes étant poussés à la sur-expression par T1, affichés comme non-exprimés durant T2 et partiellement sur-exprimés avec T3
- Les gènes étant sous-exprimés (verts) durant T2 et T3, non-exprimés durant T1.
- Les gènes étant sur-exprimés (bleus) durant T2 et T3, non-exprimés durant T1.
On confirme donc bien notre analyse descriptive préliminaire, et nos suppositions de sens prétés aux dimensions 1 et 2 de l'ACP.
## Clustering
L'objectif de ce clustering est de regrouper des individus (ici, des gènes) en groupes homogènes selon leurs similarités.
```{r,fig.cap="Visualisation de l'inertie intra-classe et Silouhette en fonction du nombre de classes demandées pour le clustering",fig.width=5}
#centrage et réduction des données
set.seed(1234)
s_2 = scale(DataExpMoy[-c(19:21)])
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)
p11=ggplot(df,aes(x=K,y=Iintra))+
geom_line()+
geom_point()+
xlab("Nombre de classes")+
ylab("Inertie intraclasse")
Silhou<-NULL
for (k in 2:Kmax){
aux<-silhouette(reskmeanscl_2[,k-1], daisy(s_2))
Silhou<-c(Silhou,mean(aux[,3]))
}
df<-data.frame(K=2:Kmax,Silhouette=Silhou)
p12=ggplot(df,aes(x=K,y=Silhouette))+
geom_point()+
geom_line()+theme(legend.position = "bottom")+
xlab("Nombre de classes")+
ylab("Silouhette")
grid.arrange(p11,p12,ncol=2)
```
En lisant le graphe de l'inertie intra-classe, on observe le coude aux alentours de 3 classes. En observant l'indice de Silouhette, on remarque le pic recherché à 3 classes également. Les indices concordants, on en déduit que le choix optimal du nombre de classes pour le clustering est 3.
```{r,fig.cap="Visualisation des clusters générés par la méthode kmeans dnas le plan factoriel 1,2",fig.width=5}
set.seed(1234)
#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.width=9, fig.cap="Dendogramme du clustering de l'ACP, obtenu par méthode CAH",fig.width=5}
dx=dist(s_2)
hward=hclust(dx,method = "ward.D2")
fviz_dend(hward,k=3,
show_labels = FALSE,
palette = "npg",
rect_border = "npg",
labels_track_height = 0.8)+ggtitle("Dendogramme découpé représentant le clustering obtenu par méthode CAH")
```
### analyse des clusterings
On remarque que les clusterings correspondent aux groupes que nous avions discernés sur la figure <insérer nombre>
### Evolution de l'expression des genes en fonction de leur traitement et cluster
Nous avons généré 3 graphiques, représentant l'évolution de l'expression moyenne des gènes par cluster et par traitement. Cela pourra nous permettre d'affiner nos observations sur les traitements.
```{r,fig.width=13}
DataExpMoy$GeneID <- rownames(DataExpMoy)
DataExpMoy$Cluster <- as.factor(res_kmeans_2$cluster)
data_long <- pivot_longer(
DataExpMoy,
cols = -c(Cluster, GeneID),
names_to = "Condition",
values_to = "Expression"
)
data_long <- separate(
data_long,
col = "Condition",
into = c("Traitement", "Temps"),
sep = "_"
)
data_long$Temps <- as.numeric(gsub("H", "", data_long$Temps))
data_grouped <- group_by(data_long, Cluster, Traitement, Temps)
data_mean <- summarise(
data_grouped,
Expression = mean(Expression),
.groups = "drop"
)
ggplot(data_mean, aes(x = Temps, y = Expression, group = Cluster, color = Cluster)) +
geom_line(size = 1.2) +
facet_wrap(~ Traitement, scales = "free_y") +
labs(
title = "Évolution moyenne de l'expression génique par traitement et cluster",
x = "Temps (heures)",
y = "Expression génique (moyenne)"
) +
scale_color_manual(values = c("red", "blue", "green"))
```
On lis sur les graphiques de la figure <> la liaison de toutes les observations que nous avons pu faire :
On remarque sur T1 le fait que le cluster 2 correspond au peu de gènes qu'il influence et qui vont se sur-exprimer tôt dans le traitement, pour ensuite l'expression relative re-diminue.
Lors du traitement 2, les gènes de ce cluster ne vont pas/peu s'exprimer et lors du traitement 3, ils vont s'exprimer de la même façon que lors du traitement 1, ce qui est logique sachant que T3 est le mélange de T2 et T1.
Comme lors de l'analyse descriptive, on observe les deux autres clusters se sous-exprimer légèrement lors de T1 et se sur et sous exprimer pour T2 et T3, tout en conservant leur expression dans le temps.
Le cluster 1 correspond aux gènes sur-exprimés et le cluster 3 aux gènes sous-exprimés pour T2 et T3.
## 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
## generation de la matrice de données qualitatives
```{r}
MatriceExp = T[,c(37,38,39)]
rownames(MatriceExp) = rownames(T)
colnames(MatriceExp) = c("ExpT1","ExpT2","ExpT3")
MatriceExp = as.data.frame(MatriceExp)
```
### K-modes
```{r,fig.cap=""}
set.seed(1234)
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,echo=FALSE,results = FALSE,message=FALSE,warning=FALSE,fig.show='hide'}
afcm=MCA(MatriceExp,graph = TRUE)
coeff=afcm$ind$coord
clkmeans=kmeans(coeff,3)
fviz_cluster(clkmeans,
data = coeff,
geom = "point",
ellipse.type = "norm",
main = "Clustering des gènes basé sur l'ACM et k-means")
```
### PAM
Pour effectuer un clustering PAM avec des données qualitatives, nous avons généré en amont une matrice de dissimilarité grâce à la métrique de gower, pour ensuite lancer l'algorithme PAM sur cette matrice.
```{r, fig.cap="Visualisation des clusters générés par la méthode PAM"}
# La distance de Gower est adaptée aux données qualitatives
ds <- daisy(MatriceExp, metric = "gower")
resPAMcl<-matrix(0,nrow=nrow(MatriceExp),ncol=Kmax-1)
Silhou<-NULL
for (k in 2:Kmax){
resaux<-pam(ds,k,metric="euclidean")
resPAMcl[,k-1]<-resaux$clustering
aux<-silhouette(resPAMcl[,k-1], ds)
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")
res_pam = pam(ds, k = 10)
# Étape 4 : Visualiser les clusters
#fviz_cluster(
# res_pam,
# data = MatriceExp,
# ellipse.type = "norm", # Ajouter une ellipse normale autour des clusters
# labelsize = 8, # Taille des étiquettes
# geom = c("point") # Utiliser des points pour visualiser les données
#) +
# ggtitle("Visualisation des clusters générés par la méthode PAM")
```
# TODO :
- refaire sans centrer-réduire
- interpréter par rapport aux méta-variable
- ne pas afficher le clustering dans les plans de l'acp pour les 2 dernières ACP
- 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 ??