Prochaines étapes
Dernière mise à jour le 2024-09-12 | Modifier cette page
Vue d'ensemble
Questions
- Qu’est-ce qu’une « expérience résumée » ?
- Qu’est-ce qu’un bioconducteur ?
Objectifs
- Présentez le projet Bioconducteur.
- Introduire la notion de conteneurs de données.
- Donnez un aperçu du
SummarizedExperiment
, largement utilisé dans les analyses omiques.
Prochaines étapes
ERREUR
Error in bibliothèque("tidyverse"): could not find function "bibliothèque"
Les données en bioinformatique sont souvent complexes. Pour résoudre ce problème, les développeurs définissent des conteneurs de données spécialisés (appelés classes) qui correspondent aux propriétés des données qu’ils doivent gérer.
Cet aspect est au cœur du projet Bioconductor1 qui utilise la même infrastructure de données de base dans tous les packages. Ce a certainement contribué au succès de Bioconductor. Il est conseillé aux développeurs du package Bioconductor d’utiliser l’infrastructure existante pour assurer la cohérence, l’interopérabilité et la stabilité du projet dans son ensemble .
Pour illustrer un tel conteneur de données omiques, nous présenterons
la classe SummarizedExperiment
.
Expérience résumée
La figure ci-dessous représente l’anatomie de la classe SummarizedExperiment.
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. Caractéristiques (gènes, transcrits, protéines, …) sont définis le long des lignes, et les échantillons le long des colonnes.
Un emplacement exemple de métadonnées contenant des exemples de covariables, stocké sous forme de trame de données . Les lignes de ce tableau représentent des échantillons (les lignes correspondent exactement aux colonnes des données d’expression).
Un emplacement de métadonnées de fonctionnalité contenant des covariables de fonctionnalité, stockées sous forme de une trame de données. Les lignes de ce bloc de données correspondent exactement aux lignes des données d’expression .
La nature coordonnée du SummarizedExperiment
garantit
que lors de la manipulation des données, les dimensions des différents
emplacements seront 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) lors de la manipulation des données. 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.
Les emplacements de métadonnées peuvent développer des co-variables supplémentaires (colonnes) sans affecter les autres structures.
Création d’une expérience résumée
Afin de créer un SummarizedExperiment
, nous allons créer
les composants individuels, c’est-à-dire la matrice de comptage,
l’échantillon et le gène métadonnées à 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).
ERREUR
Error in read_csv("data/rnaseq.csv"): could not find function "read_csv"
ERREUR
Error in rna %>% select(gene, sample, expression) %>% pivot_wider(names_from = sample, : could not find function "%>%"
ERREUR
Error in counts %>% select(-gene) %>% as.matrix(): could not find function "%>%"
ERREUR
Error in eval(expr, envir, enclos): object 'counts' not found
ERREUR
Error in rna %>% select(sample, organism, age, sex, infection, strain, : could not find function "%>%"
ERREUR
Error in eval(expr, envir, enclos): object 'sample_metadata' not found
ERREUR
Error in rna %>% select(gene, ENTREZID, product, ensembl_gene_id, external_synonym, : could not find function "%>%"
ERREUR
Error in eval(expr, envir, enclos): object 'gene_metadata' not found
ERREUR
Error in eval(expr, p): object 'count_matrix' not found
ERREUR
Error in eval(expr, p): object 'gene_metadata' not found
ERREUR
Error in eval(expr, p): object 'sample_metadata' not found
-
Une matrice d’expression : nous chargeons la
matrice de comptage, en spécifiant que les premières colonnes
contiennent des noms de lignes/gènes, et convertissons le
data.frame
en unematrice
. Vous pouvez le télécharger ici.
R
count_matrix <- read.csv("data/count_matrix.csv",
row.names = 1) %>%
as.matrix()
ERREUR
Error in read.csv("data/count_matrix.csv", row.names = 1) %>% as.matrix(): could not find function "%>%"
R
count_matrix[1:5, ]
ERREUR
Error in eval(expr, envir, enclos): object 'count_matrix' not found
R
dim(count_matrix)
ERREUR
Error in eval(expr, envir, enclos): object 'count_matrix' not found
- Un tableau décrivant les échantillons, disponible ici.
R
sample_metadata <- read.csv("data/sample_metadata.csv")
sample_metadata
SORTIE
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)
SORTIE
[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]
SORTIE
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)
SORTIE
[1] 1474 9
Nous allons créer un SummarizedExperiment
à partir de
ces tables :
La matrice de comptage qui sera utilisée comme
essai
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 **
Pour ce faire, nous pouvons assembler les différentes parties à
l’aide du constructeur SummarizedExperiment
:
R
## BiocManager::install("SummarizedExperiment")
bibliothèque("SummarizedExperiment")
ERREUR
Error in bibliothèque("SummarizedExperiment"): could not find function "bibliothèque"
Tout d’abord, nous nous assurons que les échantillons sont dans le même ordre dans la matrice de comptage et l’annotation d’échantillon, et il en va de même pour les gènes dans la matrice de comptage et l’annotation des gènes.
R
stopifnot(rownames(count_matrix) == gene_metadata$gene)
ERREUR
Error in eval(expr, envir, enclos): object 'count_matrix' not found
R
stopifnot(colnames(count_matrix) == sample_metadata$sample)
ERREUR
Error in eval(expr, envir, enclos): object 'count_matrix' not found
R
se <- SummarizedExperiment(assays = list(counts = count_matrix),
colData = sample_metadata,
rowData = gene_metadata)
ERREUR
Error in SummarizedExperiment(assays = list(counts = count_matrix), colData = sample_metadata, : could not find function "SummarizedExperiment"
R
se
ERREUR
Error in eval(expr, envir, enclos): 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 dataframes 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
.
L’enregistrement d’objets comme celui-ci générera une représentation
binaire sur le disque (en utilisant l’extension de fichier
rds
ici), qui peut ê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 de R qui
seront chargées à nouveau dans R, la sauvegarde et le chargement avec
saveRDS
et readRDS
sont l’approche préférée.
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
textuelle 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))
ERREUR
Error in essai(se): could not find function "essai"
R
dim(essai(se))
ERREUR
Error in essai(se): could not find function "essai"
Nous pouvons accéder aux exemples de métadonnées à l’aide de la
fonction colData
:
R
colData(se)
ERREUR
Error in colData(se): could not find function "colData"
R
dim(colData(se))
ERREUR
Error in colData(se): could not find function "colData"
Nous pouvons également accéder aux métadonnées des fonctionnalités à
l’aide de la fonction rowData
:
R
head(rowData(se))
ERREUR
Error in rowData(se): could not find function "rowData"
R
dim(rowData(se))
ERREUR
Error in rowData(se): could not find function "rowData"
Sous-ensemble d’une expérience résumée
SummarizedExperiment peut être un sous-ensemble comme avec des trames de données, avec des chiffres ou avec des caractères logiques.
Ci-dessous, nous créons une nouvelle instance de la classe SummarizedExperiment qui contient uniquement les 5 premières fonctionnalités pour les 3 premiers échantillons.
R
se1 <- se[1:5, 1:3]
ERREUR
Error in eval(expr, envir, enclos): object 'se' not found
R
se1
ERREUR
Error in eval(expr, envir, enclos): object 'se1' not found
R
colData(se1)
ERREUR
Error in colData(se1): could not find function "colData"
R
rowData(se1)
ERREUR
Error in rowData(se1): could not find function "rowData"
Nous pouvons également utiliser la fonction colData()
pour créer un sous-ensemble sur quelque chose de les exemples de
métadonnées ou la fonction rowData()
pour créer un
sous-ensemble sur quelque chose à partir des métadonnées de
fonctionnalité . Par exemple, nous ne conservons ici que les miARN et
les échantillons non infectés :
R
se1 <- se[rowData(se)$gene_biotype == "miRNA",
colData(se)$infection == "NonInfected"]
ERREUR
Error in eval(expr, envir, enclos): object 'se' not found
R
se1
ERREUR
Error in eval(expr, envir, enclos): object 'se1' not found
R
assay(se1)
ERREUR
Error in assay(se1): could not find function "assay"
R
colData(se1)
ERREUR
Error in colData(se1): could not find function "colData"
R
rowData(se1)
ERREUR
Error in rowData(se1): could not find function "rowData"
R
assay(se)[1:3, colData(se)$time != 4]
ERREUR
Error in assay(se): could not find function "assay"
R
# Equivalent to
assay(se)[1:3, colData(se)$time == 0 | colData(se)$time == 8]
ERREUR
Error in assay(se): could not find function "assay"
R
arn |>
filtre(gène %in% c("Asl", "Apod", "Cyd2d22")) |>
filtre(temps != 4) |> select(expression )
ERREUR
Error in select(filtre(filtre(arn, gène %in% c("Asl", "Apod", "Cyd2d22")), : could not find function "select"
Le long tableau et le SummarizedExperiment
contiennent
les mêmes informations , mais sont simplement structurés différemment.
Chaque approche a ses propres avantages : la première convient bien aux
packages tidyverse
, tandis que la seconde est la structure
préférée pour de nombreuses étapes de bioinformatique et de traitement
statistique. Par exemple, une analyse typique d’ARN-Seq utilisant le
package DESeq2
.
Ajouter des variables aux métadonnées
Nous pouvons également 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)))
ERREUR
Error in colData(se): could not find function "colData"
R
colData(se)
ERREUR
Error in colData(se): could not find function "colData"
Cela illustre que les emplacements 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 avec le package tidySummarizedExperiment
.
Rappelez-vous à quoi ressemble notre objet SummarizedExperiment :
R
se
ERREUR
Error in eval(expr, envir, enclos): object 'se' not found
Chargez tidySummarizedExperiment
puis jetez à nouveau un
œil à l’objet se .
R
#BiocManager::install("tidySummarizedExperiment")
library("tidySummarizedExperiment")
ERREUR
Error in library("tidySummarizedExperiment"): there is no package called 'tidySummarizedExperiment'
R
se
ERREUR
Error in eval(expr, envir, enclos): object 'se' not found
Il s’agit toujours d’un objet SummarizedExperiment
, il
conserve donc la structure efficace , 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 de la sortie le nombre de
transcriptions et d’échantillons.
Si nous voulons revenir à la vue standard
SummarizedExperiment
, nous pouvons le faire.
R
options("restore_SummarizedExperiment_show" = TRUE)
se
ERREUR
Error in eval(expr, envir, enclos): object 'se' not found
Mais ici, nous utilisons la vue tibble.
R
options("restore_SummarizedExperiment_show" = FALSE)
se
ERREUR
Error in eval(expr, envir, enclos): 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")
ERREUR
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)
ERREUR
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")
ERREUR
Error in se %>% muter(center = "Université de Heidelberg"): could not find function "%>%"
Nous pouvons également combiner des commandes avec le tube 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))
ERREUR
Error in se %>% group_by(.sample) %>% summarise(total_counts = sum(counts)): could not find function "%>%"
Nous pouvons traiter l’objet SummarizedExperiment bien rangé comme un tibble normal pour le traçage.
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()
ERREUR
Error in se %>% ggplot(aes(counts + 1, group = .sample, color = infection)): could not find function "%>%"
Pour plus d’informations sur TidySummarizedExperiment, consultez le site Web du packageici.
Message à retenir
SummarizedExperiment
représente un moyen efficace de stocker et de gérer les données omiques.Ils 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.
L’ensemble de l’analyse du package DESeq2
est géré dans un
SummarizedExperiment
.
Le Bioconductor a été initié par Robert Gentleman, l’un des deux créateurs du langage R . Bioconductor fournit des outils dédiés à l’analyse des données omiques . Bioconductor utilise le langage de programmation statistique R et est open source et développement ouvert.↩︎