COVID-19を機に学ぶSIRモデル

こんにちは。さくらえびです。

今回は新型コロナウイルス(COVID-19)の感染拡大を期に、SIRモデルを学びたいと思います。

まずは、用語を理解してみたいと思います。

・SIRモデルのSは感受性保持者。なるほど、専門外なので意味がわかりません。英語で読むとSusceptible
z引き受けやすいという意味です。つまり抗体を持たない人と解釈して良さそうです。

・SIRモデルのIは感染者(Infected)これはわかる!筆者でもこれはわかる!!

・SIRモデルのRは免疫保持者(Recover)とか隔離者(Remove)と訳されています。
 引っかかるけど受け止めましょう。

では数式を見ていきます。シミュレーションしたいのでここからが大事です。

Susceptible(感受性保持者)の差分項
\[
\frac{dS}{dt} = – \beta S(t)I(t)
\]

Infected(感染者)の差分項
\[
\frac{dI}{dt} = \beta S(t)I(t) – \gamma I(t)
\]

Recover(免疫保持者)またはRemove(隔離者)
\[
\frac{dR}{dt} = \gamma I(t)
\]

束縛条件
\[
S(t) + I(t) + R(t) = Constant
\]

連立微分方程式と束縛条件を把握できました。微分は1日ずつの前進オイラー法(過去記事)でなんとかできそうです。
早速ソースコードに移します。

program SIR_SIM
 implicit none
 double precision Sfun(1000),Ifun(1000),Rfun(1000)
 double precision beta,gamma1,gamma,beta1,TOT,inf,dead
 integer*4 day,past
 beta1 = 0.0000000017d0
 dead = 0
 gamma = 1.d0/14.d0
 past = 90
 Ifun(1) = 1
 inf = Ifun(1)
 Sfun(1) = 124999999
 Rfun(1) = 0
 print *, 1,Sfun(1),Ifun(1),Rfun(1),0
 do day = 2,600
    Sfun(day) = Sfun(day-1) - beta1*Ifun(day-1)*Sfun(day-1)
    Ifun(day) = Ifun(day-1) + (beta1*Sfun(day-1)-gamma)*Ifun(day-1)
    Rfun(day) = Rfun(day-1) + gamma*Ifun(day-1)
    TOT = Sfun(day)+Ifun(day)+Rfun(day)
    print *, day,Sfun(day),Ifun(day),Rfun(day),Ifun(day) - Ifun(day-1),TOT
 enddo

end program

結果を確認します。

うん、書籍どおりの結果が出ました。緊急事態宣言前に北大の先生が言っていた「このままでは1ヶ月後には〜人の感染者が発生する」という言葉は理解できますね。

4月7日に発表した緊急事態宣言も計算の中に入れてみましょう。SIRモデルのうち、γを操作します。γの逆数は、回復までの平均日数14日間とおきますが、これは隔離率と置き換えられるため、緊急事態宣言下ではこの値を大きくしてみます。

現状の感染者に合うように、γを7日に1回見直し
一日の感染者数のシミュレーション(前日に対する差分をプロット)
週ごとのγ(隔離率)の値をプロット

この計算式、エンデミックには対応していません。なぜならこの計算、Recoverした人はもう感染しない前提だからです。今回の、COVID-19は一度感染した人も感染してます。バッチ処理入れてみたいですね。検討の余地ありです。

いかがでしたでしょうか?シミュレーションしてみると、ニュースでよく見るグラフが身近に感じられますね。でも身近だと困るのでソーシャルディスタンスを確保しましょう!

次回はSIRモデルを改造してみたいと思います。

[1]「自然の数理と社会の数理 2」 佐藤總夫 日本評論社(1984)
[2]「感染症の数理モデル」 稲葉寿 培風館(2008)

by さくらえび

  • さくらえび
  • さくらえびと申します
    企業勤め系研究者です。理論物理が専門分野。
    エンジニア・営業・コンサルを経験し、今はデータサイエンティストとしてお仕事をさせていただいております。