{"id":2309,"date":"2016-06-09T12:00:01","date_gmt":"2016-06-09T16:00:01","guid":{"rendered":"http:\/\/bioinfo.iric.ca\/fr\/?p=2309"},"modified":"2017-04-29T16:58:18","modified_gmt":"2017-04-29T20:58:18","slug":"scipy-et-les-regressions-logistiques","status":"publish","type":"post","link":"https:\/\/bioinfo.iric.ca\/fr\/scipy-et-les-regressions-logistiques\/","title":{"rendered":"SciPy et les r\u00e9gressions logistiques"},"content":{"rendered":"<p>Il arrive souvent que l&rsquo;on veuille voir s&rsquo;il existe une une relation quelconque entre les points d&rsquo;un jeu de donn\u00e9es. Lorsqu&rsquo;il est question de r\u00e9gressions lin\u00e9aires, celles-ci peuvent \u00eatre facilement visualis\u00e9es avec <a href=\"https:\/\/stanford.edu\/~mwaskom\/software\/seaborn\/index.html\">Seaborn<\/a>, une librairie Python visant l&rsquo;exploration et la visualisation plut\u00f4t que l&rsquo;analyse statistique. Quant aux r\u00e9gressions logistiques, <a href=\"http:\/\/docs.scipy.org\/doc\/scipy\/reference\/index.html#\">SciPy<\/a>\u00a0est un bon outil \u00e0 utiliser lorsque nous n&rsquo;avons pas notre propre script d&rsquo;analyse.<\/p>\n<p>Regardons le paquet optimisation &lsquo;optimize&rsquo;<br \/>\n<kbd>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0from scipy.optimize import curve_fit<\/kbd><\/p>\n<p>Partant de jeu de donn\u00e9es de <em>n<\/em>\u00a0paires de variables ind\u00e9pendantes et d\u00e9pendantes\u00a0(x<sub>i<\/sub>,y<sub>i<\/sub>), curve_fit utilise une approche des moindres carr\u00e9s pour ajuster toute fonction <em>f<\/em>.\u00a0Le cas de base ressemblera \u00e0<br \/>\n<code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0scipy.optimize.curve_fit(func, x, y)<br \/>\n<\/code>o\u00f9 <em>x<\/em> et <em>y<\/em> sont des vecteurs de donn\u00e9es, et o\u00f9 <em>func<\/em>\u00a0est une fonction Python retournant l&rsquo;\u00e9quation de la courbe \u00e0 ajuster. Ce dernier argument est tr\u00e8s int\u00e9ressant puisqu&rsquo;il nous donne la libert\u00e9 de d\u00e9finir nous-m\u00eames une fonction mod\u00e8le avec\u00a0<em>m<\/em>\u00a0param\u00e8tres. Curve_fit appelle leastq (une autre m\u00e9thode de scipy.optimize) qui est un <em>wrapper<\/em> autour de l&rsquo;algorithme Levenberg-Marquardt de MINPACK.<\/p>\n<p>Par d\u00e9faut, la m\u00e9thode utilis\u00e9e pour l&rsquo;optimisation est &lsquo;lm&rsquo; (i.e. Levenberg-Marquardt). Celle-ci est g\u00e9n\u00e9ralement la m\u00e9thode la plus efficace, except\u00e9 lorsque <em>m<\/em> &lt; <em>n<\/em>\u00a0et lorsqu&rsquo;il y a des contraintes sur le probl\u00e8me. Dans ces cas, nous devons sp\u00e9cifier la m\u00e9thode \u00e0 utiliser, c&rsquo;est-\u00e0-dire &lsquo;trf&rsquo; ou &lsquo;dogbox&rsquo; (l&rsquo;algorithme Trust Region Reflective et l&rsquo;algorithme dogleg, respectivement).<br \/>\n<code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 scipy.optimize.curve_fit(func, x, y, method='trf')<\/code><\/p>\n<p>Lorsque l&rsquo;on utilise d&rsquo;autres m\u00e9thodes que &lsquo;lm&rsquo;, curve_fit appelle least_square plut\u00f4t que leastq. Cela \u00e9tant dit, les arguments propres \u00e0 leastq et \u00e0 least_square peuvent tous \u00eatre utilis\u00e9s par curve_fit et ce, m\u00eame si ceux-ci ne figurent pas dans la documentation de curve_fit. En d&rsquo;autres mots, de nombreuses fonctionnalit\u00e9s peuvent \u00eatre trouv\u00e9es dans la documentation de leastq ainsi que dans celle de least_square.<\/p>\n<p>Scipy.optimize.curve_fit(func, x, y) retourne un vecteur de valeurs estim\u00e9es et optimales pour chacun des param\u00e8tres, ainsi qu&rsquo;une matrice (vecteur 2D) de covariance des param\u00e8tres estim\u00e9s. Nous pouvons facilement tracer notre courbe ajust\u00e9e avec ces valeurs.<\/p>\n<p>La courbe r\u00e9sultante pourrait ne pas \u00eatre exactement ce \u00e0 quoi nous nous attendions. Avant de conclure quoi que ce soit, regardons quelques arguments de curve_fit:<\/p>\n<ul>\n<li><strong>f = func<\/strong> : il est important de s&rsquo;assurer que notre \u00e9quation mod\u00e8le est bien \u00e9crite; l&rsquo;ajout ou le retrait de parenth\u00e8ses peut g\u00e9n\u00e9rer une toute nouvelle \u00e9quation!<\/li>\n<li><strong>p0 = <div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 hundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-overflow:visible;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-one-full fusion-column-first fusion-column-last fusion-column-no-min-height\" style=\"--awb-bg-size:cover;--awb-margin-bottom:0px;\"><div class=\"fusion-column-wrapper fusion-flex-column-wrapper-legacy\">[&#8230;]<\/strong> : par d\u00e9faut, les estimations des param\u00e8tres initiaux sont toutes \u00e9gales \u00e0 1. Ces inf\u00e9rences peuvent tr\u00e8s bien \u00eatre \u00e9loign\u00e9es des valeurs r\u00e9elles, ce qui m\u00e8nerait l&rsquo;algorithme \u00e0 converger vers de fausses valeurs optimales. Nous pouvons nous-m\u00eames faire l&rsquo;initialisation des param\u00e8tres et ainsi essayer d&rsquo;\u00e9viter ce probl\u00e8me (notons que nos hypoth\u00e8ses pourraient elles aussi \u00eatre fausses).<\/li>\n<li><strong>Dfun = dfunc<\/strong> : par d\u00e9faut, le Jacobien de notre fonction est estim\u00e9 pas MINPACK. Il est possible de le d\u00e9finir nous-m\u00eames, de fa\u00e7on similaire \u00e0 notre\u00a0<em>func<\/em>. Lorsque le jeu de donn\u00e9es est &lsquo;bon&rsquo;, les courbes &lsquo;estimation&rsquo; et &lsquo;d\u00e9riv\u00e9&rsquo; semblent se comporter de fa\u00e7on similaire (Fig. 1). Cependant, lorsque le jeu de donn\u00e9es est &lsquo;mauvais&rsquo;, les r\u00e9sultats sont tr\u00e8s diff\u00e9rents (Fig. 2).<\/li>\n<\/ul>\n<div id=\"attachment_2329\" style=\"width: 592px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/good.png\"><img decoding=\"async\" aria-describedby=\"caption-attachment-2329\" class=\"wp-image-2329\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/good.png\" alt=\"good\" width=\"582\" height=\"208\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/good-300x107.png 300w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/good-768x274.png 768w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/good-1024x366.png 1024w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/good.png 1316w\" sizes=\"(max-width: 582px) 100vw, 582px\" \/><\/a><p id=\"caption-attachment-2329\" class=\"wp-caption-text\">Figure 1. R\u00e9gression logistique sur les donn\u00e9es de NCI-60 (180973_Leukemia_CCRF-CEM) pour ajuster une courbe dose-r\u00e9ponse. Les lignes pointill\u00e9es montrent le point d&rsquo;inflexion, tel que calcul\u00e9 par SciPy.optimize.curve_fit. Sa valeur est repr\u00e9sent\u00e9e dans le titre du graphique. Courbe noire: courbe d&rsquo;ajustement bas\u00e9e sur l&rsquo;estimation du Jacobien (par d\u00e9faut). Courbe bleue: courbe d&rsquo;ajustement bas\u00e9e sur le calcul du Jacobien (Dfun = dfunc). Courbes similaires lorsque les donn\u00e9es sont &lsquo;bonnes&rsquo;.<\/p><\/div>\n<div id=\"attachment_2328\" style=\"width: 596px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/bad.png\"><img decoding=\"async\" aria-describedby=\"caption-attachment-2328\" class=\"wp-image-2328\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/bad.png\" alt=\"bad\" width=\"586\" height=\"213\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/bad-300x109.png 300w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/bad-768x279.png 768w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/bad-1024x372.png 1024w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/06\/bad.png 1315w\" sizes=\"(max-width: 586px) 100vw, 586px\" \/><\/a><p id=\"caption-attachment-2328\" class=\"wp-caption-text\">Figure 2. R\u00e9gression logistique sur les donn\u00e9es de NCI-60 (180973_Leukemia_CCRF-CEM) pour ajuster une courbe dose-r\u00e9ponse. Les lignes pointill\u00e9es montrent le point d&rsquo;inflexion, tel que calcul\u00e9 par SciPy.optimize.curve_fit. Sa valeur est repr\u00e9sent\u00e9e dans le titre du graphique. Courbe noire: courbe d&rsquo;ajustement bas\u00e9e sur l&rsquo;estimation du Jacobien (par d\u00e9faut). Courbe bleue: courbe d&rsquo;ajustement bas\u00e9e sur le calcul du Jacobien (Dfun = dfunc). Courbes diff\u00e9rentes lorsque les donn\u00e9es sont &lsquo;mauvaises&rsquo;.<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>SciPy est un bon outil lorsqu&rsquo;il est question de r\u00e9gressions logistiques. Cependant, nous devrions tester diff\u00e9rentes approches avant de tirer quelconque conclusion. Par exemple, nous pourrions comparer les moindres carr\u00e9s de &lsquo;estimation&rsquo; et de &lsquo;d\u00e9riv\u00e9&rsquo; pour voir quel est le meilleur ou si leurs r\u00e9sultats sont \u00e9quivalents. Nous pourrions \u00e9galement regarder les intervalles de confiance de chaque param\u00e8tre selon en appliquant une strat\u00e9gie de <em>bootstrap<\/em>.<div class=\"fusion-clearfix\"><\/div><\/div><\/div><\/div><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il arrive souvent que l&rsquo;on veuille voir s&rsquo;il existe une une relation quelconque entre les points d&rsquo;un jeu de donn\u00e9es. Lorsqu&rsquo;il est question de r\u00e9gressions lin\u00e9aires, celles-ci peuvent \u00eatre facilement visualis\u00e9es avec Seaborn, une librairie Python visant l&rsquo;exploration et la visualisation plut\u00f4t que l&rsquo;analyse statistique. Quant aux r\u00e9gressions logistiques, SciPy\u00a0est un bon outil \u00e0 utiliser lorsque nous n&rsquo;avons pas notre propre script d&rsquo;analyse. Regardons le paquet optimisation &lsquo;optimize&rsquo; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0from <a href=\"https:\/\/bioinfo.iric.ca\/fr\/scipy-et-les-regressions-logistiques\/\"> [&#8230;]<\/a><\/p>\n","protected":false},"author":11,"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":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[69,26],"tags":[132,146,81,147],"class_list":["post-2309","post","type-post","status-publish","format-standard","hentry","category-analyse-de-donnees","category-langage-python","tag-ajustement-de-courbe","tag-criblage","tag-python","tag-scipy"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/2309","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\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/comments?post=2309"}],"version-history":[{"count":16,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/2309\/revisions"}],"predecessor-version":[{"id":2705,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/2309\/revisions\/2705"}],"wp:attachment":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media?parent=2309"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/categories?post=2309"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/tags?post=2309"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}