Loading [MathJax]/extensions/tex2jax.js

SIR,SEIR|感染症流行過程の数理モデル

データサイエンス




SIR,SEIR|感染症流行過程の数理モデ

SIRモデル

感染症の短期的な流行過程を決定論的に記述するモデル方程式
$$
\frac{dS(t)}{dt} = -\beta S(t) I(t)
\\
\frac{dI(t)}{dt} = \beta S(t) I(t) – \gamma I(t)
\\
\frac{dR(t)}{dt} = \gamma I(t)
$$
閉鎖的な(人の移動がない)集団を3つの状態に分けます.

  1. S: 免疫のない感染する可能性のある集団
  2. I: 感染している人
  3. R: 感染後に回復した人/死亡した人

パラメータなど

  1. \(\beta\): 感染率
  2. \(\gamma\): 回復率や隔離率
  3. \(\beta I(t)\): 時間tにおける感染力

Pythonによる実装

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
 
N = 1_000_000
D = 14
R0 = 2
 
#initial_state
I_0 = 1
R_0 = 0
S_0 = N - I_0 - R_0
 
#params
gamma = 1/D
beta = R0 * gamma
 
#time
times =np.arange(0,366, 1)
 
var_0 = [S_0, I_0, R_0]
 
def SIR(var, t, N, beta, gamma):
    dSdt = - beta*var[0]*var[1]/N
    dIdt = beta*var[0]*var[1]/N-gamma*var[1]
    dRdt = gamma*var[1]
     
    return [dSdt, dIdt, dRdt]
 
result = odeint(SIR, var_0, times, args=(beta, gamma))
 
plt.figure(figsize=(16, 5))
plt.plot(times,result)
plt.legend(['Susceptible','Infectious', 'Removed'])
plt.show()

SEIRモデル

$$
\frac{dS(t)}{dt} = -\beta S(t) I(t)
\\
\frac{dE(t)}{dt} = \beta S(t) I(t) – \epsilon E(t)
\\
\frac{dI(t)}{dt} = \epsilon E(t) – \gamma I(t)
\\
\frac{dR(t)}{dt} = \gamma I(t)
$$
閉鎖的な(人の移動がない)集団を4つの状態に分けます.

  1. S: 免疫のない感染する可能性のある集団
  2. E: 感染->発症していない人
  3. I: 感染->発症した人
  4. R: 感染後に回復した人/死亡した人
  1. \(\beta\): 感染率
  2. \(\gamma\): 回復率や隔離率
  3. \(\epsilon ^{-1}\): 感染待ち時間
  4. 潜伏期間

Pythonによる実装

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
 
N = 1_000_000
L = 7
D = 7
R0 = 2
 
#initial_state
E_0 = 1
I_0 = 0
R_0 = 0
S_0 = N - E_0 - I_0 - R_0
 
#params
gamma = 1/D
epsilon = 1/L
 
beta = R0 * epsilon / N
 
#time
times =np.arange(0,366, 1)
 
var_0 = [S_0, E_0, I_0, R_0]
 
def SEIR(var, t, beta, epsilon, gamma):
    dSdt = -beta * var[0] * var[2]
    dEdt = beta * var[0] * var[2] - epsilon * var[1]
    dIdt = epsilon * var[1] - gamma * var[2]
    dRdt = gamma * var[2]
     
    return [dSdt, dEdt, dIdt, dRdt]
 
result = odeint(SEIR, var_0, times, args=(beta, epsilon, gamma))
 
plt.figure(figsize=(16, 5))
plt.plot(times,result)
plt.legend(['Susceptible', 'Exposed', 'Infectious', 'Removed'])
plt.show()

参考

  1. SIRモデル|wikipedia
  2. SEIRモデル|wikipedia
  3. 感染症流行の予測:感染症数理モデルにおける 定量的課題
タイトルとURLをコピーしました