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つの状態に分けます.
- S: 免疫のない感染する可能性のある集団
- I: 感染している人
- R: 感染後に回復した人/死亡した人
パラメータなど
- \(\beta\): 感染率
- \(\gamma\): 回復率や隔離率
- \(\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つの状態に分けます.
- S: 免疫のない感染する可能性のある集団
- E: 感染->発症していない人
- I: 感染->発症した人
- R: 感染後に回復した人/死亡した人
- \(\beta\): 感染率
- \(\gamma\): 回復率や隔離率
- \(\epsilon ^{-1}\): 感染待ち時間
- 潜伏期間
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() |