免責事項: この記事は、提供されているコードが数学的モデリングのあらゆる側面に対する普遍的な解決策ではないことを明確にすることを目的としています。その代わりに、数学的モデリング プロセスの特定のステップを強調し、説明目的で Python を使用する教育ツールとして機能し、この分野の認識を高めることを主な目的としています。
また、生物数学分野などの数理モデルプロジェクトを提出・提案する場合には、具体的な対策が必要であることにも留意してください。
これらのステップには、問題の定義、モデル アプローチの選択 (この記事では 2 つのモデルについて説明します)、方程式の定式化、パラメータ推定 (多くの場合履歴データに基づく)、微分方程式を解析的に解くことによる数値シミュレーションの実装、またはPythonや MATLAB などの計算ツールの使用、検証と感度分析、シナリオのテスト、結果の解釈など。
前に述べたように、これは数学的モデリング プロセスの特定のステップと、説明の目的で Python を使用することを強調しているだけです。
感染症は人類の歴史を通じて何世紀にもわたって存在してきたため、感染症がどのように蔓延するかを理解することは公衆の健康を維持するために不可欠です。病気の蔓延のダイナミクスをシミュレーションして理解するための強力なツールは、数学的モデルです。この記事では、 SIR (Susceptible-Infectious-Recovered) モデルとSEIR (Susceptible-Exused-Infectious-Recovered) モデルについて、および Python を使用してそれらをシミュレートする方法について説明します。
公衆衛生専門家や疫学者にとって、シミュレーションは水晶玉のようなものです。これにより、さまざまな状況下での病気の蔓延の可能性や治療の選択肢を予測することができます。これらのモデルは、意思決定、効果的なリソースの割り当て、およびさまざまな技術の潜在的な影響の理解を支援します。 2 つの基本モデルを調べてみましょう。 SIR モデル、SEIR モデル。
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/などのオンライン エディタを使用したので、以下に数式/方程式の仮定がはっきりと表示されます。 :
ここで:
パラメータ β と γ は、それぞれ送信速度と回復速度を制御します。負の符号 (つまり -β) は、感受性のある個人 (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.ode
とscipy.integrate.odeint
の違いについては、さらに理解できるようにodeintとodeを参照してください。
Python で SIR モデルを実行すると、次のことが可能になります。
病気の広がりを理解する: 流行曲線を観察し、病気が地域社会にどのように広がるかを視覚化します。上記の Python SIR モデルを実行すると、以下のグラフで結果を確認できます。
介入の評価:パラメータを変更することで、次のような介入の結果をシミュレートできます。
社会的隔離や予防接種。
「露出」コンパートメントを追加することにより、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 を使用してください。
Python は、SciPy のようなシンプルさと堅牢なライブラリにより、疾患のモデル化に最適な言語です。これらのシミュレーションを実行することで、感染症のダイナミクスについてさらに学ぶことができます。これにより、十分な情報に基づいた意思決定を行うのに役立つ判断力と勇気が身につき、現実世界での流行を評価する能力を向上させることができます。
SIR モデルと SEIR モデルの後には、さらに多くの機能が登場します。他にも、SEIRS (感受性-暴露-感染-除去-感受性) モデル、空間モデル、ネットワーク モデルなどの複雑なモデルがあります。複雑なモデルだけでなく、地理空間データ、疫学データ、行動データなどの実世界のデータも調査します。などを検討し、ワクチン接種戦略、治療の利用可能性、社会的距離の確保などの介入の効果を注意深く検討すると、モデリング能力がさらに向上します。
これらのモデリング ツールに関する知識は、感染症の伝播を理解することが重要となる将来、公衆衛生の保護に大きな影響を与える可能性があります。
すでに長くなってしまいましたが、Python を使用して数学モデルで SIR モデルと SEIR モデルをシミュレートする方法を説明できれば幸いです。