Prochaines étapes

Dernière mise à jour le 2024-09-12 | Modifier cette page

Durée estimée : 90 minutes

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 une matrice. 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"

Défi

Extraire les niveaux d’expression génique des 3 premiers gènes dans les échantillons au temps 0 et au temps 8.

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"

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 )

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.

Points clés

  • Bioconductor est un projet fournissant un support et des packages pour la compréhension de données biologiques à haut débit.
  • Un SummarizedExperiment est un type d’objet utile pour stocker et gérer des données omiques à haut débit.

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