1. Synopsis

L’histoire de ce TP et les données proviennent d’un article de Christner et al..

Escherichia coli O104:H4 producteur de shigatoxines (groupe phylogénétique B1 et ST678) est une bactérie avec des caractéristiques de virulence communes aux E. coli entéroagrégatifs (EAEC). Cette souche est très virulente et peut être responsable du syndrome hémolytique et urémique (SHU). Plusieurs épidémies ont été décrites en Europe mais la source n’a pas été clairement identifiée malgré des recherches intensives.

En 2011, le nord de l’Allemagne a connu une importante épidémie d’E.coli Shiga-toxigène O104:H4. La grande quantité d’échantillons envoyés aux laboratoires de microbiologie pour l’évaluation épidémiologique a souligné l’importance de procédures de typage rapides et peu coûteuses.

Nous utiliserons les fonctions de ce tutoriel.

2. objectif

Evaluer les performances de la spectrométrie de masse de type MALDI-TOF pour le typage d’un clone d’Escherichia coli Shiga-toxigène O104:H4

3. Import des données

GitHub est un service web d’hébergement et de gestion de développement de logiciels. Nous pouvons stocker des données dans un dossier appelé repository.

Les données que nous allons utiliser pour ces travaux pratiques sont disponibles sur un repository GitHub.

Vous pouvez télécharger directment les données via un lien. Deux fichiers vont pouvoir être téléchargés (i) Une matrice d’intensité (RawIntensityMatrixChristner) et (ii) les métadata associées (MetadataShigatoxChristnermetadata).

Les deux fichiers sont ont des formats différents: - RawIntensityMatrixChristner est un fichier en format .csv - MetadataShigatoxChristnermetadata est en fichier en format .tsv

Question : quelle est la différence entre un fichier .csv et un fichier .tsv ?

Réponse :

Nous allons utiliser le package R qui permet l’import de fichiers avec des formats différents.

#install.package("readr") #installation du package
library("readr") # chargement des fonctions

Deux fonctions du package readr vont être utilisées pour importer les fichiers : read_tsv() et read_csv(). Vous pouvez regarder la documentation associée avec les commandes : ?read_tsv() et ?read_csv()

# (i) Téléchargement de la matrice d'intensité

## utilisation de la fonction url pour ouvrir ou fermer une connection
urlfileMatrix <- url("https://raw.githubusercontent.com/agodmer/MSData/main/ShigaToxigenicEscherichia/RawIntensityMatrixChristnerSN3.tsv")

## Utilisation de la fonction read_tsv
IntensityMatrixShigatox <- read_tsv(urlfileMatrix)
## Rows: 891 Columns: 956
## -- Column specification --------------------------------------------------------
## Delimiter: "\t"
## dbl (956): 2004.25296921192, 2008.53597116772, 2013.23855360021, 2018.575972...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
# (ii) Téléchargement des métadata associées

urlfileMetadata <- url("https://raw.githubusercontent.com/agodmer/MSData/main/ShigaToxigenicEscherichia/MetadataShigatoxChristner.csv")

## Utilisation de la fonction read_tsv
MetadataMatrixShigatox <- read_csv(urlfileMetadata)
## Rows: 891 Columns: 5
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (4): Toxigenic_status, Strain_number, spot, type_of_extraction
## dbl (1): id_number
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.

4. Analyse descriptive des données (comprendre ses données) :

Question : A l’aide de la fonction dim(), déterminer le nombre de colones et de lignes pour chacun des deux tableaux téléchargés.

## table dimension
dim(IntensityMatrixShigatox)
## [1] 891 956

Réponse : La matrice d’intensités contient : X colones et Y lignes

## table dimension
dim(MetadataMatrixShigatox)
## [1] 891   5

Réponse : Le tableau des métadadonnées contient : X colones et Y lignes

En sachant que le nombre de lignes pour la matrice d’intensités correspond au nombres d’échantillons (spectre). Ce résutat est-il cohérent avec le fichier de métadonnées associées ?

Réponse :

## Unlist the data in a signe vector
Hist.data <- unlist(IntensityMatrixShigatox)

## Plot hist (ugly graph)
hist(Hist.data)

Votre analyse :

## Beatutiful plot

5. Analyse par composante principale

## Install packages
#install.packages(c("FactoMineR", "factoextra"))

## load
library("FactoMineR")
library("factoextra")
## Le chargement a nécessité le package : ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa

5.1 : Avec les données brutes (raw data)

## Easy PCA no scale
res.pca.raw <- PCA(IntensityMatrixShigatox, scale.unit = FALSE, graph = FALSE)


## Plot variance results
fviz_eig(res.pca.raw, addlabels = TRUE, ylim = c(0, 100))

Question : Quelle est la variance résumée par les deux premières composantes principales ?

Réponse :

## Plot PCA
#### Axes 1 et 2
fviz_pca_ind(res.pca.raw,
             geom.ind = "point", # show points only (nbut not "text")
             col.ind = MetadataMatrixShigatox$Toxigenic_status, # color by groups
             palette = c("blue", "red", "green", "black"),
             addEllipses = TRUE, # Concentration ellipses
             legend.title = "Groups"
             )

## Plot PCA
#### Axes 2 et 3
fviz_pca_ind(res.pca.raw,
             geom.ind = "point", # show points only (nbut not "text")
             axes = c(2, 3),
             col.ind = MetadataMatrixShigatox$Toxigenic_status, # color by groups
             palette = c("blue", "red", "green", "black"),
             addEllipses = TRUE, # Concentration ellipses
             legend.title = "Groups"
             )

fviz_contrib(res.pca.raw,
             choice = "var",
             axes = 1:2,
             top = 10)

fviz_pca_biplot (res.pca.raw,
                 col.ind = MetadataMatrixShigatox$Toxigenic_status,
                 palette = "jco",
                 addEllipses = TRUE,
                 label = "var",
                 col.var = "black",
                 repel = TRUE,
                 legend.title = "Species")
## Warning: ggrepel: 956 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

5.2 : Avec les données scalées

## Easy PCA no scale
res.pca.scale <- PCA(IntensityMatrixShigatox,
                     scale.unit = TRUE,
                     graph = FALSE)


## Plot variance results
fviz_eig(res.pca.scale,
         addlabels = TRUE,
         ylim = c(0, 100))

## Plot PCA
fviz_pca_ind(res.pca.scale,
             geom.ind = "point", # show points only (nbut not "text")
             col.ind = MetadataMatrixShigatox$Toxigenic_status, # color by groups
             palette = c("blue", "red", "green", "black"),
             addEllipses = TRUE, # Concentration ellipses
             legend.title = "Groups"
             )

fviz_contrib(res.pca.scale,
             choice = "var",
             axes = 1:2,
             top = 10)

fviz_pca_var(res.pca.scale,
             col.var = "contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")
             )

fviz_pca_biplot (res.pca.scale,
                col.ind = MetadataMatrixShigatox$Toxigenic_status,
                palette = "jco",
                addEllipses = TRUE, label = "var",
                col.var = "black", repel = TRUE,
                legend.title = "Species")
## Warning: ggrepel: 954 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

  • Question : Y avait-il un interêt à normaliser les données ?