paint-brush
Python を使用した感染症の蔓延のシミュレーション: SIR モデルと SEIR モデル@olaoluwa
5,164 測定値
5,164 測定値

Python を使用した感染症の蔓延のシミュレーション: SIR モデルと SEIR モデル

Olaoluwa Afolabi7m2023/10/13
Read on Terminal Reader

長すぎる; 読むには

Python を使用した感染症モデリングを詳しく調べます。 SIR および SEIR モデルの力を発見し、Python コードを使用して現実世界のシナリオを探索し、疫学的洞察のためのスキルを拡張する方法を学びます。公衆衛生における疾患モデリングを習得するための必読書。
featured image - Python を使用した感染症の蔓延のシミュレーション: SIR モデルと SEIR モデル
Olaoluwa Afolabi HackerNoon profile picture
0-item


免責事項: この記事は、提供されているコードが数学的モデリングのあらゆる側面に対する普遍的な解決策ではないことを明確にすることを目的としています。その代わりに、数学的モデリング プロセスの特定のステップを強調し、説明目的で Python を使用する教育ツールとして機能し、この分野の認識を高めることを主な目的としています。


また、生物数学分野などの数理モデルプロジェクトを提出・提案する場合には、具体的な対策が必要であることにも留意してください。


これらのステップには、問題の定義、モデル アプローチの選択 (この記事では 2 つのモデルについて説明します)、方程式の定式化、パラメータ推定 (多くの場合履歴データに基づく)、微分方程式を解析的に解くことによる数値シミュレーションの実装、またはPythonや MATLAB などの計算ツールの使用、検証と感度分析、シナリオのテスト、結果の解釈など。


前に述べたように、これは数学的モデリング プロセスの特定のステップと、説明の目的で Python を使用することを強調しているだけです。


コンテンツの概要

  1. 導入
    • シミュレーションの目的
  2. SIRモデル
    • 機能 / SIR Python コードのシミュレーション例
    • 学べること
      • 病気の蔓延を理解する
      • パラメータの感度を調べる
      • 介入の評価
  3. SEIRモデル
    • 機能 / SEIR Python コード シミュレーションの例
    • 学べること
      • 潜伏期間のモデル化
      • 早期介入を評価する
      • 複雑なアウトブレイクの研究
  4. 結論



1. はじめに

感染症は人類の歴史を通じて何世紀にもわたって存在してきたため、感染症がどのように蔓延するかを理解することは公衆の健康を維持するために不可欠です。病気の蔓延のダイナミクスをシミュレーションして理解するための強力なツールは、数学的モデルです。この記事では、 SIR (Susceptible-Infectious-Recovered) モデルとSEIR (Susceptible-Exused-Infectious-Recovered) モデルについて、および Python を使用してそれらをシミュレートする方法について説明します。


シミュレーションの目的

公衆衛生専門家や疫学者にとって、シミュレーションは水晶玉のようなものです。これにより、さまざまな状況下での病気の蔓延の可能性や治療の選択肢を予測することができます。これらのモデルは、意思決定、効果的なリソースの割り当て、およびさまざまな技術の潜在的な影響の理解を支援します。 2 つの基本モデルを調べてみましょう。 SIR モデル、SEIR モデル。


2. SIRモデル

機能 / SIR Python コードのシミュレーション例

Susceptible、Infectious、Recovered (SIR) モデルは、集団をこれら 3 つのカテゴリに分類します。伝達率 ( β ) や回復率 ( γ ) などの変数に基づいて、これらのコンパートメントが時間の経過とともにどのように変化するかをシミュレートします。


Python を使用したシミュレーションを例示する前に、数学的モデルに取り組むときに「モデルの仮定」を行う必要があります。


私たちの仮定では、LaTeX 式またはコードを使用してモデルを作成します。


 \begin{align*} \frac{dS}{dt} &= -\beta \cdot S \cdot I \\ \frac{dI}{dt} &= \beta \cdot S \cdot I - \gamma \cdot I \\ \frac{dR}{dt} &= \gamma \cdot I \end{align*}


注: Python を使用してこの式をラテックス化できます。例はhttps://github.com/google/latexify_py/blob/main/examples/examples.ipynbにあります。


この記事では、LaTeX を適切な数学表記/方程式に変換するための Python コードをわざわざ書くつもりはありませんが、 https://latexeditor.lagrida.com/などのオンライン エディタを使用したので、以下に数式/方程式の仮定がはっきりと表示されます。 :



図 1: モデル方程式


ここで:


  • S は影響を受けやすい個人を表し、
  • 私は感染者を代表しており、
  • Rは回復した個体を表します。


パラメータ β と γ は、それぞれ送信速度と回復速度を制御します。負の符号 (つまり -β) は、感受性のある個人 (S) の数が時間の経過とともに減少することを示します。ドット表記は「乗算」を表します。


要約すると、これらの方程式は SIR モデルのダイナミクスを表しており、感染しやすい人の数は病気に罹るにつれて減少し (つまり dS/dt)、感染者の数は新たな感染の結果として増加し、回復するにつれて減少します (即ち、dI/dt)、病気が治療されるにつれて回復者の数は増加します(即ち、dR/dt)。各コンパートメントの変化は関連するコンポーネントの乗算に依存するため、乗算を表すためにドット (.) が使用されます。


