Connaissances requises
- Connaissances basiques en R. Si vous ne faites pas la différence entre un test exact de Fisher et le test du Chi‑2, cela ne devrait pas poser de problème.
- Euh, bah c'est tout !
Introduction
Si l'on s'en réfère à la définition :
Un informaticien, et a fortiori un bioinformaticien, fera tout pour mettre en œuvre des stratégies lui permettant d'automatiser les tâches répétitives qui lui incombe.
Plusieurs avantages à cela, i/ rallonger les pauses café, ii/ profiter du temps gagné pour regarder la guerre des étoiles directement sur le terminal :
1 |
[crayon-6704997da26d1923911671 ]telnet towel.blinkenlights.nl |
Je vous rassure, le but ici n'est pas d'apprendre à réaliser des films en caractères ASCII, chose très fastidieuse et dénuée de toute relation avec la bioinformatique.
Nous allons cependant voir comment à l'aide d'une petite dose de Markdown et de quelques commandes R, il va être possible de générer de façon automatique des beaux rapports d'analyses de données. Cela va nous permettre de réaliser des analyses reproductibles et réutilisables (par exemple, sur de nouveaux jeux de données).
Préparation
Avant de commencer la pratique, quelques petites préparations s'imposent.
Étape n°1, installer le package magique : Rmarkdown (qui est en fait une surcouche de knitr et pandoc)
1 |
package.install("rmarkdown",DEPENDANCIES=T) |
Ce petit bijou de technologie sera notre fidèle allié dans la bataille contre les forces du mal des activités répétitives.
Étape n°2, créer un nouveau fichier et l'ouvrir dans l'éditeur de texte de votre choix. On ne va pas entrer dans le débat, mais Vi est quand même "le meilleur éditeur du monde" surtout lorsqu'il est épaulé par le plugin vim-r-plugin qui le transforme en véritable IDE pour R. Les moins barbus préféreront utiliser RStudio qui intègre parfaitement la rédaction des documents Rmarkdown.
C'est dans ce fichier que nous allons rédiger notre rapport d'analyse au format Markdown. Pour ceux qui ne sont pas familier avec Markdown, c'est un langage de description syntaxique qui permet de très simplement structurer un document, avec des titres, des liens, des images, des listes, du texte en gras/italique, des tableaux… C'est un peu comme du LaTeX ou du HTML mais sans les balises complexes et les formules compliquées. C'est simplement du texte brut facile à lire et à écrire.
Dans ce document nous allons pouvoir écrire le texte de notre rapport d'analyse et l'entremêler avec des commandes R. Ces dernières seront uniquement évaluées à la génération de façon à insérer les résultats produits dans le document final. L'objectif étant d'écrire un rapport pré-formaté qui va pouvoir être ré-généré avec des données différentes. Pour ceux qui parlent le Python couramment, il existe une solution similaire pour ce langage : iPython Notebook.
Plutôt qu'un long discours, passons à la pratique.
La pratique !
Nous allons tout d'abord introduire au début de notre document quelques métadonnées au format YAML afin d'ajouter un titre bien assumé, le nom de son altesse, une date actuelle et quelques réglages sur le formatage du rapport qui sera produit. Ici, nous allons générer un PDF (compilé à l'aide d'une distribution LaTeX) avec une table des matières. Bien évidement, d'autres formats de sortie sont disponibles comme HTML, doc/docx (Word) ou même sous forme de présentation avec Beamer Latex ou io-slides. Ces deux derniers sont des templates qui permettent de générer des présentations en PDF (Beamer Latex) ou en HTML (io-slides). Il existe également un tas d'options pour personnaliser l'aspect final de votre rapport.
1 2 3 4 5 6 7 8 |
–-<br> title : "Un merveilleux rapport d'analyse"<br> author : "Elisabeth II"<br> date : March 22, 2005<br> output :<br> pdf_document :<br> toc : true<br> –- |
Maintenant, nous allons ajouter une première section à ce document afin de vanter les magnifiques analyses qui vont suivre :
1 |
# Introduction |
Dans ce **magnifique** document, nous allons analyser un ensemble d'annotations récupérées sur la base de données *Ensembl*.
Dans ce rapport nous allons découvrir :
- un magnifique graphique
- un exceptionnel tableau
- et un score de corrélation de Pearson.
Dans le formatage Markdown, le caractère
1 |
# |
permet d'introduire un titre de niveau 1, deux dièses auraient introduit un titre de niveau 2, etc. Les doubles
1 |
** |
qui entourent un mot permettent de mettre le texte en gras et les simples
1 |
* |
correspondent à l'italique. Enfin une liste à puces est simplement représentée par des tirets. Pour plus d'informations sur ce langage, direction la page officielle.
Avant de commencer les choses sérieuses, l'analyse que nous allons mener va se baser sur l'ensemble des annotations (au format GTF) du C. elegans récupérées ici sur Ensembl.
Afin d'inclure du code R nous allons insérer des R chunks :
Un R chunk est un couple de balises entre lesquelles nous allons placer du code R. Ce dernier ne sera interprété qu'à la compilation du document et le résultat produit par le code (plot, tableau, variable) sera inséré dans le document en place du chunk.
Voila un exemple de R chunk qui affiche Hello world :
1 |
[crayon-6704997da26e2872764614 ] |
1 2 |
{r}<br> print("Hello world")<br> |
1 |
Il existe également la version "inline" du R chunk, qui permet d'intégrer un résultat numérique directement dans une phrase :
1 |
[crayon-6704997da26e9711689513 ]r 2*3*7 |
Un R chunk ne produit pas forcément de résultats visibles. Certain chunk peuvent uniquement permettre d'exécuter du code R dit "silencieux".
Un cas courant d'utilisation de chunk silencieux correspond au chargement de bibliothèques et/ou de fichiers, comme ce sera le cas de notre premier R chunk :
1 |
[crayon-6704997da26ec010490601 ] |
1 2 3 4 |
{r echo=FALSE}<br> library(ggplot2)<br> df < ;- read.table("Caenorhabditis_elegans.WBcel235.79.gtf.gz",skip=5,sep="\t",nrows=1000)<br> names(df) = c("chr","source","feature","start","end","score","strand","frame","attribute")<br> |
1 |
Remarquez la présence de l'option
1 |
echo=FALSE |
entre les accolades qui permet d'indiquer à knitr de ne pas afficher les lignes de code dans le document final.
Trois commandes sont présentes dans ce chunk, la première permet de charger la bibliothèque ggplot2 qui va s'occuper de générer nos beaux graphiques, la seconde permet d'importer notre fichier d'annotation dans un Dataframe (nom donné à un tableau à double entrée dans R) en se limitant aux 1000 premières lignes car on n'a pas toute la nuit ! Enfin, la troisième commande permet de définir le nom des colonnes du Dataframe.
Maintenant ces initialisations faites, nous allons pouvoir démarrer notre analyse ! Il est important de noter que même si les chunks sont physiquement séparés les uns des autres, ils sont en fait exécutés les uns à la suite des autres dans une même session R. Cela signifie que les variables déclarées dans un chunk (comme ici
1 |
df |
), sont utilisables dans tout le reste du document.
Nous pouvons maintenant intégrer un premier graphique sur la fréquence des différents types d'annotations (gène, exon, transcrit) :
1 2 |
# Analyse des annotations du C. elegans<br> [crayon-6704997da26f7232824781 ] |
1 2 |
{r echo=FALSE}<br> ggplot(df,aes(df$feature)) + geom_bar() + ggtitle("Fréquence des annotations")<br> |
1 |
Si vous souhaitez en savoir plus sur ggplot, leur site web déborde d'exemples.
À la suite de ce graphique nous allons intégrer un tableau formaté correspondant à un extrait des annotations contenues dans notre Dataframe :
1 |
[crayon-6704997da2702995318466 ] |
1 2 |
{r echo=FALSE, results='asis'}<br> knitr::kable(head(df[,1 :5]),caption="Aperçu des annotations")<br> |
1 |
Afin de générer notre tableau nous avons utilisé la fonction
1 |
kable |
du package knitr qui permet de transformer notre Dataframe en un tableau formaté à la sauce Markdown. Il a également été nécessaire d'ajouter l'option
1 |
results='asis' |
pour spécifier à Rmarkdown de n'appliquer aucun post-traitement sur le résultat produit par ce chunk.
Enfin nous allons finir cette belle analyse avec une petite mesure de corrélation (avec la méthode de Pearson) entre les positions de début et de fin des annotations, qui, comme on pourrait l'attendre est très bonne.
1 |
La corrélation de Pearson réalisée sur les positions (début, fin) des annotations est de [crayon-6704997da270c502141652 ]r cor(df$start,df$end,method="pearson") |
Maintenant, il ne nous reste plus qu'à générer le document final à l'aide de la commande
1 |
rmarkdown::render("my-first-report.Rmd") |
et d'admirer le résultat !
Pour ceux qui travaillent sous RStudio un bouton "knit PDF" est directement intégré à l'interface graphique.
Conclusion
Si vous êtes arrivés vivants jusqu'ici, vous avez maintenant toutes les cartes en main pour créer de magnifiques rapports d'analyses reproductibles. Si vous souhaitez en savoir plus, un site regroupant plein de ressources a été mis en place par/pour la communauté. Vous y apprendrez entre autres à écrire des chunks réutilisables, à intégrer des citations et à générer des rapports HTML interactifs.
Pour ceux qui souhaitent aller plus loin, un MOOC (cours en ligne) sur le thème de la "Recherche reproductible" et se basant sur Rmarkdown vient de commencer sur Coursera (jusqu'au 1er juin). Ce cours est dispensé par l'université de Johns Hopkins et devrait vous permettre d'approfondir le sujet avec un cours de grande qualité.
Ressources
- Syntaxe Markdown : http://daringfireball.net/projects/markdown/syntax
- Ressources Rmarkdown : http://rmarkdown.rstudio.com/
- Article sur la reproductibilité des analyses : http://galahad.well.ox.ac.uk/repro/
- Antisèche Rmarkdown : http://www.rstudio.com/wp-content/uploads/2015/02/rmarkdown-cheatsheet.pdf
Un grand merci à toute l'équipe de Bioinfo-fr et en particulier à nahoy, hedjour, Yoann, m4rsu, Nico M. et Nolwenn pour leur relecture, leurs conseils et leur aide pour la publication de mon premier article sur Bioinfo-fr.
Laisser un commentaire