Introduction
"Quelle est la profondeur de ce séquençage ?"
"Quelle proportion de SNPs se situent dans des exons ?"
"Y a‑t-il des pics dans ces données de ChIP-seq ?"
"Quelle proportion de promoteurs chevauchent des îlots CpG ?"
Voilà le genre de questions rencontrées fréquemment en bioinformatique. Nous pouvons y répondre à l'aide de la manipulation d'intervalles. Un intervalle est défini par ses positions de début et de fin. Nous allons voir comment travailler avec ce genre de données en utilisant des packages de la suite Bioconductor pour R. Il existe l'équivalent dans d'autres langages, notamment bedtools et PyRanges.
Au niveau le plus élémentaire, un intervalle est ainsi constitué de deux nombres, indiquant son début et sa fin. Le package IRanges permet par exemple de manipuler ce type de données très basiques.
Nous ne travaillons cependant pas avec des données dénuées de contexte. Il est en effet important de savoir sur quel chromosome et sur quel brin on se situe, quelle est la taille du génome, … Le package GenomicRanges, que nous étudierons dans le second article de cette série, présente ainsi tout son intérêt, en permettant de rajouter ces informations.
Le package plyranges, qui clôturera cette série, permet quant à lui de manipuler des intervalles à l'aide de la syntaxe dplyr (noms de fonctions simples et enchaînement d'opérations à l'aide de pipes).
Installer et charger le package IRanges
Dans un premier temps, nous allons installer et charger le package dans R :
1 2 3 4 5 |
[crayon-674190a1a0eba426860484 ]if (!require("BiocManager")) install.packages("BiocManager") BiocManager::install("IRanges") library(IRanges) |
Créer un objet IRanges
Pour créer un objet IRanges, au moins deux éléments sur les trois suivants sont nécessaires :
- la position de début des intervalles
- la position de fin des intervalles
- la largeur des intervalles
La fonction IRanges() permet la création de ce type d'objet, en indiquant le début et la fin des intervalles. Nous aurions également pu créer le même objet en indiquant le début et la largeur des intervalles.
1 2 3 4 |
ir <- IRanges( start = c(4, 5, 9, 13, 19, 20, 20), end = c(15, 10, 14, 16, 25, 23, 24) ) |
Voyons à quoi ressemble notre objet :
Nous pouvons en extraire le contenu à l'aide des fonctions suivantes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# extraire les positions de début des intervalles start(ir) # extraire les positions de fin des intervalles end(ir) # extraire les largeurs des intervalles width(ir) # extraire les deux premières lignes ir[1 :2] # extraire les intervalles d'au moins 7 unités ir[width(ir) >= 7] |
Manipulations de base
Nous allons maintenant passer en revue les principales fonctions de manipulation d'intervalles du package.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# ordonner les intervalles de gauche à droite et fusionner les intervalles # chevauchants ou adjacents reduce(ir) # modifier la taille des intervalles à la largeur souhaitée # possibilité d'ancrer l'intervalle (fix = "start", "end", ou "center") # par défaut, fix = "start" resize(ir, width = 2, fix = "start") # extraire les régions non couvertes par les intervalles # ne prend pas en compte les régions non couvertes par les intervalles gaps(ir) # décaler les intervalles de n unités dans un sens ou dans l'autre shift(ir, -3) |
Voici une illustration des résultats obtenus à l'aide des commandes ci-dessus :
Calcul de profondeur
Le calcul de profondeur fait partie des opérations les plus courantes. Il s'agit de savoir, pour chaque position de l'espace défini par l'ensemble des intervalles, combien d'intervalles couvrent cette position.
1 |
[crayon-674190a1a0ed1296287733 ]coverage(ir) |
Cette commande renvoie un objet de classe Rle (Run-length encoding, Codage par plages en français), qui permet la compression de données sans perte. Plutôt que d'avoir par exemple une chaîne de caractères "abbcccddddeeeee", ce codage indique combien de fois une donnée est répétée. Notre chaîne de caractères devient ainsi "a1b2c3d4e5". Ce type de codage est donc particulièrement intéressant pour des données contenant une grande quantité de valeurs répétées.
1 2 3 |
[crayon-674190a1a0ed8850357139 ]integer-Rle of length 25 with 13 runs Lengths : 3 1 4 2 2 2 1 1 2 1 4 1 1 Values : 0 1 2 3 2 3 2 1 0 1 3 2 1 |
Le résultat se lit de la manière suivante : les 3 premières positions ne sont pas couvertes, puis la 4e position est couverte 1 fois, …, l'avant-dernière position est couverte 2 fois et enfin la dernière position est couverte 1 fois.
Comme mentionné dans l'introduction, IRanges atteint ses limites dès lors que l'on travaille avec des intervalles génomiques, pour lesquels le package GenomicRanges est bien plus adapté. Ce sera l'objet de notre prochain article !
Métadonnées
Notre objet ir se compose de 7 intervalles et 0 colonne de métadonnées. Ces métadonnées peuvent être des noms de gènes, des scores, des pourcentages de GC, …
Voyons comment ajouter ce genre de données à notre objet.
1 2 3 4 5 |
# Ajouter des noms de gènes mcols(ir)$gene <- c(paste0("gene", LETTERS[1 :7])) # Ajouter des scores mcols(ir)$score <- seq(from = 0, to = 10, length = 7) |
Nous pouvons accéder à ces différents éléments de la manière suivante :
Conclusion
Dans les prochains articles, à paraître prochainement, nous verrons comment utiliser ces outils de façon plus concrète, en particulier pour la manipulation et les opérations sur des intervalles génomiques. N’hésitez pas à poser vos questions en commentaires, j’essayerai d’y répondre dans ces prochains articles ou directement dans le fil des commentaires
Pour aller plus loin …
- Page d'accueil du package IRanges (Bioconductor)
- An overview of the IRanges package (pdf)
______________________________________________________________________________
Un grand merci à Camille, Aurélien, azerin, Guillaume et Yoann pour leurs commentaires, conseils et autres remarques constructives dans le cadre ce cette première contribution au blog !
Les logos des packages ont été téléchargés sur BiocStickers
Laisser un commentaire