Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 4.36 KB | None | 0 0
  1. # Simulation de l'exercice propagation d'épidémie dans la classe.
  2. # auteur VL.
  3. rm(list=ls())
  4.  
  5. library(deSolve)
  6. library(nls2)    # pas obligatoire (on peut utiliser nls au lieu de nls2)
  7.  
  8. # ------------------ DONNEES
  9.   # Chemin du répertoire contenant les fichiers de données :
  10. path = "C:/Users/quent/Desktop/cholera"
  11. setwd(path)                      #Change le répertoire par défaut
  12.  
  13. d <- read.table(paste(path, "/data1_avec_t.txt", sep=""),
  14.                   header=TRUE, sep="\t", na.strings="NA", dec=".")
  15. d
  16. plot(d$t, d$I1, xlab="temps", ylab="Nb infectés")
  17.  
  18. # ------------------ MODELE
  19.   # modélisation par compartiments :
  20.   # V=vecteur d'états, p=vecteur de paramètres
  21. deriv <- function(t,y,p)
  22. {
  23.   with(as.list(c(p, y)), {
  24.     N1 = S1 + I1 + D1 + R1
  25.     dS1 = - beta*S1*I1/N1 - gamma*C/(k+C)*S1
  26.     dI1 = beta*S1*I1/N1 + gamma*C/(k+C)*S1 - nu*I1
  27.     dD1 = l*nu*I1
  28.     dR1 = (1-l)*nu*I1
  29.     dC = eta*gamma*I1/N-d*C
  30.     list(c(dS1,dI1,dD1,dR1,dC))
  31.   })
  32. }
  33.  
  34. # ------------------ SIMULATION
  35.   # test d'une simulation :
  36. N = 550                          # nombre d'élèves
  37. Tmax = max(d$t)                 # temps maximal
  38. par <- list(beta = 0.1, gamma=5e-3, eta = 1, d = 0.00001, k=1e-3, nu=1/15, l=0.2) # vecteurs de paramètres
  39. V <- c(S1=N-1, I1=1, D1=0, R1=0, C=1e-3)              # valeurs initiales du vecteur d'états
  40. comparts <- ode(V, 1:Tmax, deriv, parms=par)
  41. plot(comparts[,"time"], comparts[,"I1"],type="l",xlab="Temps",ylab="Ih(t)", lwd=4, col="red")
  42. plot(comparts[,"time"], comparts[,"C"],type="l",xlab="Temps",ylab="Ih(t)", lwd=4, col="green")
  43.  
  44. # ------------------ ESTIMATION
  45. # Fonction pour l'estimation des paramètres
  46. # Retourne un vecteur I simulé, qui doit être de même taille que celui des données.
  47. model_tofit <- function(beta, gamma, eta, times){
  48.   V <- c(S1=N-1, I1=1, D1=0, R1=0, C=0)
  49.   Fsim <- ode(V, times, deriv, parms=list("beta"=beta, "gamma"=gamma, "eta"=eta, "d"=0, "k"=1e-3, "nu"=1/15, "l"=0.2))
  50.   return(Fsim[,"I1"])  # note : il faut que le vecteur times démarre à 1, sinon le temps initial est incorrect
  51.                       # sinon mettre c(1, times) au lieu de times dans ode et enlever le 1er terme du vecteur renvoyé.
  52. }
  53.  
  54.  
  55.   # estimation des paramètres p :
  56. obs <- d$I1[which(!is.na(d$I1))]
  57. res<-nls2(obs~model_tofit(beta, gamma, eta, T), start=list(beta = 0.1, gamma=1e-3, eta = 0.5), data=list(T=d$t[which(!is.na(d$I1))]), trace=TRUE, nls.control(warnOnly=TRUE), algorithm = "port", lower=c(0,0,0,0,0))
  58.   # data=list() sert pour garder des paramètrse constants
  59.   # warn.only=TRUE permet de stocker le dernier résultat obtenu même si l'algo échoue
  60.   # l'utilisation de l'algo "port" permet de fixer des bornes à l'espace de recherche des paramètres (ici on veut les garder positifs par exemple)
  61.   # nls2 permet de relancer plusieurs fois l'optimisation en partant de différents points initiaux
  62.   # (note : algos brute-force et grid-search ou random-search font seulement des échantillonages de la fonction objectif)
  63.  
  64. summary(res)
  65. plot(d$t[which(!is.na(d$I1))], obs, xlab="Temps",ylab="I1(t)", col="red")
  66. lines(d$t[which(!is.na(d$I1))], fitted(res),lwd=2, col="blue")
  67.  
  68. # # facultatif : prédiction et confiance
  69. # confint(res)  # intervalles de confiance sur les estimées des paramètres
  70. # conf<-predict(as.lm(res), interval="confidence")
  71. # lines(d$t, conf[,"lwr"], col="green")
  72. # lines(d$t, conf[,"upr"], col="green")
  73. # conf<-predict(as.lm(res), interval="prediction")
  74. # lines(d$t, conf[,"lwr"], col="dark green")
  75. # lines(d$t, conf[,"upr"], col="dark green")
  76.  
  77. # ------------------ UTILISATION DES VALEURS ESTIMEES
  78.  
  79.  
  80. model_pred <- function(beta, gamma, eta, times){
  81.   V <- c(S1=N-1, I1=1, D1=0, R1=0, C=0)
  82.   Fsim <- ode(V, times, deriv, parms=list("beta"=beta, "gamma"=gamma, "eta"=eta, "d"=0, "k"=1e-3, "nu"=1/15, "l"=0.2))
  83.   return(Fsim)  # note : il faut que le vecteur times démarre à 1, sinon le temps initial est incorrect
  84.   # sinon mettre c(1, times) au lieu de times dans ode et enlever le 1er terme du vecteur renvoyé.
  85. }
  86.  
  87. beta_estim = coefficients(res)["beta"]
  88. gamma_estim = coefficients(res)["gamma"]
  89. eta_estim = coefficients(res)["gamma"]
  90.   # prédiction :
  91. newTmax=200
  92. pred = model_pred(beta_estim, gamma_estim , eta_estim, 1:newTmax)
  93. plot(1:newTmax, pred[,"I1"], type="l", xlab="Temps",ylab="I1(t)", col="red")
  94. lines(1:newTmax, pred[,"D1"], xlab="Temps",ylab="I1(t)", col="black")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement