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) :
C | Fortran | Julia | Python | Matlab | R | Javascript | |
---|---|---|---|---|---|---|---|
quicksort | 1.00 | 1.65 | 1.37 | 69.20 | 133.46 | 708.76 | 4.95 |
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 > |
Merci à bilouweb et Yoann M. pour leur relecture.
Yohann Nédélec
octobre 24, 2013 à 2:04
Merci pour cet article, je ne connaissais pas Julia.
La syntaxe est très jolie dans ton premier exemple.
Par contre pour le plot, ça a l'air inutilement lourd.
Le top serait que Hadley Wickham s'intéresse au language et adapte ggplot2.
Ahmadou Dicko
octobre 24, 2013 à 10:09
Je pense que beaucoup d'utilisateurs de R sont intrigués par Julia et certains sont même devenu des cores developpeurs de Julia (John Myles White, Douglas Bates, etc.).
Hadley Wickham pour l'instant ne semble pas trop s'y intéresser et je suis content qu'il continue d'ailleurs à concentrer ses efforts pour rendre R meilleur (regarde par exemple ce qu'il fait actuellement avec dplyr - https://github.com/hadley/dplyr).
Par contre si tu aimes ggplot2, il existe un package Julia appelé Gadfly qui est largement inspiré de la grammaire des graphiques de Wilkinson et de ggplot2. (https://github.com/dcjones/Gadfly.jl)
Je crois qu'une raison qui fait que beaucoup d'utilisateur de R (dont moi) ont Julia installé sur leur machine, c'est le potentiel de Julia. Mais R à trop de packages utiles et par exemple Rcpp est une bonne raison de rester sur R surtout pour ceux qui cherchent des superbes perf avec R.
Julien Delafontaine
octobre 24, 2013 à 11:04
Oui, j'ai essayé Gadfly au début, mais je n'arrivais pas à produire le plot dans une fenêtre X11 et je suis passé à Winston pour lequel j'avais trouvé un exemple. Finalement je n'ai pas réussi dans Winston non plus (mais pas essayé longtemps). C'est là qu'on voit que ça dépend beaucoup de la doc et de la capacité de la librairie à répondre intuitivement.
C'est sûrement très facile, quelqu'un sait comment?
Arthur Flam
octobre 24, 2013 à 12:01
Vivement que Julia soit aussi fourni que R !
La syntaxe de R est un vrai patchwork. Il faut tant et tant de complications pour avoir de bonnes performances...
Vitesse, RAM, manipulation, calcul distribué : très vite tout demande la connaissance d'un package spécifique et relativement bas niveau. Au moins les graphes sont beaux (jetez un oeil à BigVis, aussi de Hadley W !) et il est aisé d'exporter des graphes/présentations en HTML5/JS/CSS (rCharts, slidify...).
Je suis très curieux de la suite tant il y a d'efforts sur R et tant le travail sur Julia est de qualité.
Pour info, les pythonistes peuvent profiter de Julia depuis Python (et inversement) sans peine, c'est idéal pour démarrer 🙂
Somewhere else, part 85 | Freakonometrics
octobre 27, 2013 à 3:00
[…] le successeur de R ?” http://bioinfo-fr.net/julia… via @NerosTie sur le blog de […]
Aurelou
octobre 28, 2013 à 1:47
De la balle ! A quand un tuto Julia pour débutant pressé ?
Nisaea
octobre 30, 2013 à 11:49
Oooh ça a l'air prometteur! R me filant encore et toujours des boutons, j'espère que Julia sera une alternative moins allergène! 🙂
Madjid
novembre 2, 2013 à 8:27
Hâte de voir une version release.
Combiner une syntaxe naturelle, des structures de données adaptées et des performances proches des langages bas niveau donnerait un nouveau souffle au développement d'applications en bio informatique. Plus besoin de jongler en Python, R et C/C++ ou Java.
manjakab
mars 10, 2014 à 4:20
Bah oui bien sûr, il faudra jongler entre Python, R, C/C++, Java, Perl... et Julia en plus !
Julien Delafontaine
mars 10, 2014 à 4:35
Seulement avec ce qui est déjà fait, tant que c'est pas encore refait.
Si on jongle c'est parce que
- C est plus rapide (Julia=C)
- Python est plus lisible (Julia=Python)
- R sait travailler avec des tables et faire des stats (Julia=R)
- Perl est plus ... ??
- Java j'ai jamais compris et jamais eu besoin.
Alors pourquoi jongler ensuite?
manjakab
mars 10, 2014 à 5:02
"A vrai dire, les développeurs n'entendent pas vraiment remplacer R ou Matlab", ce qui suggère qu'il faudra tout de même jongler.
Sinon pour Perl : on peut le citer pour sa simplicité, et pour Java : indispensable à l'analyse d'image à mon sens, cependant ce n'est pas le sujet.
Julien Delafontaine
mars 10, 2014 à 5:11
Ils disent qu'ils n'ont pas comme but de remplacer tel ou tel langage, mais de creer le langage generique ultime.
"Each one is a trade-off. We are greedy: we want more. [...] "
http://julialang.org/blog/2012/02/why-we-created-julia/
zoulk
février 15, 2014 à 3:34
Merci pour les exemples. je débarque en R!...
Je lis qu'il existe Sweave() pour des édition Latex
Une liaison JULIA-LATEX pour l'édition?
Julien Delafontaine
février 16, 2014 à 12:18
On trouve ça dans le forum :
https://groups.google.com/forum/?fromgroups=#!searchin/julia-users/latex/julia-users/ggJo1ZaqicI/BPaBgnp9nXIJ
Sinon peut-être avec IJulia.
Julia: le successeur de R ? | bioinformatique |...
avril 8, 2014 à 7:54
[…] Logo du langage Julia. Source: http://julialang.org/ Actuellement le langage R est incontournable pour qui veut manipuler des données en bioinformatique, en particulier pour l'analyse statistique. […]
Julia | Pearltrees
mai 25, 2014 à 1:09
[…] Julia: le successeur de R ? […]
Pierre-Louis Tharaux
octobre 28, 2014 à 10:52
Merci de cet article. Connaissez vous Goby? http://campagnelab.org/software/goby/
Extra
BFR
juin 15, 2015 à 5:44
Très intéressant, mais je doute quand même que Julia prenne rapidement la place de R. Surtout qu'il faut faire attention avec les faiblesses qui sont souvent imputées à R. Souvent, les problèmes de vitesse sont simplement causés par de la mauvaise programmation (voir par exemple: http://predictiveecology.org/2015/04/28/Is-R-fast-enough-02.html). R a tellement une fondation solide d'utilisateurs, de packages, de forums et de tutoriels sur internet qu'il va être difficile à déloger.
Le langage JULIA – SMARTFUL : le blog
avril 30, 2016 à 2:43
[…] Comparaison avec R […]