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 进行说明,其主要目标是提高该领域的认识。


同样重要的是要记住,在提交/提出数学模型项目时必须采取特定措施,例如与生物数学领域相关的项目。


这些步骤包括但不限于:定义问题、选择模型方法(本文将讨论两个模型)、制定方程、参数估计(通常基于历史数据)、通过解析求解微分方程来实现数值模拟或使用Python和 MATLAB 等计算工具、验证和敏感性分析、场景测试、结果解释等。


正如我之前所说,这仅突出了数学建模过程中的一个特定步骤,并使用 Python 进行说明。


内容概述

  1. 介绍
    • 模拟的目的
  2. SIR模型
    • 它的作用 / SIR Python 代码模拟示例
    • 你能学到什么
      • 了解疾病传播
      • 探索参数敏感性
      • 评估干预措施
  3. SEIR模型
    • 它的作用/SEIR Python 代码模拟示例
    • 你能学到什么
      • 模型潜伏期
      • 评估早期干预措施
      • 研究复杂的疫情爆发
  4. 结论



一、简介

了解传染病如何传播对于维护公众健康至关重要,因为它们在人类历史中已经存在了几个世纪。数学模型是模拟和理解疾病传播动态的有效工具。本文将讨论SIR (易感-感染-恢复)和SEIR (易感-暴露-感染-恢复)模型,以及如何使用 Python 模拟它们。


模拟的用途

对于公共卫生专业人员和流行病学家来说,模拟就像一个水晶球。它使我们能够预见疾病在各种情况和治疗方案下的潜在传播。这些模型有助于决策、有效的资源分配以及理解各种技术的潜在影响。让我们检查两个基本模型: SIR模型和SEIR模型。


2.SIR模型

它的作用 / SIR Python 代码模拟示例

易感、传染和康复 (SIR) 模型将人群分为这三类。基于传输率 ( β ) 和恢复率 ( γ ) 等变量,它模拟这些隔室如何随时间变化。


在我们使用 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上找到示例。


本文不会编写 Python 代码来将 LaTeX 转换为正确的数学符号/方程,但我使用了在线编辑器,例如https://latexeditor.lagida.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 模型,您可以在下图中看到结果:



我们的模拟结果显示易感性和感染率降低,且恢复率较高。



  • 探索参数敏感性:尝试测试各种 beta 和 gamma 值,观察它们如何影响爆发的持续时间和峰值。


  • 评估干预措施:通过更改参数,您可以模拟干预措施的后果,例如

    社会隔离或免疫接种。


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 模型。