SIR model: swine flu

From JSXGraph Wiki
Revision as of 12:36, 26 June 2010 by Bianca (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

The SIR model (see also Epidemiology: The SIR model) tries to predict influenza epidemics. Here, we try to model the spreading of the H1N1 virus, aka swine flu.

  • According to the CDC Centers of Disease Control and Prevention: "Adults shed influenza virus from the day before symptoms begin through 5-10 days after illness onset. However, the amount of virus shed, and presumably infectivity, decreases rapidly by 3-5 days after onset in an experimental human infection model." So, here we set [math]\displaystyle{ \gamma=1/7=0.1428 }[/math] as the recovery rate. This means, on average an infected person sheds the virus for 7 days.
  • In Modeling influenza epidemics and pandemics: insights into the future of swine flu (H1N1) the authors estimate the reproduction rate [math]\displaystyle{ R_0 }[/math] of the virus to be about [math]\displaystyle{ 2 }[/math]. For the SIR model this means: the reproduction rate [math]\displaystyle{ R_0 }[/math] for influenza is equal to the infection rate of the strain ([math]\displaystyle{ \beta }[/math]) multiplied by the duration of the infectious period ([math]\displaystyle{ 1/\gamma }[/math]), i.e.
[math]\displaystyle{ \beta = R_0\cdot \gamma }[/math]. Therefore, we set [math]\displaystyle{ \beta = 2\cdot 1/7 = 0.2857. }[/math] For the 1918–1919 pandemic [math]\displaystyle{ R_0 }[/math] is estimated to be between 2 and 3, whereas for the seasonal flu the range for [math]\displaystyle{ R_0 }[/math] is 0.9 to 2.1.
  • In [1] the mortality is estimated to be approximately 0.4 per cent.
  • We run the simulation for a population of 1 million people, where 1 person is infected initially, i.e. [math]\displaystyle{ s=1E{-6} }[/math]. Thus, S(0) = 1, I(0) = 1.E-6, R(0) = 0.

The lines in the JSXGraph-simulation below have the following meaning:

* Blue: Rate of susceptible population
* Red: Rate of infected population
* Green: Rate of recovered population

External links

The underlying JavaScript code

<html>
<form><input type="button" value="clear and run a simulation of 200 days" onClick="clearturtle();run()">
<input type="button" value="stop" onClick="stop()">
<input type="button" value="continue" onClick="goOn()"></form>
</html>
<jsxgraph width="700" height="500">
var brd = JXG.JSXGraph.initBoard('jxgbox', {originX: 20, originY: 300, unitX: 3, unitY: 250, axis:true});
 
var S = brd.createElement('turtle',[],{strokeColor:'blue',strokeWidth:3});
var I = brd.createElement('turtle',[],{strokeColor:'red',strokeWidth:3});
var R = brd.createElement('turtle',[],{strokeColor:'green',strokeWidth:3});
 
var s = brd.createElement('slider', [[0,-0.3], [60,-0.3],[0,1E-6,1]], {name:'s'});
var beta = brd.createElement('slider', [[0,-0.4], [60,-0.4],[0,0.2857,1]], {name:'&beta;'});
var gamma = brd.createElement('slider', [[0,-0.5], [60,-0.5],[0,0.1428,0.5]], {name:'&gamma;'});
var mort = brd.createElement('slider', [[0,-0.6], [60,-0.6],[0,0.4,10.0]], {name:'% mortality'});
brd.createElement('text', [90,-0.3, "initially infected population rate"]);
brd.createElement('text', [90,-0.4, function(){ return "&beta;: infection rate, R<sub>0</sub>="+(beta.Value()/gamma.Value()).toFixed(2);}]);
brd.createElement('text', [90,-0.5, function(){ return "&gamma;: recovery rate = 1/(days of infection), days of infection= "+(1/gamma.Value()).toFixed(1);}]);
 
var t = 0; // global
 
brd.createElement('text', [100,-0.2, 
        function() {return "Day "+t+
                           ": infected="+(1000000*I.Y()).toFixed(1)+
                           " recovered="+(1000000*R.Y()).toFixed(1)+
                           " dead="+(1000000*R.Y()*mort.Value()*0.01).toFixed(0);}]);
 
S.hideTurtle();
I.hideTurtle();
R.hideTurtle();
 
function clearturtle() {
  S.cs();
  I.cs();
  R.cs();
 
  S.hideTurtle();
  I.hideTurtle();
  R.hideTurtle();
}
 
function run() {
  S.setPos(0,1.0-s.Value());
  R.setPos(0,0);
  I.setPos(0,s.Value());
 
  delta = 1; // global
  t = 0;  // global
  loop();
}
 
function turtleMove(turtle,dx,dy) {
  turtle.moveTo([dx+turtle.X(),dy+turtle.Y()]);
}
 
function loop() {
  var dS = -beta.Value()*S.Y()*I.Y();
  var dR = gamma.Value()*I.Y();
  var dI = -(dS+dR);
  turtleMove(S,delta,dS);
  turtleMove(R,delta,dR);
  turtleMove(I,delta,dI);
 
  t += delta;
  if (t<200.0) {
    active = setTimeout(loop,10);
  }
}
function stop() {
  if (active) clearTimeout(active);
  active = null;
}
function goOn() {
   if (t>0) {
     if (active==null) {
       active = setTimeout(loop,10);
     }
   } else {
     run();
   }
 
}
</jsxgraph>