SIRモデル(1)

あらまし

感染症モデルについての備忘録です。 盛大にうそを書いていたので修正しました(2020/4/7)。

過去記事の一覧はこちら。 記事一覧 - Baggage Claim

感染症数理モデル

テレビをつけるとコロナウイルスのニュースが日々目に飛び込んでくる。 なかでも、感染症の専門家会議の方々が「モデルに基づく流行予測結果」を報告する姿を目にした方は多いのではないだろうか。 今回は、「感染症数理モデル」のなかでも最もベーシックなSIRモデルを取り上げ、 簡単な解説と実装した結果を紹介する。

SIRモデルとは

SIRモデルとは、 人口を病態に応じて3分類したときに、それらがどのように推移するかを表現したものである。 具体的には、Closed Population(外部との出入りがない状態)を仮定し、 その全員を

  • S:未感染
  • I:感染中
  • R:感染済み(免疫獲得 or 死亡)

のいずれかに分類したうえで、そのボリュームがどのように推移するかを以下の常微分方程式システムで表したものである:


\dfrac{dS(t)}{dt} = - \beta S(t) I(t)


\dfrac{dI(t)}{dt} = \beta S(t) I(t) - \gamma I(t)


\dfrac{dR(t)}{dt} = \gamma I(t)

\beta は感染率、\gamma は回復率で、1 / \gamma は感染状態の平均継続時間である。 これに加えて重要な指標として、基本再生産数 R0 というものがあり、 全感染期間(感染初期 - 感染終盤)において1人あたりの感染者が生産する新たな感染者の数を意味する。 つまり、R0 > 1 なら流行は拡大し、R0 < 1 なら流行は収束に向かう。 R0 は S(0) を時点0(感染初期)の未感染者数の人口として


R_0 = S(0) \times \dfrac{\beta}{\gamma}

と書ける。

SIRモデルを実装してみた

自粛自粛で暇なので、SIRモデルを python で実装し、S・I・R がどのように推移するかシミュレーションしてみた。 常微分方程式数値計算で解くのは初めてだったが、ライブラリ様のおかげで意外と簡単に実装できた。 この中身は次回まとめよう。

f:id:pur_usupr:20200406164945p:plain
\gamma = 1/2

横軸はタイムステップ、縦軸は人口であり、N = 1000 とした。 初期値は S = 999、I = 1、R = 0 とし、パラメータは \beta = 1/1000、 \gamma = 1/2 とした。これより、R0 = 2(S(0) ≒ Nとして)である。 流行のピークでは感染中の人数が100強、終息までにおよそ8割の人が感染したことがわかる。

ここで試しに \gamma を 1/10 (≒感染期間がより長い場合)にしてみると、感染人数が増大することがわかる。

f:id:pur_usupr:20200406165737p:plain
\gamma = 1/10

参考文献は次回まとめます。