{"id":438,"date":"2015-06-22T10:47:37","date_gmt":"2015-06-22T08:47:37","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=438"},"modified":"2026-04-02T14:08:44","modified_gmt":"2026-04-02T12:08:44","slug":"regression-loess","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/regression-loess\/","title":{"rendered":"R\u00e9gression loess"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Regression_loess\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<p>La r\u00e9gression loess (ou \u00ab\u00a0lowess\u00a0\u00bb) est une m\u00e9thode de r\u00e9gression non-param\u00e9trique (c&rsquo;est-\u00e0-dire qu&rsquo;elle n&rsquo;est pas associ\u00e9e \u00e0 une \u00e9quation, comme par exemple une r\u00e9gression lin\u00e9aire ou polynomiale classique). Elle permet de produire des courbes liss\u00e9es, ajust\u00e9es \u00e0 un nuage de point, un peu comme ici, par exemple:<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Regression_loess\/illustration_loess-1.png\" alt=\"\" \/><\/p>\n<h2>Mise en oeuvre<\/h2>\n<p>Consid\u00e9rons le jeu de donn\u00e9es <a href=\"..\/..\/lise.vaudor\/Rdata\/Regression_loess\/data.csv\">data.csv<\/a>:<\/p>\n<pre><code>data=read.table(paste(dat.path,\"data.csv\",sep=\"\"),sep=\";\",header=T)\nattach(data)\n<\/code><\/pre>\n<p>Pour ajuster une r\u00e9gression loess, rien de plus simple&#8230; Il suffit de faire appel \u00e0 la fonction &#8230; <code>loess<\/code>.<\/p>\n<pre><code>mod=loess(y~x)\nprint(mod)\n\n## Call:\n## loess(formula = y ~ x)\n## \n## Number of Observations: 40 \n## Equivalent Number of Parameters: 4.4 \n## Residual Standard Error: 9.486\n<\/code><\/pre>\n<p>On r\u00e9cup\u00e8re les coordonn\u00e9es des points de la courbe de la mani\u00e8re suivante:<\/p>\n<pre><code>yfit=predict(mod, newdata=x)\n<\/code><\/pre>\n<p>On peut alors repr\u00e9senter le nuage de points et la courbe loess:<\/p>\n<pre><code>plot(x,y)\nlines(x,yfit, col=\"blue\",lty=3, lwd=2)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Regression_loess\/nuage_de_points_et_courbe_loess-1.png\" alt=\"\" \/><\/p>\n<p>En modifiant le param\u00e8tre <code>span<\/code> de la fonction loess, on peut produire des courbes plus ou moins liss\u00e9es:<\/p>\n<pre><code>mod1=loess(y~x,span=0.3)\nmod2=loess(y~x,span=0.75)\nmod3=loess(y~x,span=2)\n\nxfit=seq(from=min(x),to=max(x),length.out=100)\nyfit1=predict(mod1,newdata=xfit)\nyfit2=predict(mod2,newdata=xfit)\nyfit3=predict(mod3,newdata=xfit)\nplot(x,y)\npoints(xfit,yfit1,type=\"l\",lwd=2,col=\"red\")\npoints(xfit,yfit2,type=\"l\",lwd=2,col=\"blue\")\npoints(xfit,yfit3,type=\"l\",lwd=2,col=\"forestgreen\")\nlegend(\"topleft\",c(paste(\"span=\",c(0.3,0.75,2))), lwd=2,lty=1, col=c(\"red\",\"blue\",\"forestgreen\"))\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Regression_loess\/loess_span-1.png\" alt=\"\" \/><\/p>\n<h2>Principe<video controls loop autoplay><source src=\"..\/..\/lise.vaudor\/Rfigures\/Regression_loess\/loess_process-.webm\" \/>video of chunk loess_process<\/video><\/h2>\n<p>Dans une r\u00e9gression loess, l&rsquo;ajustement de la courbe se fait <strong>localement<\/strong>. Pour d\u00e9terminer la valeur y que prend la courbe au point d&rsquo;abscisse <em>x<\/em><sub><em>i<\/em><\/sub>, on <strong>ajuste un polyn\u00f4me de degr\u00e9 1 ou 2<\/strong> aux points au <strong>voisinage<\/strong> de <em>x<\/em><sub><em>i<\/em><\/sub>. Cet ajustement se fait avec <strong>pond\u00e9ration<\/strong>: les points les plus proches de <em>x<\/em><sub><em>i<\/em><\/sub> ont davantage de poids dans l&rsquo;ajustement.<\/p>\n<p><strong>Voisinage:<\/strong><\/p>\n<p>La taille du voisinage est d\u00e9termin\u00e9e par un param\u00e8tre <em>\u03b1<\/em>. Quand <code>$latex \\alpha &lt; 1$<\/code>, le voisinage inclut une proportion <em>\u03b1<\/em> des points du jeu de donn\u00e9es.<\/p>\n<p>Les points dans le voisinage d&rsquo;un <em>x<\/em><sub><em>i<\/em><\/sub> donn\u00e9 sont repr\u00e9sent\u00e9s en rouge dans l&rsquo;animation ci-dessus. La fonction <code>loess<\/code> appelle ce param\u00e8tre <em>\u03b1<\/em> <code>span<\/code>, et par d\u00e9faut <code>span=0.75<\/code>.<\/p>\n<p>Quand <em>\u03b1<\/em>\u2004\u2265\u20041, tous les points sont utilis\u00e9s. L&rsquo;ajustement ne d\u00e9pend alors plus de <em>\u03b1<\/em> \u00e0 travers la d\u00e9termination du voisinage. En revanche <em>\u03b1<\/em> joue toujours sur le calcul des poids (cf ci-apr\u00e8s).<\/p>\n<p><strong>Pond\u00e9ration:<\/strong><\/p>\n<p>Le poids <em>\u03c1<\/em> d&rsquo;un point d&rsquo;abscisse <em>x<\/em><sub><em>j<\/em><\/sub> au voisinage de <em>x<\/em><sub><em>i<\/em><\/sub> est d&rsquo;autant plus important que sa distance <code><span class=\"katex-eq\" data-katex-display=\"false\"> d_{ij}<\/span><\/code> \u00e0 <code><span class=\"katex-eq\" data-katex-display=\"false\"> x_i<\/span><\/code> est petite.<\/p>\n<p><code><span class=\"katex-eq\" data-katex-display=\"false\">\n\n\\rho=(1-(\\frac{d_{ij}}{d_{max}})^3)^3\n\n<\/span><\/code><\/p>\n<p>Quand <code><span class=\"katex-eq\" data-katex-display=\"false\"> \\alpha&lt;1<\/span><\/code>,<code><span class=\"katex-eq\" data-katex-display=\"false\">d_{max}<\/span><\/code> est la distance maximale (en x) s\u00e9parant deux points du voisinage consid\u00e9r\u00e9. La taille des points rouges dans l&rsquo;animation ci-dessus est proportionnelle \u00e0 leur poids.<\/p>\n<p>Quand <code><span class=\"katex-eq\" data-katex-display=\"false\"> \\alpha \\geq 1<\/span><\/code>, <code><span class=\"katex-eq\" data-katex-display=\"false\"> d_{max}<\/span><\/code> est \u00e9gale \u00e0 \u03b1 fois la distance maximale observ\u00e9e (en x) entre deux points du jeu de donn\u00e9es.<\/p>\n<p><strong>Ajustement:<\/strong><\/p>\n<p>Une fois le voisinage et les poids d\u00e9termin\u00e9s, une courbe correspondant \u00e0 un polyn\u00f4me de degr\u00e9 1 ou 2 est ajust\u00e9e pour une s\u00e9rie de valeurs <em>x<\/em><sub><em>i<\/em><\/sub> (ici c&rsquo;est un polyn\u00f4me de degr\u00e9 2, dont la courbe appara\u00eet en rouge dans l&rsquo;animation ci-dessus). La <strong>valeur pr\u00e9dite en ce point <em>x<\/em><sub><em>i<\/em><\/sub> par la r\u00e9gression loess<\/strong> correspond \u00e0 la <strong>valeur pr\u00e9dite par le polyn\u00f4me<\/strong> ajust\u00e9 localement.<\/p>\n<h2>Bandes de confiance autour de la courbe<\/h2>\n<p>Le calcul de la courbe ajust\u00e9e peut-\u00eatre assorti d&rsquo;une mesure de l&rsquo;erreur standard:<\/p>\n<pre><code>xfit=seq(from=min(x),to=max(x),length.out=100)\nprediction=predict(mod,newdata=xfit, se=TRUE)\nyfit=prediction$fit\nyfit_se=prediction$se\nprint(yfit_se[1:5])\n\n## [1] 4.754606 4.354402 3.987376 3.654491 3.356802\n<\/code><\/pre>\n<p>On peut ainsi utiliser cette erreur standard pour calculer une bande de confiance (ici \u00e0 95%):<\/p>\n<pre><code>plot(x,y)\npoints(xfit,yfit, col=\"blue\",type=\"l\", lwd=2)\npoints(xfit,yfit+1.96*yfit_se, col=\"blue\",type=\"l\", lwd=1, lty=2)\npoints(xfit,yfit-1.96*yfit_se, col=\"blue\",type=\"l\", lwd=1, lty=2)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Regression_loess\/loess_confidence-1.png\" alt=\"\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La r\u00e9gression loess (ou \u00ab\u00a0lowess\u00a0\u00bb) est une m\u00e9thode de r\u00e9gression non-param\u00e9trique (c&rsquo;est-\u00e0-dire qu&rsquo;elle n&rsquo;est pas associ\u00e9e \u00e0 une \u00e9quation, comme par exemple une r\u00e9gression lin\u00e9aire ou polynomiale classique). Elle permet de produire des courbes liss\u00e9es, ajust\u00e9es \u00e0 un nuage de point, un peu comme ici, par exemple: Mise en oeuvre Consid\u00e9rons le jeu de donn\u00e9es data.csv: data=read.table(paste(dat.path,\u00a0\u00bbdata.csv\u00a0\u00bb,sep=\u00a0\u00bb\u00a0\u00bb),sep=\u00a0\u00bb;\u00a0\u00bb,header=T) attach(data) Pour ajuster une r\u00e9gression loess, rien de plus simple&#8230; Il suffit de.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/regression-loess\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-438","post","type-post","status-publish","format-standard","hentry","category-tous-les-posts"],"_links":{"self":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/438","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/comments?post=438"}],"version-history":[{"count":51,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/438\/revisions"}],"predecessor-version":[{"id":1536,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/438\/revisions\/1536"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}