Prochaines étapes
Last updated on 2025-05-05 | Edit this page
Overview
Questions
- Qu’est-ce qu’un « SummarizedExperiment » ?
- Qu’est-ce que Bioconductor ?
Objectives
- Présenter le projet Bioconductor.
- Introduire la notion de ‘conteneurs’ de données.
- Donner un aperçu du
SummarizedExperiment
, très fréquemment utilisé dans les analyses de données de type omiques.
Prochaines étapes
ERROR
Error in bibliothèque("tidyverse"): could not find function "bibliothèque"
Pour faciliter l’analyse des données omiques qui sont généralement complexes, les développeurs ont défini des conteneurs spécialisés (appelés classes), spécifiquement adaptés à leurs propriétés, afin de pouvoir les stocker et les manipuler facilement.
Cet aspect est central au projet Bioconductor1 qui utilise la même infrastructure de données dans tous ses packages. Il est en effet demandé aux développeurs de packages Bioconductor d’utiliser l’infrastructure existante pour assurer la cohérence, l’interopérabilité et la stabilité du projet dans son ensemble. Ceci a d’ailleurs certainement contribué au succès de Bioconductor . Ceci a d’ailleurs certainement contribué au succès de Bioconductor .
Pour illustrer la notion de conteneur de données
omiques, nous présenterons la classe appelée
SummarizedExperiment
.
SummarizedExperiment
La figure ci-dessous représente la structure de cette classe.
Les objets de la classe SummarizedExperiment contiennent :
Un (ou plusieurs) test(s) contenant les données omiques quantitatives (données d’expression), stockées sous forme d’objet de type matriciel. dans lesquelles les lignes représentent les features (les variables mesurées, comme par exemple les gènes dans le cas d’une analyse RNAseq) et les colonnes représentent les différents échantillons analysés.
Les métadonnées décrivant les échantillons sous forme d’un data frame. Les lignes de ce tableau représentent les différents échantillons (l’ordre des lignes doit correspondre exactement à l’ordre des colonnes des données d’expression).
Un slot avec les métadonnées décrivant les features sous forme d’un data frame. également. Dans cette table, les lignes représentent chaque feature et l’ordre de ces lignes doit être le même que dans la table des données d’expression. Les colonnes de cette table représentent les co-variables des features comme par exemple la localisation chromosomique des gènes, leur référence ENSEMBL ou leur fonction.
La structure coordonnée du SummarizedExperiment
garantit
que lors de la manipulation des données, les dimensions des différents
slots corresponderont toujours (c’est-à-dire les colonnes des
données d’expression puis les lignes de les exemples de métadonnées,
ainsi que les lignes des données d’expression et les métadonnées des
fonctionnalités). Par exemple, si nous devions exclure un échantillon du
test, il serait automatiquement supprimé des métadonnées de
l’échantillon au cours de la même opération.
On peut par contre peut ajouter aux slots de métadonnées des co-variables supplémentaires (colonnes) sans affecter les autres structures.
Création d’un SummarizedExperiment
Afin de créer un SummarizedExperiment
, nous allons
commencer par en créer les composants individuels, c’est-à-dire la
matrice de comptage, la table de métadonnées des échantillons et celle
des features. Nous allons générer ces tables à partir de
fichiers csv C’est généralement ainsi que les données RNA-Seq sont
fournies (après le traitement des données brutes).
ERROR
Error in read_csv("data/rnaseq.csv"): could not find function "read_csv"
ERROR
Error in pivot_wider(select(rna, gene, sample, expression), names_from = sample, : could not find function "pivot_wider"
ERROR
Error in select(counts, -gene): could not find function "select"
ERROR
Error: object 'counts' not found
ERROR
Error in select(rna, sample, organism, age, sex, infection, strain, time, : could not find function "select"
ERROR
Error: object 'sample_metadata' not found
ERROR
Error in select(rna, gene, ENTREZID, product, ensembl_gene_id, external_synonym, : could not find function "select"
ERROR
Error: object 'gene_metadata' not found
ERROR
Error in eval(expr, p): object 'count_matrix' not found
ERROR
Error in eval(expr, p): object 'gene_metadata' not found
ERROR
Error in eval(expr, p): object 'sample_metadata' not found
-
Une matrice d’expression : nous chargeons la
matrice de comptage, en spécifiant que la première colonnes contient les
noms des gènes, et nous convertissons le data frame en une
matrice
. Vous pouvez télécharger le data frame ici.
R
count_matrix <- read.csv("data/count_matrix.csv",
row.names = 1) %>%
as.matrix()
ERROR
Error in read.csv("data/count_matrix.csv", row.names = 1) %>% as.matrix(): could not find function "%>%"
R
count_matrix[1:5, ]
ERROR
Error: object 'count_matrix' not found
R
dim(count_matrix)
ERROR
Error: object 'count_matrix' not found
- Un tableau décrivant les échantillons, disponible ici.
R
sample_metadata <- read.csv("data/sample_metadata.csv")
sample_metadata
OUTPUT
sample organism age sex infection strain time tissue mouse
1 GSM2545336 Mus musculus 8 Female InfluenzaA C57BL/6 8 Cerebellum 14
2 GSM2545337 Mus musculus 8 Female NonInfected C57BL/6 0 Cerebellum 9
3 GSM2545338 Mus musculus 8 Female NonInfected C57BL/6 0 Cerebellum 10
4 GSM2545339 Mus musculus 8 Female InfluenzaA C57BL/6 4 Cerebellum 15
5 GSM2545340 Mus musculus 8 Male InfluenzaA C57BL/6 4 Cerebellum 18
6 GSM2545341 Mus musculus 8 Male InfluenzaA C57BL/6 8 Cerebellum 6
7 GSM2545342 Mus musculus 8 Female InfluenzaA C57BL/6 8 Cerebellum 5
8 GSM2545343 Mus musculus 8 Male NonInfected C57BL/6 0 Cerebellum 11
9 GSM2545344 Mus musculus 8 Female InfluenzaA C57BL/6 4 Cerebellum 22
10 GSM2545345 Mus musculus 8 Male InfluenzaA C57BL/6 4 Cerebellum 13
11 GSM2545346 Mus musculus 8 Male InfluenzaA C57BL/6 8 Cerebellum 23
12 GSM2545347 Mus musculus 8 Male InfluenzaA C57BL/6 8 Cerebellum 24
13 GSM2545348 Mus musculus 8 Female NonInfected C57BL/6 0 Cerebellum 8
14 GSM2545349 Mus musculus 8 Male NonInfected C57BL/6 0 Cerebellum 7
15 GSM2545350 Mus musculus 8 Male InfluenzaA C57BL/6 4 Cerebellum 1
16 GSM2545351 Mus musculus 8 Female InfluenzaA C57BL/6 8 Cerebellum 16
17 GSM2545352 Mus musculus 8 Female InfluenzaA C57BL/6 4 Cerebellum 21
18 GSM2545353 Mus musculus 8 Female NonInfected C57BL/6 0 Cerebellum 4
19 GSM2545354 Mus musculus 8 Male NonInfected C57BL/6 0 Cerebellum 2
20 GSM2545362 Mus musculus 8 Female InfluenzaA C57BL/6 4 Cerebellum 20
21 GSM2545363 Mus musculus 8 Male InfluenzaA C57BL/6 4 Cerebellum 12
22 GSM2545380 Mus musculus 8 Female InfluenzaA C57BL/6 8 Cerebellum 19
R
dim(sample_metadata)
OUTPUT
[1] 22 9
- Un tableau décrivant les gènes, disponible ici.
R
gene_metadata <- read.csv("data/gene_metadata.csv")
gene_metadata[1:10, 1:4]
OUTPUT
gene ENTREZID
1 Asl 109900
2 Apod 11815
3 Cyp2d22 56448
4 Klk6 19144
5 Fcrls 80891
6 Slc2a4 20528
7 Exd2 97827
8 Gjc2 118454
9 Plp1 18823
10 Gnb4 14696
product
1 argininosuccinate lyase, transcript variant X1
2 apolipoprotein D, transcript variant 3
3 cytochrome P450, family 2, subfamily d, polypeptide 22, transcript variant 2
4 kallikrein related-peptidase 6, transcript variant 2
5 Fc receptor-like S, scavenger receptor, transcript variant X1
6 solute carrier family 2 (facilitated glucose transporter), member 4
7 exonuclease 3'-5' domain containing 2
8 gap junction protein, gamma 2, transcript variant 1
9 proteolipid protein (myelin) 1, transcript variant 1
10 guanine nucleotide binding protein (G protein), beta 4, transcript variant X2
ensembl_gene_id
1 ENSMUSG00000025533
2 ENSMUSG00000022548
3 ENSMUSG00000061740
4 ENSMUSG00000050063
5 ENSMUSG00000015852
6 ENSMUSG00000018566
7 ENSMUSG00000032705
8 ENSMUSG00000043448
9 ENSMUSG00000031425
10 ENSMUSG00000027669
R
dim(gene_metadata)
OUTPUT
[1] 1474 9
Nous allons créer un SummarizedExperiment
à partir de
ces tables :
La matrice de comptage sera utilisée comme assay
Le tableau décrivant les échantillons sera utilisé comme emplacement de métadonnées **sample **
Le tableau décrivant les gènes sera utilisé comme emplacement de métadonnées **features **
Nous allons assembler les différentes parties à l’aide du
constructeur SummarizedExperiment
:
R
## BiocManager::install("SummarizedExperiment")
bibliothèque("SummarizedExperiment")
ERROR
Error in bibliothèque("SummarizedExperiment"): could not find function "bibliothèque"
Tout d’abord, il est impératif de s’assurer que les échantillons sont dans le même ordre dans la matrice de comptage et dans les annotations des échantillons. De même, nous allons vérifier que l’ordre des gènes de la matrice de comptage correspond bien à l’ordre des gènes dans les métadonnées les décrivant.
R
stopifnot(rownames(count_matrix) == gene_metadata$gene)
ERROR
Error: object 'count_matrix' not found
R
stopifnot(colnames(count_matrix) == sample_metadata$sample)
ERROR
Error: object 'count_matrix' not found
R
se <- SummarizedExperiment(assays = list(counts = count_matrix),
colData = sample_metadata,
rowData = gene_metadata)
ERROR
Error in SummarizedExperiment(assays = list(counts = count_matrix), colData = sample_metadata, : could not find function "SummarizedExperiment"
R
se
ERROR
Error: object 'se' not found
La sauvegarde des données
L’export de données vers un tableur, comme nous l’avons fait dans un
épisode précédent, présente plusieurs limitations, comme celles décrites
dans le premier chapitre (éventuelles incohérences avec ,
et .
pour les séparateurs décimaux et manque de définitions
de types de variables). De plus, l’exportation de données vers une
feuille de calcul n’est pertinente que pour les données rectangulaires
telles que les data frames et les matrices.
Une manière plus générale de sauvegarder des données, spécifique à R
et dont le fonctionnement est garanti sur n’importe quel système
d’exploitation, consiste à utiliser la fonction saveRDS()
.
Cette fonction sauvegardera une représentation binaire de l’objet sur le
disque (en utilisant l’extension de fichier .rds
ici), et
celle-ci pourra être rechargée dans R à l’aide de la fonction
readRDS
.
R
saveRDS(se, file = "data_output/se.rds")
rm(se)
se <- readRDS("data_output/se.rds")
head(se)
Pour conclure, lorsqu’il s’agit de sauvegarder des données qui seront
re-chargées ultérieurement dans R, la sauvegarde et le chargement avec
saveRDS
et readRDS
sont les approches les plus
adéquates. Si les données tabulaires doivent être partagées avec
quelqu’un qui n’utilise pas R, alors l’exportation vers une feuille de
calcul sous forme de texte est une bonne alternative.
En utilisant cette structure de données, nous pouvons accéder à la
matrice d’expression avec la fonction assay()
:
R
head(essai(se))
ERROR
Error in essai(se): could not find function "essai"
R
dim(essai(se))
ERROR
Error in essai(se): could not find function "essai"
Nous pouvons accéder aux de métadonnées des échantillons à l’aide de
la fonction colData
:
R
colData(se)
ERROR
Error in colData(se): could not find function "colData"
R
dim(colData(se))
ERROR
Error in colData(se): could not find function "colData"
Nous pouvons également accéder aux métadonnées des features
à l’aide de la fonction rowData()
:
R
head(rowData(se))
ERROR
Error in rowData(se): could not find function "rowData"
R
dim(rowData(se))
ERROR
Error in rowData(se): could not find function "rowData"
Sous-ensemble d’un SummarizedExperiment
Il est possible d’extraire un sous-ensemble d’un SummarizedExperiment exactement de la même manière que pour un data frame, en utilsant des indices ou des caractères logiques.
Ci-dessous, nous allons créer par exemple un nouveau SummarizedExperiment qui ne contient que les 5 premiers gènes et les 3 premiers échantillons.
R
se1 <- se[1:5, 1:3]
ERROR
Error: object 'se' not found
R
se1
ERROR
Error: object 'se1' not found
R
colData(se1)
ERROR
Error in colData(se1): could not find function "colData"
R
rowData(se1)
ERROR
Error in rowData(se1): could not find function "rowData"
Nous pouvons également utiliser la fonction colData()
pour créer un sous-ensemble basé sur une caractéristique des
échantillons, ou la fonction rowData()
pour créer un
sous-ensemble basé sur une caractéristique des gènes. Dans l’exemple
ci-dessous, nous n’allons conserver que les gènes correspondant à des
miRNAs et uniquement les échantillons non-infectés :
R
se1 <- se[rowData(se)$gene_biotype == "miRNA",
colData(se)$infection == "NonInfected"]
ERROR
Error: object 'se' not found
R
se1
ERROR
Error: object 'se1' not found
R
assay(se1)
ERROR
Error in assay(se1): could not find function "assay"
R
colData(se1)
ERROR
Error in colData(se1): could not find function "colData"
R
rowData(se1)
ERROR
Error in rowData(se1): could not find function "rowData"
Défi
Extraire les niveaux d’expression génique des 3 premiers gènes dans les échantillons collectés au temps 0 et au temps 8.
R
assay(se)[1:3, colData(se)$time != 4]
ERROR
Error in assay(se): could not find function "assay"
R
# Equivalent to
assay(se)[1:3, colData(se)$time == 0 | colData(se)$time == 8]
ERROR
Error in assay(se): could not find function "assay"
Défi
Vérifiez que vous obtenez les mêmes valeurs en utilisant la longue
table rna
.
R
arn |>
filtre(gène %in% c("Asl", "Apod", "Cyd2d22")) |>
filtre(temps != 4) |> select(expression )
ERROR
Error in select(filtre(filtre(arn, gène %in% c("Asl", "Apod", "Cyd2d22")), : could not find function "select"
La table en format long et le SummarizedExperiment
contiennent les mêmes informations, mais sont simplement structurés
différemment. Chaque structure a ses avantages propres: la première
convient bien aux packages tidyverse
, tandis que
la seconde est une structure adéquate pour faciliter l’analyse et le
traitement statistique de nombreuses données omiques. Le
SummarizedExperiment
est par exemple utilisé lors des
analyses de RNA-seq avec le package DESeq2
.
Ajouter des variables aux métadonnées
Comme mentionné ci-dessus, il est possible d’ajouter des informations aux métadonnées. Supposons que vous souhaitiez ajouter le centre où les échantillons ont été collectés…
R
colData(se)$center <- rep("Université de l'Illinois", nrow(colData(se)))
ERROR
Error in colData(se): could not find function "colData"
R
colData(se)
ERROR
Error in colData(se): could not find function "colData"
Cela illustre le fait que les slots de métadonnées peuvent croître indéfiniment sans affecter les autres structures !
TidyRésuméExpérience
Vous vous demandez peut-être si pouvons-nous utiliser les commandes
Tidyverse pour interagir avec les objets
SummarizedExperiment
? La réponse est oui, nous pouvons le
faire grâce au package tidySummarizedExperiment
.
Rappelez-vous à quoi ressemble notre objet SummarizedExperiment :
R
se
ERROR
Error: object 'se' not found
Chargez tidySummarizedExperiment
puis jetez à nouveau un
œil à l’objet se .
R
#BiocManager::install("tidySummarizedExperiment")
library("tidySummarizedExperiment")
ERROR
Error in library("tidySummarizedExperiment"): there is no package called 'tidySummarizedExperiment'
R
se
ERROR
Error: object 'se' not found
Il s’agit toujours d’un objet SummarizedExperiment
, il
conserve donc sa structure spécifique, mais nous pouvons maintenant le
voir comme un tibble. Notez la première ligne de la sortie dit
ceci, c’est une abstraction
SummarizedExperiment
-tibble
. Nous pouvons
également voir dans la deuxième ligne affichée le nombre de gènes et
d’échantillons.
Si nous voulons revenir à la vue standard
SummarizedExperiment
, nous pouvons le faire.
R
options("restore_SummarizedExperiment_show" = TRUE)
se
ERROR
Error: object 'se' not found
Mais ici, nous restons sur la vue tibble.
R
options("restore_SummarizedExperiment_show" = FALSE)
se
ERROR
Error: object 'se' not found
Nous pouvons maintenant utiliser les commandes Tidyverse pour
interagir avec l’objet SummarizedExperiment
.
Nous pouvons utiliser filter
pour filtrer les lignes en
utilisant une condition, par exemple pour afficher toutes les lignes
pour un échantillon.
R
se %>% filtre(.sample == "GSM2545336")
ERROR
Error in se %>% filtre(.sample == "GSM2545336"): could not find function "%>%"
Nous pouvons utiliser « select » pour spécifier les colonnes que nous voulons afficher.
R
se %>% sélectionner (.sample)
ERROR
Error in se %>% sélectionner(.sample): could not find function "%>%"
Nous pouvons utiliser mutate
pour ajouter des
informations sur les métadonnées.
R
se %>% muter(center = "Université de Heidelberg")
ERROR
Error in se %>% muter(center = "Université de Heidelberg"): could not find function "%>%"
Nous pouvons également combiner des commandes avec le pipe
‘%>%’ de tidyverse . Pour l’exemple de , nous pourrions combiner
group_by
et summarise
pour obtenir le nombre
total de pour chaque échantillon.
R
se %>%
group_by(.sample) %>%
summarise(total_counts=sum(counts))
ERROR
Error in se %>% group_by(.sample) %>% summarise(total_counts = sum(counts)): could not find function "%>%"
Nous pouvons également utiliser l’objet
SummarizedExperiment
comme un tibble classique
pour la visualisation.
Ici, nous traçons la distribution des comptes par échantillon.
R
se |>
ggplot(aes(counts + 1, group=.sample, color=infection)) +
geom_density() +
scale_x_log10() +
theme_bw()
ERROR
Error in ggplot(se, aes(counts + 1, group = .sample, color = infection)): could not find function "ggplot"
Pour plus d’informations sur TidySummarizedExperiment
,
consultez le site Web du package ici.
A retenir
Le
SummarizedExperiment
est un moyen très efficace de stocker et de gérer les données omiques.Les
SummarizedExperiments
sont utilisés dans de nombreux packages Bioconductor.
Si vous suivez la prochaine formation axée sur l’analyse de
séquençage d’ARN, vous apprendrez à utiliser le package Bioconductor
DESeq2
pour faire des analyses d’expression différentielle.
Ce package utilise un SummarizedExperiment
pour
traiter l’ensemble des données.
Key Points
- Bioconductor est un projet qui fournit un cadre et des packages pour faciliter l’analyse et l’interprétation des données issues de la biologie à haut débit.
- Un
SummarizedExperiment
est un type d’objet particulièrement utile pour stocker et traiter ce type de donnée.
Le projet Bioconductor a été initié par Robert Gentleman, l’un des deux créateurs du langage R . Bioconductor utilise le langage R pour fournir des outils dédiés à l’analyse des données omiques. Bioconductor est open source et open development.↩︎