{"id":564,"date":"2011-11-08T15:56:39","date_gmt":"2011-11-08T14:56:39","guid":{"rendered":"https:\/\/abcdr.guyader.pro\/?p=564"},"modified":"2018-04-07T23:59:10","modified_gmt":"2018-04-07T22:59:10","slug":"estimer-les-parametres-dun-modele-dequations-differentielles-ordinaires-par-les-moindres-carres","status":"publish","type":"post","link":"https:\/\/thinkr.fr\/abcdr\/estimer-les-parametres-dun-modele-dequations-differentielles-ordinaires-par-les-moindres-carres\/","title":{"rendered":"Comment estimer les param\u00e8tres d&#039;un mod\u00e8le d&#039;\u00e9quations diff\u00e9rentielles ordinaires par les moindres carr\u00e9s avec R ?"},"content":{"rendered":"<p>De nombreux syst\u00e8mes sont mod\u00e9lis\u00e9s par des \u00e9quations diff\u00e9rentielles ordinaires. R peut permettre de r\u00e9soudre certains de ces syst\u00e8mes et aussi d&rsquo;estimer leurs param\u00e8tres.<\/p>\n<p>On prend ici l&rsquo;exemple d&rsquo;un mod\u00e8le \u00e9pid\u00e9miologique temporel SI.<\/p>\n<pre><code><br \/><br \/> #edo SIX<br \/><br \/>library(deSolve) # on utilise deSolve<br \/><br \/>#on d\u00e9finit le syst\u00e8me dans une fonction six ici<br \/><br \/>six&lt;-function(t,x,parms){<br \/>\u00a0\u00a0 \u00a0with( as.list(c(parms,x)),{<br \/><br \/>\u00a0\u00a0 \u00a0rp&lt;-ap*exp(-bp*t)<br \/>\u00a0\u00a0 \u00a0rs&lt;-as*exp(-0.5*(log(t\/gs)\/bs)^2)<br \/>\u00a0\u00a0 \u00a0<br \/>\u00a0\u00a0 \u00a0dI&lt;- (rp*X*S+rs*I*S)<br \/>\u00a0\u00a0 \u00a0dS&lt;- -(rp*X*S+rs*I*S)<br \/><br \/>\u00a0\u00a0 \u00a0res&lt;-c(dI,dS)<br \/>\u00a0\u00a0 \u00a0list(res)})<br \/>}<br \/><br \/>#on d\u00e9finit les param\u00e8tres pour la simulation du syst\u00e8me<br \/><br \/>parms&lt;-c(ap=0.002, bp=0.0084, as=5.9e-7, bs=0.25, gs=1396, X=1, N=1010)<br \/><br \/>#on cr\u00e9e un vecteur pour le temps<br \/>times&lt;-seq(0:3000)<br \/><br \/>#valeurs initiales des variables (ici tous les individus sont sains au d\u00e9but)<br \/><br \/>y&lt;- xstart &lt;-(c(I = 0, S = 1010))<br \/><br \/>#on r\u00e9sout le syst\u00e8me avec la fonction lsoda<br \/><br \/>out&lt;-as.data.frame(lsoda(xstart, times, six, parms))<br \/><br \/># toujours regarder le r\u00e9sultat pour d\u00e9tecter les incoh\u00e9rences<br \/><br \/>plot(out$S~out$time, type=\"l\",col='blue')<br \/>plot(out$I~out$time, type=\"l\",col='green',lwd=3)<br \/><br \/>#on cr\u00e9e un jeu de donn\u00e9es en ajoutant un bruit blanc (gaussien)<br \/><br \/>noisy&lt;-out$I+rnorm(nrow(out),sd=0.15*out$I)<br \/><br \/>plot(noisy)<br \/><br \/>#on ajuste le mod\u00e8le sur ces donn\u00e9es par les moindres carr\u00e9s<br \/># pour cela on utilise la fonction nls, il faut faire attention aux param\u00e8tres initiaux<br \/><br \/>fitnoisy&lt;-nls(noisy~lsoda(xstart,times,six,c(ap=ap, bp=bp, as=as, bs=bs, gs=gs, X=1, N=1010))[,2]<br \/>\u00a0\u00a0 \u00a0 ,start=list(ap=0.002, bp=0.0084, as=5.9e-7, bs=0.25, gs=1000)<br \/>\u00a0\u00a0 \u00a0, control=list(minFactor=1e-20,maxiter=150))<br \/><br \/>summary(fitnoisy)<br \/><br \/># un beau graphique pour visualiser tout \u00e7a!<br \/><br \/>plot(noisy,pch=20,col='grey',main=\"SIX ode Model Fit\",xlab=\"time\",ylab=\"disease progress\")<br \/>lines(predict(fitnoisy,times),type='l',col='green',lwd=4.5)<br \/><br \/> <br \/><\/code><\/pre>\n<p>Vous pouvez d\u00e9finir diff\u00e9rents syst\u00e8mes d&rsquo;\u00e9quations diff\u00e9rentielles en conservant la m\u00eame structure.<br \/>Enfin pour estimer les param\u00e8tres il est possible d&rsquo;utiliser d&rsquo;autres fonctions et\/ou d&rsquo;autres m\u00e9thodes (vraisemblance par exemple).<br \/>Pour que nls converge il faut donner des valeurs initiales le plus proche possibles des \u00ab\u00a0vraies valeurs\u00a0\u00bb. Je vous conseille donc d&rsquo;essayer de fitter votre syst\u00e8me graphiquement. Si \u00e7a ne marche pas vous pouvez utiliser nls2 avec l&rsquo;algorithme bruteforce&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>De nombreux syst\u00e8mes sont mod\u00e9lis\u00e9s par des \u00e9quations diff\u00e9rentielles ordinaires. R peut permettre de r\u00e9soudre certains de ces syst\u00e8mes et aussi d&rsquo;estimer leurs param\u00e8tres. On prend ici l&rsquo;exemple d&rsquo;un mod\u00e8le \u00e9pid\u00e9miologique temporel SI. #edo SIXlibrary(deSolve) # on utilise deSolve#on d\u00e9finit le syst\u00e8me dans une fonction six icisix&lt;-function(t,x,parms){\u00a0\u00a0 \u00a0with( as.list(c(parms,x)),{\u00a0\u00a0 \u00a0rp&lt;-ap*exp(-bp*t)\u00a0\u00a0 \u00a0rs&lt;-as*exp(-0.5*(log(t\/gs)\/bs)^2)\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0dI&lt;- (rp*X*S+rs*I*S)\u00a0\u00a0 \u00a0dS&lt;- -(rp*X*S+rs*I*S)\u00a0\u00a0 \u00a0res&lt;-c(dI,dS)\u00a0\u00a0 \u00a0list(res)})}#on d\u00e9finit les param\u00e8tres pour la simulation du syst\u00e8meparms&lt;-c(ap=0.002, bp=0.0084, as=5.9e-7, bs=0.25, gs=1396, X=1, N=1010)#on cr\u00e9e un vecteur pour le tempstimes&lt;-seq(0:3000)#valeurs initiales des variables (ici tous les individus sont sains au d\u00e9but)y&lt;- xstart &lt;-(c(I = 0, S = 1010))#on r\u00e9sout le syst\u00e8me avec la fonction lsodaout&lt;-as.data.frame(lsoda(xstart, times, six,<a class=\"more-link\" href=\"https:\/\/thinkr.fr\/abcdr\/estimer-les-parametres-dun-modele-dequations-differentielles-ordinaires-par-les-moindres-carres\/\">Read More &rarr;<\/a><\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","rop_custom_images_group":[],"rop_custom_messages_group":[],"rop_publish_now":"initial","rop_publish_now_accounts":{"twitter_399453572_399453572":""},"rop_publish_now_history":[],"rop_publish_now_status":"pending","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[14],"tags":[],"class_list":{"0":"entry","1":"post","2":"publish","3":"author-melen","4":"post-564","6":"format-standard","7":"category-modelisation"},"acf":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p9O7Sx-96","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/thinkr.fr\/abcdr\/wp-json\/wp\/v2\/posts\/564","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thinkr.fr\/abcdr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thinkr.fr\/abcdr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thinkr.fr\/abcdr\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/thinkr.fr\/abcdr\/wp-json\/wp\/v2\/comments?post=564"}],"version-history":[{"count":2,"href":"https:\/\/thinkr.fr\/abcdr\/wp-json\/wp\/v2\/posts\/564\/revisions"}],"predecessor-version":[{"id":4096,"href":"https:\/\/thinkr.fr\/abcdr\/wp-json\/wp\/v2\/posts\/564\/revisions\/4096"}],"wp:attachment":[{"href":"https:\/\/thinkr.fr\/abcdr\/wp-json\/wp\/v2\/media?parent=564"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thinkr.fr\/abcdr\/wp-json\/wp\/v2\/categories?post=564"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thinkr.fr\/abcdr\/wp-json\/wp\/v2\/tags?post=564"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}