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 SummarizedExperimentssont 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.

  1. 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.↩︎