すべての仮定が設定されているため、Python を使用して SIR モデルのシミュレーションを実行し、ダイナミクスを視覚化できます。


 import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # SIR model equations def SIR_model(y, t, beta, gamma): S, I, R = y dSdt = -beta * S * I dIdt = beta * S * I - gamma * I dRdt = gamma * I return [dSdt, dIdt, dRdt] """ Initial conditions (such as S0, I0, and R0) are not to be random but I hardcoded them with specific values. These choices are typically made based on the characteristics of the disease being modeled and the context of the simulation. Initial condition are set such that S0 = 99%, which indicates the proportion of susceptible individuals when the simulation starts. I0 is set to 1%, which indicates proportion of infected individuals to be 1% when the simulation starts. R0 is set to 0% which is expected that there are are no recovered individuals when the simulations start. """ S0 = 0.99 I0 = 0.01 R0 = 0.00 y0 = [S0, I0, R0] # Parameters # β (beta) is transmission rate and I chose 30%. γ (gamma) is set to 1% beta = 0.3 gamma = 0.1 # Time vector t = np.linspace(0, 200, 200) # Simulate for 200 days # Solve the SIR model equations using odeint() solution = odeint(SIR_model, y0, t, args=(beta, gamma)) # Extract results S, I, R = solution.T # Plot the results plt.figure(figsize=(10, 6)) plt.plot(t, S, label='Susceptible') plt.plot(t, I, label='Infected') plt.plot(t, R, label='Recovered') plt.xlabel('Time (days)') plt.ylabel('Proportion of Population') plt.title('SIR Model Simulation') plt.legend() plt.grid(True) plt.show()


scipy.integrate.odescipy.integrate.odeintの違いについては、さらに理解できるようにodeintodeを参照してください。


発見できること


Python で SIR モデルを実行すると、次のことが可能になります。

  • 病気の広がりを理解する: 流行曲線を観察し、病気が地域社会にどのように広がるかを視覚化します。上記の Python SIR モデルを実行すると、以下のグラフで結果を確認できます。



シミュレーションの結果、感受性と感染率が低下し、高い回復率が示されました。



  • パラメーターの感度を調査する:さまざまなベータ値とガンマ値をテストして、アウトブレイクの長さとピークにどのような影響を与えるかを観察してください。


  • 介入の評価:パラメータを変更することで、次のような介入の結果をシミュレートできます。

    社会的隔離や予防接種。


3. SEIR モデル

機能 / SEIR Python コード シミュレーションの例

「露出」コンパートメントを追加することにより、SEIR モデルは SIR モデルを拡張します。これは、人々が暴露されたものの、まだ伝染性になっていない潜伏期間を考慮に入れています。 Python でエミュレートする方法をここに示します。


 import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # SEIR model equations def SEIR_model(y, t, beta, sigma, gamma): S, E, I, R = y dSdt = -beta * S * I dEdt = beta * S * I - sigma * E dIdt = sigma * E - gamma * I dRdt = gamma * I return [dSdt, dEdt, dIdt, dRdt] # Initial conditions S0 = 0.99 E0 = 0.01 I0 = 0.00 R0 = 0.00 y0 = [S0, E0, I0, R0] # Parameters beta = 0.3 sigma = 0.1 gamma = 0.05 # Time vector t = np.linspace(0, 200, 200) # Solve the SEIR model equations solution = odeint(SEIR_model, y0, t, args=(beta, sigma, gamma)) # Extract results S, E, I, R = solution.T # Plot the results plt.figure(figsize=(10, 6)) plt.plot(t, S, label='Susceptible') plt.plot(t, E, label='Exposed') plt.plot(t, I, label='Infected') plt.plot(t, R, label='Recovered') plt.xlabel('Time (days)') plt.ylabel('Proportion of Population') plt.title('SEIR Model Simulation') plt.legend() plt.grid(True) plt.show()


この場合の唯一の違いは、さまざまなシナリオを検討し、「暴露」期間を持つ感染症の動態を理解するためにlatent period rate (σ)を導入していることです。これは、個人が感染するまでの潜伏期間をどのように説明するかを示しています。


学べること


Python を使用して SEIR モデルを実行すると、次のことが可能になります。


  • 潜伏期間のモデル化

    即時感染性の病気と潜伏期間のある病気の行動の違いを認識します。


  • 早期介入を評価する

    隔離と早期発見戦略の効果を分析します。


  • 複雑なアウトブレイクの研究

    新型コロナウイルス感染症 (COVID-19) のように、曝露された人々が感染の主な要因となる病気の場合は、SEIR を使用してください。



4. 結論

Python は、SciPy のようなシンプルさと堅牢なライブラリにより、疾患のモデル化に最適な言語です。これらのシミュレーションを実行することで、感染症のダイナミクスについてさらに学ぶことができます。これにより、十分な情報に基づいた意思決定を行うのに役立つ判断力と勇気が身につき、現実世界での流行を評価する能力を向上させることができます。


SIR モデルと SEIR モデルの後には、さらに多くの機能が登場します。他にも、SEIRS (感受性-暴露-感染-除去-感受性) モデル、空間モデル、ネットワーク モデルなどの複雑なモデルがあります。複雑なモデルだけでなく、地理空間データ、疫学データ、行動データなどの実世界のデータも調査します。などを検討し、ワクチン接種戦略、治療の利用可能性、社会的距離の確保などの介入の効果を注意深く検討すると、モデリング能力がさらに向上します。


これらのモデリング ツールに関する知識は、感染症の伝播を理解することが重要となる将来、公衆衛生の保護に大きな影響を与える可能性があります。


すでに長くなってしまいましたが、Python を使用して数学モデルで SIR モデルと SEIR モデルをシミュレートする方法を説明できれば幸いです。