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による実装

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による実装

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をコピーしました