{"id":1005,"date":"2015-01-15T14:33:00","date_gmt":"2015-01-15T19:33:00","guid":{"rendered":"http:\/\/bioinfo.iric.ca\/?p=1005"},"modified":"2017-05-01T10:17:05","modified_gmt":"2017-05-01T14:17:05","slug":"une-tache-trois-facons","status":"publish","type":"post","link":"https:\/\/bioinfo.iric.ca\/fr\/une-tache-trois-facons\/","title":{"rendered":"Une t\u00e2che, trois fa\u00e7ons"},"content":{"rendered":"<p>Il y a habituellement plus d&rsquo;une fa\u00e7on d&rsquo;accomplir une t\u00e2che donn\u00e9e. Certaines sont meilleures que d&rsquo;autres, plusieurs sont \u00e9quivalentes. D\u00e9cider laquelle utiliser d\u00e9pend bien souvent du temps de calcul, de la facilit\u00e9 d&rsquo;utilisation et\/ou de nos pr\u00e9f\u00e9rences et comp\u00e9tences personnelles.<\/p>\n<p>Supposons que j&rsquo;aie une matrice contenant des milliers de positions pour un chromosome donn\u00e9 avec les colonnes suivantes : Nom_de_l&rsquo;\u00e9l\u00e9ment, D\u00e9but, Fin. Toutes les positions se rapportent \u00e0 un m\u00eame chromosome et la taille des \u00e9l\u00e9ments est variable. Pour une liste de SNVs donn\u00e9e, je voudrais savoir lesquels chevauchent mes \u00e9l\u00e9ments chromosomiques.<\/p>\n<p>Pour ce faire, je pourrais construire deux fichiers bed\/gtf et utiliser dans ma console la commande <code>intersectBed<\/code> de la suite d&rsquo;outils <a title=\"bedtools\" href=\"http:\/\/bedtools.readthedocs.org\/en\/latest\/\" target=\"_blank\">bedtools<\/a>. Cependant, comme je suis une grande fan de R, c&rsquo;est en R que j&rsquo;ai \u00e9labor\u00e9 mes trois fa\u00e7ons.<\/p>\n<p>1. Les boucles <code>for<\/code> imbriqu\u00e9es<\/p>\n<p>Voici bien souvent le choix du d\u00e9butant. On parcourt tous les SNVs (premi\u00e8re boucle <code>for<\/code>) et on compare chacun \u00e0 tous les \u00e9l\u00e9ments chromosomiques pour voir si l&rsquo;un de ces \u00e9l\u00e9ments chevauchent le SNV. Si au moins un \u00e9l\u00e9ment le chevauche, on retourne <code>true<\/code>. Il n&rsquo;y a rien de mal avec cette m\u00e9thode. Except\u00e9 que R n&rsquo;est pas le champion des boucles imbriqu\u00e9es. Ce sera tr\u00e8s long \u00e0 rouler pour un gros jeu de donn\u00e9es.<br \/>\nC&rsquo;est la solution facile, mais vous deviendrez rapidement impatient si vous avez besoin de visualiser vos r\u00e9sultats rapidement.<\/p>\n<div class=\"R\">\n<pre><code>\r\nfor (i in nrow(snvs)) {\r\nbool <- c()\r\n for (j in nrow(features)){\r\n    b <- snvs[i, \"position\"] > features[j, \"Start\"] & snvs[i, \"position\"] < features[j, \"Stop\"]\t \t \r\n    bool <- c(bool, b)  \t \r\n }\r\n snvs[i,'found'] <- any(bool)\r\n}\r\n<\/code><\/pre>\n<\/div>\n<p>2. L'utilisation de <code>apply<\/code> de <code>apply<\/code><\/p>\n<p>En R, vous pouvez toujours remplacer une boucle <code>for<\/code> par la fonction <code>apply<\/code> qui est beaucoup plus rapide. Pour notre exemple, nous pouvons parcourir les SNVs dans un premier <code>apply<\/code> et faire la comparaison dans un second. Nous avons aussi des <code>apply<\/code> imbriqu\u00e9s. Sur Linux ou Mac, vous pouvez m\u00eame utiliser le <em>package<\/em> <strong>parallel<\/strong> pour rouler sur plusieurs processeurs. Cette solution est beaucoup plus rapide, mais beaucoup moins \u00e9vidente en terme de code \u00e0 \u00e9crire.<\/p>\n<div class=\"R\">\n<pre><code>\r\n\r\ncompare <- function(p, x) {return (x > as.numeric(p['start']) & x < as.numeric(p['end']))}\t \t\r\nsearch <- function(x, features){\t \t\r\n b <- apply(features, 1, compare, x=x)\t \t \r\n return (any(b))\t \t\r\n}\t\r\n \t\r\nrres <- cbind (as.matrix(snvs), found=apply(snvs, 1, search, features=features))\r\n\r\n<\/code><\/pre>\n<\/div>\n<p>3. Le <em>package<\/em> IRanges de Bioconductor<\/p>\n<p>La derni\u00e8re fa\u00e7on de proc\u00e9der que je veux pr\u00e9senter profite du talent et des efforts des autres d\u00e9veloppeurs de la communaut\u00e9 R. Ce n'est pas d\u00e9plaisant de laisser les autres travailler pour nous!<br \/>\nLe <em>package<\/em> <a title=\"IRanges\" href=\"http:\/\/www.bioconductor.org\/packages\/release\/bioc\/html\/IRanges.html\" target=\"_blank\">IRanges<\/a> impl\u00e9mente des fonctions pour manipuler des intervalles g\u00e9nomiques (ou seulement des intervalles). Les fonctions sont relativement simples \u00e0 comprendre et \u00e0 utiliser et elles sont rapides. Donc, avant de r\u00e9inventer la roue, il est utile\u00a0de faire une petite recherche web (google!) pour v\u00e9rifier s'il n'existerait pas d\u00e9j\u00e0 un outil pouvant nous aider.<\/p>\n<div class=\"R\">\n<pre><code>\r\nir = IRanges (start = starts, end=stops)\r\nsr = IRanges (start = snvs, end = snvs)\r\nfindOverlaps(sr, ir)\r\n\r\n\r\n<\/code><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Il y a habituellement plus d&rsquo;une fa\u00e7on d&rsquo;accomplir une t\u00e2che donn\u00e9e. Certaines sont meilleures que d&rsquo;autres, plusieurs sont \u00e9quivalentes. D\u00e9cider laquelle utiliser d\u00e9pend bien souvent du temps de calcul, de la facilit\u00e9 d&rsquo;utilisation et\/ou de nos pr\u00e9f\u00e9rences et comp\u00e9tences personnelles. Supposons que j&rsquo;aie une matrice contenant des milliers de positions pour un chromosome donn\u00e9 avec les colonnes suivantes : Nom_de_l&rsquo;\u00e9l\u00e9ment, D\u00e9but, Fin. Toutes les positions se rapportent \u00e0 un m\u00eame chromosome et la taille des \u00e9l\u00e9ments est variable. Pour une <a href=\"https:\/\/bioinfo.iric.ca\/fr\/une-tache-trois-facons\/\"> [&#8230;]<\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[41,24],"tags":[],"class_list":["post-1005","post","type-post","status-publish","format-standard","hentry","category-bioinformatique","category-langage-r"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/comments?post=1005"}],"version-history":[{"count":13,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1005\/revisions"}],"predecessor-version":[{"id":3328,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1005\/revisions\/3328"}],"wp:attachment":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media?parent=1005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/categories?post=1005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/tags?post=1005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}