LoginSignup
0
3

More than 3 years have passed since last update.

Excel VBA で SIR モデルを実装する。

Last updated at Posted at 2020-04-30

新型コロナウイルス(COVID-19)と SIR モデル

新型コロナウイルス(COVID-19)の患者数推移を表す数理モデル「SIRモデル」をよく目にするようになりました。
SIR モデルでは未感染者をS (susceptible)、感染者を I (infectious)、治癒者や死亡者を R (removed) とします。

S, I, R 各群の増加速度は以下のように表せます。

\begin{align}
\frac{dS}{dt} &= -βSI\\
\frac{dI}{dt} &= βSI-γI\\
\frac{dR}{dt} &= γI\\
\end{align}

$\ β$ は感染率、$\ γ$ は除去率(平均罹病期間の逆数)となります。

\ γ=\frac{1}{平均罹病期間}

$\ 全人口をNとすると基本再生産数\ R_0は$

\ R_0=\frac{βN}{γ}\\
\therefore β=\frac{γR_0}{N}

以上より、2つの係数 $\ γ, β$ は平均罹病期間と基本再生産数 (COVID-19 では2~3)から算出できることが分かります。

上記の微分方程式から、

\begin{align}
\Delta S&=-βSI\Delta t\\
\Delta I&=(βSI-γI)\Delta t\\
\Delta R&=γI\Delta t\\
\ S(t+\Delta t)&=S+\Delta S\\
\ I(t+\Delta t)&=I+\Delta I\\
\ R(t+\Delta t)&=R+\Delta R\\
\end{align}

Excel VBA マクロのコード

上記から Excel VBA マクロのプログラムを作りました。
数学的に微分方程式の解を求めなくても、for ループで各パラメータを漸増させていけば曲線が得られます。
セルB2 を (S) 総人口1億2000万人
セルB3 を (I) 13852人(2020.4.29の患者数)
セルB4 を (R) 3763人(2020.4.29の治癒者+死亡者数)
セルB5 を基本再生産数 2.5
セルB6 を平均罹病期間 14日
セルB7 を観察期間 180日とします。
$\Delta t=0.5日$ とします。
基本再生産数を色々変えてみて下さい。
以下にスクリーンショットとコードを示します。
Excel_SIR.jpg

 Sub SIR()
 If ActiveSheet.ChartObjects.Count = 1 Then ActiveSheet.ChartObjects(1).Delete
 Range(Columns(4), Columns(7)).Clear
        S = Range("B2").Value
        I = Range("B3").Value
        R = Range("B4").Value
          saiseisansu = Range("B5").Value
         ribyoukikan = Range("B6").Value
          kansatsukikan = Range("B7").Value
         Dim beta As Double
         Dim gam As Double
         Dim deltaS As Double
         Dim deltaI As Double
         Dim deltaR As Double
         Dim deltaT As Double
         Dim myCount As Integer
         gam = 1 / ribyoukikan
         beta = saiseisansu * gam / S
         deltaT = 0.5
         myCount = 0
          Cells(1, 4) = "days"
           Cells(1, 5) = "susceptible"
           Cells(1, 6) = "infetcted"
           Cells(1, 7) = "removed"
          For myTime = 0 To kansatsukikan Step deltaT
           deltaS = -beta * S * I * deltaT
           deltaI = (beta * S * I - gam * I) * deltaT
           deltaR = gam * I * deltaT
            S = S + deltaS
            I = I + deltaI
            R = R + deltaR
            Cells(2 + myCount, 4) = myTime
             Cells(2 + myCount, 5) = S
             Cells(2 + myCount, 6) = I
             Cells(2 + myCount, 7) = R
             myCount = myCount + 1
          Next myTime

          Set trange = Worksheets("Sheet1").Range(Cells(1, 4), Cells(1 + myCount, 7))
      Charts.Add
      With ActiveChart
            .HasLegend = True
            .Legend.Position = xlLegendPositionTop
            .ChartType = xlXYScatterLines
            .SetSourceData Source:=trange, PlotBy:=xlColumns
            .Location Where:=xlLocationAsObject, Name:="Sheet1"
      End With
      With ActiveChart
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "value"
            .Axes(xlValue, xlPrimary).AxisTitle.AutoScaleFont = True
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "time"
            .Axes(xlCategory, xlPrimary).AxisTitle.AutoScaleFont = True
            .PlotArea.Interior.ColorIndex = 2
            .Axes(xlValue).MajorGridlines.Delete
      End With
      With ActiveSheet
            .ChartObjects(1).Top = 50
            .ChartObjects(1).Width = 350
            .ChartObjects(1).Height = 350
            .ChartObjects(1).Left = 600
      End With

 End Sub

COVID-19 に SIR モデルを当てはめる際の注意点 をご参考ください。

参考サイト

稲葉 寿:感染症数理モデルとCOVID-19 | 日本医師会 COVID-19有識者会議
SIR型の感染症数理モデル

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3