gros boulot
BIN
000010.png
Normal file
After Width: | Height: | Size: 30 KiB |
542
Projet.Rmd
|
@ -1,8 +1,8 @@
|
|||
---
|
||||
title: "Projet"
|
||||
output:
|
||||
pdf_document: default
|
||||
html_document: default
|
||||
pdf_document: default
|
||||
date: "2024-12-04"
|
||||
---
|
||||
|
||||
|
@ -21,10 +21,13 @@ library(dplyr)
|
|||
library(tidyr)
|
||||
library(dbscan)
|
||||
library(klaR)
|
||||
library(clusterSim)
|
||||
library(circlize)
|
||||
```
|
||||
|
||||
```{r}
|
||||
set.seed(1234)
|
||||
.Random.seed = 1234
|
||||
T = read.table("DataProjet3MIC-2425.txt",header=TRUE,sep=";")
|
||||
T$ExpT1 = as.factor(T$ExpT1)
|
||||
T$ExpT2 = as.factor(T$ExpT2)
|
||||
|
@ -37,11 +40,10 @@ str(T)
|
|||
levels(T$ExpT1)
|
||||
```
|
||||
|
||||
# A REFAIRE LES ANALYSES, JAVAIS PAS VU QUE T3 ETAIT UNE COMBINAISON DE T1 ET T2
|
||||
|
||||
|
||||
# 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èeme heure lors du traitement $$T \in \{T1,T2,T3\}$$
|
||||
- 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).
|
||||
|
||||
|
@ -51,68 +53,36 @@ levels(T$ExpT1)
|
|||
# Analyse unidimentionnelle :
|
||||
|
||||
|
||||
### LES 3 PROCHAINS PLOTS N'APPORTENT RIEN PAR RAPPORT AUX HISTOGRAMMES, JE LES AI DONC CACHES
|
||||
### Expression des gênes lors du traitement T1
|
||||
```{r,echo=FALSE,results = FALSE,message=FALSE,warning=FALSE,fig.show='hide'}
|
||||
> LES 3 PROCHAINS PLOTS N'APPORTENT RIEN PAR RAPPORT AUX HISTOGRAMMES, JE LES AI DONC CACHES
|
||||
|
||||
## 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,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$ExpT1)) +
|
||||
geom_bar(aes(y = (..count..)/sum(..count..)))+ylab("")+ggtitle("Frequences")
|
||||
|
||||
df <- data.frame(group = levels(T$ExpT1),
|
||||
value = as.vector(table(T$ExpT1))/nrow(T))
|
||||
g3<-ggplot(df, aes(x="", y=value, fill=group))+
|
||||
geom_bar(width = 1, stat = "identity")+
|
||||
coord_polar("y", start=0)+
|
||||
theme(legend.position="bottom")
|
||||
grid.arrange(g3,g1,g2,ncol=3,top=textGrob("Visualualisation des expressions relative des gènes lors du traitement T1"))
|
||||
```
|
||||
|
||||
### Expression des gênes lors du traitement T2
|
||||
```{r,echo=FALSE,results = FALSE,message=FALSE,warning=FALSE,fig.show='hide'}
|
||||
g1<-ggplot(T, aes(x=T$ExpT2))+
|
||||
g2<-ggplot(T, aes(x=T$ExpT2))+
|
||||
geom_bar()+
|
||||
ylab("Effectifs")+ggtitle("Effectifs")
|
||||
g2<-ggplot(T, aes(x = T$ExpT2)) +
|
||||
geom_bar(aes(y = (..count..)/sum(..count..)))+ylab("")+ggtitle("Frequences")
|
||||
|
||||
df <- data.frame(group = levels(T$ExpT2),
|
||||
value = as.vector(table(T$ExpT2))/nrow(T))
|
||||
g3<-ggplot(df, aes(x="", y=value, fill=group))+
|
||||
geom_bar(width = 1, stat = "identity")+
|
||||
coord_polar("y", start=0)+
|
||||
theme(legend.position="bottom")
|
||||
grid.arrange(g3,g1,g2,ncol=3,top=textGrob("Visualualisation des expressions relative des gènes lors du traitement T2"))
|
||||
```
|
||||
|
||||
|
||||
### Expression des gênes lors du traitement T3
|
||||
```{r,echo=FALSE,results = FALSE,message=FALSE,warning=FALSE,fig.show='hide'}
|
||||
g1<-ggplot(T, aes(x=T$ExpT3))+
|
||||
g3<-ggplot(T, aes(x=T$ExpT3))+
|
||||
geom_bar()+
|
||||
ylab("Effectifs")+ggtitle("Effectifs")
|
||||
g2<-ggplot(T, aes(x = T$ExpT3)) +
|
||||
geom_bar(aes(y = (..count..)/sum(..count..)))+ylab("")+ggtitle("Frequences")
|
||||
|
||||
df <- data.frame(group = levels(T$ExpT3),
|
||||
value = as.vector(table(T$ExpT3))/nrow(T))
|
||||
g3<-ggplot(df, aes(x="", y=value, fill=group))+
|
||||
geom_bar(width = 1, stat = "identity")+
|
||||
coord_polar("y", start=0)+
|
||||
theme(legend.position="bottom")
|
||||
grid.arrange(g3,g1,g2,ncol=3,top=textGrob("Visualualisation des expressions relative des gènes lors du traitement T3"))
|
||||
grid.arrange(g1,g2,g3,ncol=3,top=textGrob("Visualualisation des expressions relative des gènes lors du traitement T1,T2 et T3"))
|
||||
```
|
||||
|
||||
### Analyse de de ces 3 variables
|
||||
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 rapporrt avec le fait que T3 est une combinaison des traitement T1 et T2.
|
||||
|
||||
### 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
|
||||
|
||||
#### Traitement T1
|
||||
```{r, fig.height=5,fig.cap="Histogrammes de l'expression relative des gènes aux différents relevés lors du traitement T1"}
|
||||
## 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]]),
|
||||
|
@ -124,27 +94,25 @@ ggplot(T_long, aes(x = value)) +
|
|||
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")
|
||||
```
|
||||
### Traitement T2
|
||||
```{r, fig.height=5,fig.cap="Histogrammes de l'expression relative des gènes aux différents relevés lors du traitement T3"}
|
||||
```{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")
|
||||
```
|
||||
### Traitement T3
|
||||
```{r, fig.height=5,fig.cap="Histogrammes de l'expression relative des gènes aux différents relevés lors du traitement T3"}
|
||||
```{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.
|
||||
|
||||
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.
|
||||
|
||||
### boxplots pour faire joli
|
||||
## 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))
|
||||
|
@ -152,115 +120,94 @@ 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))
|
||||
```
|
||||
|
||||
On voit que même sans réduire les données, chaque variable s'exprime environ avec la même intensité donc pas besoin de centrer réduire lors de l'ACP
|
||||
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)
|
||||
|
||||
```{r}
|
||||
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
|
||||
|
||||
#ggplot(T,aes(y=T$T1_6H_R1,x=T$ExpT1))+
|
||||
#geom_boxplot()
|
||||
#ggplot(T,aes(y=T$T1_6H_R2,x=T$ExpT1))+
|
||||
#geom_boxplot()
|
||||
ggplot(T,aes(y=T$T1_6H_R1,x=T$ExpT2))+
|
||||
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()
|
||||
ggplot(T,aes(y=T$T1_6H_R1,x=T$ExpT3))+
|
||||
geom_boxplot()
|
||||
ggplot(T,aes(y=T$T1_6H_R2,x=T$ExpT3))+
|
||||
#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
|
||||
|
||||
ggplot(T,aes(y=T$T2_6H_R1,x=T$ExpT1))+
|
||||
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()
|
||||
#ggplot(T,aes(y=T$T2_6H_R1,x=T$ExpT2))+
|
||||
#geom_boxplot()
|
||||
#ggplot(T,aes(y=T$T2_6H_R2,x=T$ExpT2))+
|
||||
#geom_boxplot()
|
||||
ggplot(T,aes(y=T$T2_6H_R1,x=T$ExpT3))+
|
||||
geom_boxplot()
|
||||
ggplot(T,aes(y=T$T2_6H_R2,x=T$ExpT3))+
|
||||
#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
|
||||
ggplot(T,aes(y=T$T3_6H_R1,x=T$ExpT1))+
|
||||
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))+
|
||||
#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_R1,x=T$ExpT2))+
|
||||
geom_boxplot()
|
||||
ggplot(T,aes(y=T$T3_6H_R2,x=T$ExpT2))+
|
||||
geom_boxplot()
|
||||
#ggplot(T,aes(y=T$T3_6H_R1,x=T$ExpT3))+
|
||||
#geom_boxplot()
|
||||
#ggplot(T,aes(y=T$T3_6H_R2,x=T$ExpT3))+
|
||||
#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 (réplicats 1 et 2)
|
||||
Les genes sur-exprimés au T1 sont non-exprimé durant le T2.
|
||||
Il est difficile d'observer une catégorie de genes de T1 qui se soient sous exprimés dans T2. De même pour la sur-expression dans T2.
|
||||
> 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).
|
||||
|
||||
Ceux qui s'étaient sur-exprimés au T1 ont affiché aucun changement semblent ne pas avoir changé d'expression au T3 ( relativement à l'absence de traitement).
|
||||
|
||||
Ceux qui n'avaient pas changés d'expression relative durant T1, se sont sous exprimé ou sur exprimé.
|
||||
Il faut bien se rappeler que T1 ne cible que très peu de genes donc ces observations sont cohérentes.
|
||||
|
||||
- traitement 2
|
||||
On observe une légère tendance des genes s'étant sous-exprimé avec T1 à se sous exprimer avec T2 mais le reste des boxplots ne permettent pas de relever quoi que ce soit par rapport à T2.
|
||||
|
||||
En revanche, il est très clair que T2 et T3 ciblent les mêmes genes, toutes les expressions relevées par T2 concordent aux modalités qualitatives moyennes calculées sur T3.
|
||||
> 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).
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Analyse bi-dimensionnelle
|
||||
|
||||
### matrice de covariance des variables quantitatives
|
||||
## 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 = 18,fig.cap="Visualisation de la matrice de covariance des variables quantitatives"}
|
||||
cr = cor(T[-c(37:39)])
|
||||
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.
|
||||
|
||||
|
||||
|
||||
### Regression linéaire des variables 2 à 2 ???
|
||||
|
||||
|
||||
|
||||
### librairie biostatR
|
||||
## Rapport de correlation Eta2
|
||||
```{r}
|
||||
library(BioStatR)
|
||||
# Calculate eta² for Treatment 1
|
||||
|
||||
print("T1 vs T2")
|
||||
eta2(T$T1_6H_R1, T$ExpT2)
|
||||
eta2(T$T1_6H_R2, T$ExpT2)
|
||||
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")
|
||||
eta2(T$T1_6H_R1, T$ExpT3)
|
||||
eta2(T$T1_6H_R2, T$ExpT3)
|
||||
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")
|
||||
eta2(T$T2_6H_R1, T$ExpT3)
|
||||
eta2(T$T2_6H_R2, T$ExpT3)
|
||||
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 ?
|
||||
## 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)
|
||||
|
@ -275,19 +222,20 @@ La grande valeur des effectifs partiels sur la diagonale de la table de continge
|
|||
|
||||
|
||||
|
||||
## Menez une analyse en composantes principales où les Tt sH Rr sont les individus décrits par les gènes.
|
||||
# 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 sur un jeu de données centrées réduites pour que chaque variable s'exprime avec la même force dans les résultats et qu'ils soient lisibles.
|
||||
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=TRUE,graph=FALSE)
|
||||
res_pca<-PCA(donnees_transposees,scale.unit=FALSE,graph=FALSE)
|
||||
res_pca$eig
|
||||
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 les valeurs propres de la matrice de corrélation du jeu de données. L'inertie totale des données étant la somme des valeurs propres ( qui elles sont les inerties axiale associées à l'axe de vecteur directeur un 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 des points rien qu'avec les deux premieres valeurs propres, on en prend donc les vecteurs propres associés respectivement à chacune de ces deux valeurs propres comme axes principaux de l'analyse.
|
||||
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"}
|
||||
|
@ -302,7 +250,7 @@ Contexte : les relevés aux heures sont décrits par les gènes ( les gènes son
|
|||
## 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.
|
||||
Les 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.
|
||||
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.
|
||||
|
@ -311,43 +259,42 @@ Pour le traitement 2 et 3, on les retrouves formant 2 groupements, 1 en haut à
|
|||
|
||||
|
||||
|
||||
## ON EST SENSE VOIR UN TRUC IMPORTANT D'APRES LA PROF MAIS JE VOIS RIEN
|
||||
### Les axes générés par l'ACP sont purement virtuels, mais on peut y préter un sens plus ou moins défini selon les variables qui y sont corrélées
|
||||
|
||||
================================================
|
||||
axe 1: force du changement d'expression des gènes : si on sur-exprime/sous-exprime de beaucoup ( genre 0=>5) ou pas, polarisation ?
|
||||
|
||||
axe 2 : vers le haut => ça va changer d'expression bientot, vers le bas => ça se stabilise ( donc les genes pointant vers le haut changent d'expression, et ceux vers le bas ont tendance à rester plutot pareil )
|
||||
axe 2 : stabilité de l'expression du gène : vers le haut => ça va changer d'expression bientot, vers le bas => ça se stabilise ( donc les genes pointant vers le haut changent d'expression, et ceux vers le bas ont tendance à rester plutot pareil )
|
||||
|
||||
> On remarque que les traitements ne sont pas du tout décris de la même manière selon les horaires, mais il y a une régularité d'apparition dans chaque tranche horaire.
|
||||
|
||||
Essayons maintenant de préter un sens à ce que l'on observe :
|
||||
|
||||
### hypothèses sur la signification : qu'est-ce qu'ils ont en commun ces gènes qui pourrait décrire ces relevés aux différentes heures et les différents traitements
|
||||
|
||||
|
||||
|
||||
En regardant le graphe des individus (résultats aux heures de relevés), on a effectivement les heures groupées à des valeurs negatives de l'axe 1 correspondant aux relevés du traitement 1 qui, souvenons-nous toujours des histogrammes, ne change l'expression relative que de très peu de gènes.
|
||||
En regardant le graphe des individus (résultats aux heures de relevés), on a effectivement les heures groupées à des valeurs negatives de l'axe 1 correspondant aux relevés du traitement 1 qui ne change l'expression relative que de très peu de gènes.
|
||||
|
||||
Pour l'interprétation du second axe, les gènes semblent y être positivement et negativement corrélés quel que soit leur correlation avec l'axe 1.
|
||||
En regardant les individus, on observe que plus l'heure est tardive, plus ils tendent vers des valeurs negatives sur l'axe 2. De plus, on observe que les points liés aux relevés du traitement 1 ne vont pas énormément vers les valeurs positives. Il semble donc que l'axe 2 soit indicateur des expressions des gènes sont susceptibles de changer.
|
||||
|
||||
En regardant les individus, on observe que plus l'heure est tardive, plus ils tendent vers des valeurs negatives sur l'axe 2. De plus, on observe que les points liés aux relevés du traitement 1 ne vont pas énormément vers les valeurs positives. Il semble donc que l'axe 2 soit indicateur des expressions des gènes sont susceptibles de changer
|
||||
|
||||
|
||||
## 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 d’identifier des profils ou des comportements communs, facilitant l’interpré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)
|
||||
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
|
||||
reskmeanscl[,k-1]=resaux$cluster
|
||||
Iintra<-c(Iintra,resaux$tot.withinss)
|
||||
}
|
||||
|
||||
|
@ -358,10 +305,11 @@ ggplot(df,aes(x=K,y=Iintra))+
|
|||
xlab("Nombre de classes")+
|
||||
ylab("Inertie intraclasse")
|
||||
```
|
||||
nn pense dénoter un coude dans la courbe d'inertie intraclasse aux alentours de 4 clusters
|
||||
|
||||
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"}
|
||||
set.seed(1234)
|
||||
Silhou<-NULL
|
||||
for (k in 2:Kmax){
|
||||
aux<-silhouette(reskmeanscl[,k-1], daisy(s))
|
||||
|
@ -369,70 +317,85 @@ for (k in 2:Kmax){
|
|||
}
|
||||
|
||||
df<-data.frame(K=2:Kmax,Silhouette=Silhou)
|
||||
ggplot(df,aes(x=K,y=Silhouette))+
|
||||
p11=ggplot(df,aes(x=K,y=Silhouette))+
|
||||
geom_point()+
|
||||
geom_line()+theme(legend.position = "bottom")
|
||||
geom_line()+theme(legend.position = "bottom")+
|
||||
xlab("Nombre de classes")+
|
||||
ylab("Silhouette")
|
||||
|
||||
CH<-NULL
|
||||
Kmax<-20
|
||||
for (k in 2:Kmax){
|
||||
CH<-c(CH,index.G1(x=s , cl= kmeans(s,k)$cluster))
|
||||
CH<-c(CH,index.G1(x=s , cl=reskmeanscl[,k-1]))
|
||||
}
|
||||
daux<-data.frame(NbClust=2:Kmax,CH=CH)
|
||||
ggplot(daux,aes(x=NbClust,y=CH))+
|
||||
p12 =ggplot(daux,aes(x=NbClust,y=CH))+
|
||||
geom_line()+
|
||||
geom_point()
|
||||
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
|
||||
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)
|
||||
fviz_cluster(res_kmeans,data=donnees_transposees,
|
||||
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))
|
||||
fviz_silhouette(aux)+
|
||||
p22 = fviz_silhouette(aux)+
|
||||
theme(plot.title = element_text(size =9))
|
||||
rm(df,Silhou,aux)
|
||||
|
||||
grid.arrange(p11,p12,p21,p22,ncol=2)
|
||||
```
|
||||
On remaque bien 2 clusters
|
||||
Après comparaison, on choisit 2 classes car cela nous semble plus optimal que 4.
|
||||
|
||||
### PAM
|
||||
|
||||
```{r, fig.cap="Visualisation des clusters générés par la méthode PAM dnas le plan factoriel 1,2"}
|
||||
res_pam = pam(s,2,metric="euclidean")
|
||||
fviz_cluster(res_pam,data=donnees_transposees,
|
||||
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")
|
||||
```
|
||||
|
||||
|
||||
|
||||
### clustering CAH
|
||||
```{r, fig.width=9, fig.cap="Dendogramme du clustering de l'ACP des variables Tt en tant qu'individus, obtenu par méthode CAH"}
|
||||
### 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=9, 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
|
||||
Kmax<-20
|
||||
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()
|
||||
geom_point()+
|
||||
xlab("Nombre de classes")+
|
||||
ylab("CH")
|
||||
```
|
||||
On choisit alors de prendre 2 classes par observation du maximum du graphe.
|
||||
|
||||
```{r, fig.width=9, 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"))
|
||||
|
@ -441,33 +404,24 @@ fviz_pca_ind(res_pca, habillage = as.factor(ClustCH), geom = c("point"))
|
|||
|
||||
|
||||
### Comparaison des clusterings
|
||||
On voit bien qu'à 4 classes, les regroupements ne sont pas consistents entre chaque méthode de clustering. A 3 classes nous obtenons une classification qui ne change pas, ou presque, entre chaque méthode. Nous décidons donc qu'il s'agit donc d'un bon choix de nombre de classes.
|
||||
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, celui composé des relevés de T2 et T3 aux heures des changements d'expression les plus brutaux, et finalement celui s'étalant sur la droite qui semble représenter la fin de l'évolution des traitements T2 et T3 où l'expression de gènes y est très polarisée.
|
||||
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.
|
||||
|
||||
|
||||
FAIRE LES GRAPHES RONDS CHELOUS POUR LES CLUSTERINGS 2 A 2
|
||||
|
||||
```{r}
|
||||
# kmeans et PAM
|
||||
clust1f = paste("CLkm-",res_kmeans$cluster, sep="")
|
||||
clust2f = paste("CLCAH-", res_pam$clustering, sep="")
|
||||
chordDiagram(table(clust1f,clust2f))
|
||||
|
||||
# kmeans et CAH
|
||||
clust1f = paste("CLkm-",res_kmeans$cluster, sep="")
|
||||
clust2f = paste("CLCAH-", cutree(hward,2), sep="")
|
||||
chordDiagram(table(clust1f,clust2f))
|
||||
# PAM ET CAH
|
||||
clust1f = paste("CLkm-",res_pam$clustering, 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}
|
||||
# Liste des traitements, heures et réplicats
|
||||
traitements <- c("T1", "T2", "T3")
|
||||
|
@ -497,44 +451,66 @@ 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}
|
||||
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=7}
|
||||
|
||||
# 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")
|
||||
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=10}
|
||||
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)
|
||||
|
||||
```
|
||||
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
|
||||
```{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"))
|
||||
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=8}
|
||||
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 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 en fonction du nombre de classes demandées pour le clustering"}
|
||||
```{r,fig.cap="Visualisation de l'inertie intra-classe et Silouhette en fonction du nombre de classes demandées pour le clustering"}
|
||||
#centrage et réduction des données
|
||||
s_2 = DataExpMoy[-c(19:21)]
|
||||
set.seed(1234)
|
||||
|
||||
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){
|
||||
|
@ -544,14 +520,12 @@ for (k in 2:Kmax){
|
|||
}
|
||||
|
||||
df<-data.frame(K=2:15,Iintra=Iintra)
|
||||
ggplot(df,aes(x=K,y=Iintra))+
|
||||
p11=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_2))
|
||||
|
@ -559,21 +533,21 @@ for (k in 2:Kmax){
|
|||
}
|
||||
|
||||
df<-data.frame(K=2:Kmax,Silhouette=Silhou)
|
||||
ggplot(df,aes(x=K,y=Silhouette))+
|
||||
p12=ggplot(df,aes(x=K,y=Silhouette))+
|
||||
geom_point()+
|
||||
geom_line()+theme(legend.position = "bottom")
|
||||
geom_line()+theme(legend.position = "bottom")+
|
||||
xlab("Nombre de classes")+
|
||||
ylab("Silouhette")
|
||||
|
||||
aux<-silhouette(reskmeanscl_2[,3-1], daisy(s_2))
|
||||
fviz_silhouette(aux)+
|
||||
theme(plot.title = element_text(size =9))
|
||||
rm(df,Silhou,aux)
|
||||
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"}
|
||||
set.seed(1234)
|
||||
#graphes des clusters
|
||||
res_kmeans_2 = kmeans(s_2,3)
|
||||
fviz_cluster(res_kmeans_2,data=s_2,
|
||||
|
@ -584,60 +558,73 @@ fviz_cluster(res_kmeans_2,data=s_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")
|
||||
dx=dist(s_2)
|
||||
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")
|
||||
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 :
|
||||
### 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}
|
||||
# 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
|
||||
DataExpMoy$GeneID <- rownames(DataExpMoy)
|
||||
|
||||
# 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
|
||||
)
|
||||
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"))
|
||||
|
||||
#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
|
||||
```
|
||||
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.
|
||||
|
||||
|
||||
|
||||
|
@ -645,38 +632,69 @@ ggplot(data_long, aes(x = Temps, y = Expression, group = GeneID, color = Cluster
|
|||
## 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 = T[,c(-1,-2,-3)]
|
||||
## 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)
|
||||
MatriceExp$ExpT1 = T$ExpT1
|
||||
MatriceExp$ExpT2 = T$ExpT2
|
||||
MatriceExp$ExpT3 = T$ExpT3
|
||||
head(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,fig.cap=""}
|
||||
head(MatriceExp)
|
||||
afcm=MCA(MatriceExp,graph = FALSE)
|
||||
afcm=MCA(MatriceExp,graph = TRUE)
|
||||
coeff=afcm$ind$coord
|
||||
clkmeans=kmeans(coeff,3)
|
||||
# Visualisation des clusters
|
||||
fviz_cluster(clkmeans,
|
||||
data = coeff,
|
||||
geom = "point",
|
||||
geom = "point",
|
||||
ellipse.type = "norm",
|
||||
main = "Clustering des gènes basé sur l'ACM et k-means")
|
||||
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)
|
||||
|
||||
|
||||
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.
|
||||
# É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")
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
|
BIN
Projet_files/figure-html/unnamed-chunk-11-1.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-12-1.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-12-2.png
Normal file
After Width: | Height: | Size: 119 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-13-1.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-14-1.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-14-2.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-15-1.png
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-15-2.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-16-1.png
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-17-1.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-17-2.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-17-3.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-18-1.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-18-2.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-18-3.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-2-1.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-20-1.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-20-2.png
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-21-1.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-21-2.png
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-21-3.png
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-22-1.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-23-1.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-23-2.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-24-1.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-25-1.png
Normal file
After Width: | Height: | Size: 83 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-26-1.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-27-1.png
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
Projet_files/figure-html/unnamed-chunk-28-1.png
Normal file
After Width: | Height: | Size: 204 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-3-1.png
Normal file
After Width: | Height: | Size: 104 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-4-1.png
Normal file
After Width: | Height: | Size: 103 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-5-1.png
Normal file
After Width: | Height: | Size: 100 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-6-1.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-6-2.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-1.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-10.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-11.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-12.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-2.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-3.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-4.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-5.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-6.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-7.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-8.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-7-9.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Projet_files/figure-html/unnamed-chunk-8-1.png
Normal file
After Width: | Height: | Size: 492 KiB |