社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

考虑了疫苗的SEIR模型的初步探索及Python实现

Rick笔记 • 4 年前 • 890 次点击  

2020年终于过去,展望2021年,新冠疫情仍然是核心变量。不过与一年前不同的是,我们现在有快速检测病毒的试剂,有精准溯源的基因组测序,有科学防控的抗疫方法,而且最终战胜病毒的最重要手段—疫苗,已经研发成功并陆续接种。

本文尝试在经典的SEIR模型中,纳入疫苗的作用。具体而言,本文的模型,试图纳入以下三个因素:

  1. 病毒有潜伏期,即exposed,用E表示,这是经典的SEIR模型;
  2. 潜伏期病人也有传染性,但是传染能力低于感染者;
  3. 易感人群开始接种疫苗,疫苗的免疫作用在0-1之间。

模型的基本参数设置

模型将人群分为四大类,分别是:

  • S: susceptible,易感者;
  • E: exposed,潜伏者;
  • I: infected,感染者;
  • R: recovered,康复者。

模型的核心参数为:

  • :感染者的感染率
  • :潜伏者相对于感染者的感染率,是0-1之间的一个数字
  • :易感人群的疫苗接种率
  • :疫苗的免疫保护能力
  • :潜伏者变成感染者的比例
  • :感染者恢复的比例

模型的微分方程形式

模型的四个个核心公式分别是:

  • 感染者向易感者(未打疫苗)传染的速度:
  • 潜伏者向易感者(未打疫苗)传染的速度:
  • 感染者向易感者(打疫苗但未获得免疫能力)传染的速度:
  • 潜伏者向易感者(打疫苗但未获得免疫能力)传染的速度:

完整的微分方程模型如下:

模型的实际数据拟合和Python实现

从我们重点监测的几个海外经济体的新增病例来看,出现了变异病毒的英国的新增病例数,确实出现了明显增长,但是近期似乎出现了短期拐点。出现了变异病毒的南非的新增病例数也有较快增长,而美国的新增病例数也重新抬头,显示传播速度更快的变异新毒株,可能是近期部分地区疫情加重的重要原因。

我们在文中,用美国2020年9月份之后的第三轮疫情数据,来拟合SEIR模型。即下图中红色竖线右侧的疫情数据。

首先导入需要的包:

import pandas as pd
import numpy as np
from scipy import integrate, optimize
import matplotlib.pyplot as plt

定义SEIR模型:

# define SEIR model
def SEIR_model(Y,t,beta,q,a,sigma,epsilon,gamma):
    S,E,I,R = Y
    dS = - beta * S * (1-a) * I / N - beta * S * (1-a) * q * E / N - beta * a * S * (1-sigma) * I / N - beta * a * S * (1-sigma) * q * E / N - sigma * a * S
    dE = beta * S * (1-a) * I / N + beta * S * (1-a) * q * E / N + beta * a * S * (1-sigma) * I / N + beta * a * S * (1-sigma) * q * E / N  - epsilon * E
    dI = epsilon * E - gamma * I
    dR = sigma * a * S + gamma * I
    return dS,dE,dI,dR

定义拟合方程:

def fit_odeint(x,beta,q,a,sigma,epsilon,gamma):
    return integrate.odeint(SEIR_model, N0, x, args=(beta,q,a,sigma,epsilon,gamma))[:,2]

给定初始值:

population = float(320000000)
N = population
y = np.array(covid19['2020-09-13':])[:,0]
T = np.arange(len(covid19['2020-09-13':]))
I0 = y[0]
E0 = I0/3
R0 = 24987
N0 = population - E0 - I0 - R0, E0, I0, R0

拟合方程:

popt, pcov = optimize.curve_fit(fit_odeint, T, y, bounds=([0,0,0,0.75,0,0],[np.inf,1,np.inf,0.9,np.inf,np.inf]),maxfev=500000)
fitted = fit_odeint(np.array(list(range(1,200))), *popt)

从模型的初步结果上看,只要保持现有防疫措施和力度,并稳步推进疫苗的接种工作,美国的疫情有望见顶。

本文仅为笔者的初步探索,考虑到传染病的影响因素非常多,而且有效再生数随着政府的防疫措施、隔离情况以及疫苗接种情况而变,因此本文结论仅作参考。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/105689
 
890 次点击