Accessibility Tools

- Le blog participatif de bioinformatique francophone depuis 2012 -

Introduction

"Quelle est la pro­fon­deur de ce séquen­çage ?"

"Quelle pro­por­tion de SNPs se situent dans des exons ?"

"Y a-t-il des pics dans ces don­nées de ChIP-seq ?"

"Quelle pro­por­tion de pro­mo­teurs che­vauchent des îlots CpG ?"

Voi­là le genre de ques­tions ren­con­trées fré­quem­ment en bio­in­for­ma­tique. Nous pou­vons y répondre à l'aide de la mani­pu­la­tion d'intervalles. Un inter­valle est défi­ni par ses posi­tions de début et de fin. Nous allons voir com­ment tra­vailler avec ce genre de don­nées en uti­li­sant des packages de la suite Bio­con­duc­tor pour R. Il existe l'équivalent dans d'autres lan­gages, notam­ment bed­tools et PyRanges.

Au niveau le plus élé­men­taire, un inter­valle est ain­si consti­tué de deux nombres, indi­quant son début et sa fin. Le package IRanges per­met par exemple de mani­pu­ler ce type de don­nées très basiques.

Nous ne tra­vaillons cepen­dant pas avec des don­nées dénuées de contexte. Il est en effet impor­tant de savoir sur quel chro­mo­some et sur quel brin on se situe, quelle est la taille du génome, … Le package Geno­mi­cRanges, que nous étu­die­rons dans le second article de cette série, pré­sente ain­si tout son inté­rêt, en per­met­tant de rajou­ter ces infor­ma­tions.

Le package ply­ranges, qui clô­tu­re­ra cette série, per­met quant à lui de mani­pu­ler des inter­valles à l'aide de la syn­taxe dplyr (noms de fonc­tions simples et enchaî­ne­ment d'opérations à l'aide de pipes).

Installer et charger le package IRanges

Dans un pre­mier temps, nous allons ins­tal­ler et char­ger le package dans R :

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 sui­vants sont néces­saires :

  • la posi­tion de début des inter­valles
  • la posi­tion de fin des inter­valles
  • la lar­geur des inter­valles

La fonc­tion IRanges() per­met la créa­tion de ce type d'objet, en indi­quant le début et la fin des inter­valles. Nous aurions éga­le­ment pu créer le même objet en indi­quant le début et la lar­geur des inter­valles.

ir - IRanges(
         start = c(4, 5, 9, 13, 19, 20, 20),
         end = c(15, 10, 14, 16, 25, 23, 24)
         )

Voyons à quoi res­semble notre objet :

Nous pou­vons en extraire le conte­nu à l'aide des fonc­tions sui­vantes :

# 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 main­te­nant pas­ser en revue les prin­ci­pales fonc­tions de mani­pu­la­tion d'intervalles du package.

# 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)    

Voi­ci une illus­tra­tion des résul­tats obte­nus à l'aide des com­mandes ci-des­sus :

Atten­tion : gaps() est exclu­sif et ne contient donc pas les fron­tières

Calcul de profondeur

Le cal­cul de pro­fon­deur fait par­tie des opé­ra­tions les plus cou­rantes. Il s'agit de savoir, pour chaque posi­tion de l'espace défi­ni par l'ensemble des inter­valles, com­bien d'intervalles couvrent cette posi­tion.

coverage(ir)

Cette com­mande ren­voie un objet de classe Rle (Run-length enco­ding, Codage par plages en fran­çais), qui per­met la com­pres­sion de don­nées sans perte. Plu­tôt que d'avoir par exemple une chaîne de carac­tères "abbcccddd­deeeee", ce codage indique com­bien de fois une don­née est répé­tée. Notre chaîne de carac­tères devient ain­si "a1b2c3d4e5". Ce type de codage est donc par­ti­cu­liè­re­ment inté­res­sant pour des don­nées conte­nant une grande quan­ti­té de valeurs répé­tées.

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ésul­tat se lit de la manière sui­vante : les 3 pre­mières posi­tions ne sont pas cou­vertes, puis la 4e posi­tion est cou­verte 1 fois, …, l'avant-dernière posi­tion est cou­verte 2 fois et enfin la der­nière posi­tion est cou­verte 1 fois.

Comme men­tion­né dans l'introduction, IRanges atteint ses limites dès lors que l'on tra­vaille avec des inter­valles géno­miques, pour les­quels le package Geno­mi­cRanges est bien plus adap­té. Ce sera l'objet de notre pro­chain article !

Métadonnées

Notre objet ir se com­pose de 7 inter­valles et 0 colonne de méta­don­nées. Ces méta­don­nées peuvent être des noms de gènes, des scores, des pour­cen­tages de GC, …

Voyons com­ment ajou­ter ce genre de don­nées à notre objet.

# 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 pou­vons accé­der à ces dif­fé­rents élé­ments de la manière sui­vante :

Conclusion

Dans les pro­chains articles, à paraître pro­chai­ne­ment, nous ver­rons com­ment uti­li­ser ces outils de façon plus concrète, en par­ti­cu­lier pour la mani­pu­la­tion et les opé­ra­tions sur des inter­valles géno­miques. N’hésitez pas à poser vos ques­tions en com­men­taires, j’essayerai d’y répondre dans ces pro­chains articles ou direc­te­ment dans le fil des com­men­taires

Pour aller plus loin …

_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​_​

Un grand mer­ci à Camille, Auré­lien, aze­rin, Guillaume et Yoann pour leurs com­men­taires, conseils et autres remarques construc­tives dans le cadre ce cette pre­mière contri­bu­tion au blog !

Les logos des packages ont été télé­char­gés sur BiocS­ti­ckers

Vous avez aimé ? Dites-le nous !

Moyenne : 0 /​ 5. Nb de votes : 0

Pas encore de vote pour cet article.

We are sor­ry that this post was not use­ful for you !

Let us improve this post !

Tell us how we can improve this post ?




Commentaires

Une réponse à “Introduction à la manipulation d'intervalles dans R”

  1. Super article, hâte de lire la suite sur GRanges !

Laisser un commentaire

Pour insérer du code dans vos commentaires, utilisez les balises <code> et <\code>.