Actuellement le langage R est incontournable pour qui veut manipuler des données en bioinformatique, en particulier pour l'analyse statistique. Mais un successeur est en passe de s'imposer : Julia, combinant puissance du langage avec les fonctionnalités de R, et comblant les nombreux défauts de ce dernier — mais plus encore ! Voici une présentation de ce tout nouveau langage.
À l'origine
La principale raison du succès de R est le système de "packages" qui a permis à chaque labo d'écrire et de rendre facilement récupérable le code qui résout son problème particulier. Aujourd'hui c'est la grande force de R : vous avez un problème ? Quelqu'un l'a déjà résolu, téléchargez le package, écrivez trois lignes et appuyez sur le bouton : c'est fait. Le type "data frame" pour manipuler les tableaux de données est également très apprécié.
Bien sûr il arrive que vous ayez un nouveau problème, ou que vous souhaitiez écrire votre propre programme. Si, à l'usure, on arrive à peu près toujours à ce qu'on veut, on est quand même obligé de remarquer que le langage souffre de nombreux défauts : sa documentation déplorable, sa lenteur, sa syntaxe lourde, la difficulté à débuguer, les fonctions redondantes, etc. Mais énumérons les alternatives :
- SAS, S+, Matlab, etc. sont payants et donc pas bien adaptés au monde académique.
- Scipy, librairie de Python, est pas mal mais n'est pas aussi complète et pose souvent des problèmes d'installation.
- Qui a osé dire Excel ?…
- Julia ?
Qu'est-ce que Julia ?
Julia est un langage de programmation écrit en C par Jeff Bezanson, Stefan Karpinski, Viral Shah et Alan Edelman. Il est gratuit et open source, inspiré de la syntaxe et des fonctionnalités de Python/Ruby, mais qui vise le même champ d'applications que R : la manipulation de données et les analyses statistiques.
Tout en reprenant des avantages de l'un et de l'autre, il est presque aussi rapide que C lui-même — Python est des dizaines de fois plus lent, R des centaines. En effet, Julia est un langage compilé ce qui lui permet d'être très rapide. Mais pour garder la flexibilité du typage dynamique, il est compilé "Just In Time". Par exemple, pour trier une liste (relativement à C ; exemple tiré de la page d'accueil) :
[table],C,Fortran,Julia,Python,Matlab,R,Javascriptquicksort,1.00,1.65,1.37,69.20,133.46,708.76,4.95
[/table]
Du langage R, il reprend le type "data frame" pour les données tabulées (le package "DataFrames"), les facilités à produire des graphes ("Cairo", "Winston" ou "Gadfly"), et tout ce qui a trait aux statistiques (comme les "Distributions"). De Python/Ruby, il reprend l'élégance de la syntaxe, la compréhension de liste, la notation vectorielle, les itérateurs, etc. Les développeurs s'attèlent maintenant à reproduire un maximum de packages statistiques, en particulier pour les GLM et les MCMC.
A vrai dire, les développeurs n'entendent pas vraiment remplacer R ou Matlab, mais seulement créer le langage ultime de l'analyse de données. Quelques citations traduites de la page "Pourquoi nous avons créé Julia" :
Nous voulons un langage open-source, avec une licence libre. Nous voulons la vitesse de C avec le dynamisme de Ruby. […] Nous voulons un langage pour un usage aussi général que Python, aussi facile pour les stats que R, aussi naturel que Perl pour le parsing, aussi puissant que Matlab pour l'algèbre linéaire, aussi bon que le shell à chaîner des programmes. Quelque chose de simple à apprendre mais qui rendra quand même les hackers heureux. Nous le voulons interactif et nous le voulons compilé. […] Malgré toute sa puissance, nous voulons un langage simple et propre.
Voici un exemple de code en Julia (exercice : trouvez à quoi il sert) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function hypot(x,y) # Commentaire x = abs(x) y = abs(y) if x > y r = y/x return x*sqrt(1+r*r) end if y == 0 return zero(x) end r = x/y return y*sqrt(1+r*r) end |
Ajoutons encore que les développeurs sont très actifs et à l'écoute, j'en veux pour preuve que suite à ma requête concernant l'incompatibilité avec OSX 10.6, j'ai reçu un mail immédiatement me disant que quelqu'un s'y colle… et un installeur compatible deux heures plus tard.
Un exemple d'application en bioinfo
Nous allons créer un MA-plot à partir de données RNA-seq : l'expression de gènes dans deux conditions. On suppose que vous avez réussi à installer Julia et à le lancer en ligne de commande (en principe, en tapant "julia" dans votre console). Ce script a été testé sous OSX Lion.
Tout d'abord voici un fichier de test. Mais tout autre fichier contenant 2 colonnes de nombres séparées par des tabulations fera l'affaire. Ensuite on va installer les packages nécessaires : DataFrames et Winston, comme suit :
1 2 |
Pkg.add("DataFrames") Pkg.add("Winston") |
Il est possible que l'installeur vous demande de faire d'abord de même avec certaines dépendances, comme "Homebrew" ou "Cairo". Une fois les packages installés, ce n'est bien sûr plus nécessaire par la suite. Par contre il faut les importer au début de vos scripts les utilisant :
1 2 |
using DataFrames using Winston |
On va se servir de la fonction "readtable" de DataFrames pour lire et parser le fichier, en indiquant que le séparateur est une tabulation et que la première ligne ne doit pas faire partie des données — mais sera utilisée pour nommer les colonnes, qui seront alors accessibles par ce nom :
1 |
df = readtable("genes_expression.txt", separator='\t', header=true) |
Pour voir ce qu'il y a dedans, on visionne juste les premières lignes avec "head" :
1 |
head(df) |
qui devrait afficher quelque chose comme ça :
1 2 3 4 5 6 7 8 |
6x3 DataFrame : counts.KO.1 counts.WT.1 GeneName [1,] 16 12 "Gm6152" [2,] 2382 1417 "Gm11605" [3,] 0 2 "Abca12" [4,] 7068 6135 "Degs1" [5,] 5 2 "Nckap5" [6,] 243 161 "Ankrd39" |
Ensuite on va produire un vecteur de ratios et un vecteur de moyennes (géométriques) à partir des colonnes :
1 2 |
ratios = df[1]./df[2] means = (df[1].*df[2]).^(1/2) |
Notez le "." devant les opérations, pour indiquer que l'opération se fait terme par terme entre les vecteurs (contrairement au simple * par exemple qui serait un produit scalaire).
Finalement on va initialiser le graphe, y coller nos points, et rajouter quelques options comme les labels des axes, le titre et l'intervalle couvert par chacun des axes :
1 2 3 4 5 6 7 8 9 |
p = FramedPlot() add(p, Points( log10(means), log2(ratios), "type", "dot" )) setattr(p, "title", "MA-plot") setattr(p, "xlabel", "\\Means") setattr(p, "ylabel", "\\Ratios") setattr(p, "aspect_ratio", 0.75 ) setattr(p.x1, "range", (-1,6) ) setattr(p.y1, "range", (-6,6) ) file(p, "maplot.png") |
Et voilà le fabuleux résultat :
Conclusion
Pour le moment, Julia est encore en développement, même s'il est utilisable — et utilisé — et se rapproche de sa première sortie officielle. On peut suivre son évolution sur son blog et ses forums , ou simplement le télécharger et essayer !
Qu'à terme il s'impose dépendra du nombre de développeurs s'impliquant dans la création de packages statistiques, de la facilité de codage/débugage et de la documentation.
Et vous, déjà convaincus ?
Site officiel : http://julialang.org/
1 2 3 4 5 6 7 8 9 10 11 |
$ julia _ _ _ _(_)_ | A fresh approach to technical computing (_) | (_) (_) | Documentation : http ://docs.julialang.org _ _ _| |_ __ _ | Type "help()" to list help topics | | | | | | |/ _` | | | | |_| | | | (_| | | Version 0.2.0-prerelease+4033 _/ |\__'_|_|_|\__'_| | Commit 808f3ad 2013-10-13 19 :33 :09 UTC |__/ | x86_64-apple-darwin12.5.0 > ; |
Laisser un commentaire