传染病的数学模型是数学建模中的典型问题,常见的传染病模型有 SI、SIR、SIRS、SEIR 模型。html
SEIR 模型考虑存在易感者、暴露者、患病者和康复者四类人群,适用于具备潜伏期、治愈后得到终身免疫的传染病。python
本文详细给出了几种改进 SEIR 模型微分方程的思路、建模、例程和结果,让小白学会模型分析与改进。编程
『Python小白的数学建模课 @ Youcans』 带你从数模小白成为国赛达人。数组
Python小白的数学建模课-09.微分方程模型
Python小白的数学建模课-B2.新冠疫情 SI模型
Python小白的数学建模课-B3.新冠疫情 SIS模型
Python小白的数学建模课-B4.新冠疫情 SIR模型
Python小白的数学建模课-B5.新冠疫情 SEIR模型
Python小白的数学建模课-B6.改进 SEIR疫情模型网络
SEIR 模型考虑存在易感者(Susceptible)、暴露者(Exposed)、患病者(Infectious)和康复者(Recovered)四类人群,适用于具备潜伏期、治愈后得到终身免疫的传染病。易感者(S 类)被感染后成为潜伏者(E类),随后发病成为患病者(I 类),治愈后成为康复者(R类)。这种状况更为复杂,也更为接近实际状况。ide
SEIR 模型的仓室结构示意图以下:函数
考察地区的总人数 N 不变,即不考虑生死或迁移;大数据
人群分为易感者(S 类)、暴露者(E 类)、患病者(I 类)和康复者(R 类)四类;spa
易感者(S 类)与患病者(I 类)有效接触即变为暴露者(E 类),暴露者(E 类)通过平均潜伏期后成为患病者(I 类);患病者(I 类)可被治愈,治愈后变为康复者(R 类);康复者(R类)得到终身免疫再也不易感;3d
将第 t 天时 S 类、E 类、I 类、R 类人群的占比记为 \(s(t)\)、\(e(t)\)、\(i(t)\)、\(r(t)\),数量分别为 \(S(t)\)、\(E(t)\)、\(I(t)\)、\(R(t)\);初始日期 \(t=0\) 时,各种人群占比的初值为 \(s_0\)、\(e_0\)、\(i_0\)、\(r_0\);
日接触数 \(\lambda\),每一个患病者天天有效接触的易感者的平均人数;
日发病率 \(\delta\),天天发病成为患病者的暴露者占暴露者总数的比例;
日治愈率 \(\mu\),天天被治愈的患病者人数占患病者总数的比例,即平均治愈天数为 \(1/\mu\);
传染期接触数 \(\sigma = \lambda / \mu\),即每一个患病者在整个传染期内有效接触的易感者人数。
2019年12月,武汉市出现新冠疫情(COVID-19)病例;2020年初,新冠疫情(COVID-19)在中国迅速蔓延。随着严格的防疫措施,新冠疫情在中国整体被基本抑制;以后虽然在国内部分地区有零星散发,但均较快获得控制,这都得益于疫情早期的防控。
所以,在疫情暴发早期迅速采起有效的防控措施,对于新冠疫情的防控具备重要做用。对疫情暴发与衰退进行精准预测,对防控措施的效果进行定量分析,为研判疫情传播发展态势、科学实施疫情防控,积极稳妥恢复平常工做和生活,具备重要的理论意义和现实意义 。
国内外学者开展了大量的疫情传播和疫情防控的研究,这些研究主要是基于 SEIR 模型,并根据新冠疫情的病理特征及传播特色,对模型进行各类改进,使模型与实际状况更加吻合,以便更准确地预测疫情发展趋势 。
2020年1月,英国 Jonathan 等估计武汉市 2月4日感染病例将达到 19万例,高估了疫情发展态势。2020年1月,西安交通大学 Shen 等估计新冠疫情的基本再生数,预测最终感染人数在 2万人之内,明显低于公布的疫情数据。2020年1月31日,香港学者 Wu 等推测 1月25日感染人数超过6000,高于25日公布的确诊人数 1985例。
2020年 3月,钟南山院士团队在《Journal of thoracic disease》发表论文 “Modified SEIR and AI prediction of the epidemics trend of COVID-19 in China under public health interventions( 基于改进 SEIR 和 AI 模型对公共卫生干预下的 COVID-19 暴发趋势预测)“,采用改进的 SEIR 模型来预测新冠疫情的发展。
该文结合 2020年 1月23日先后的人口迁移数据及最新的 COVID-19 流行病学数据,对 SEIR 模型参数进行估计和校订,由此预测疫情发展的走势,与实际报告数据的吻合度较高。
基于该模型的研究认为,按照目前的干预措施疫情将在 2月28日达到峰值,4月底逐渐平缓,最终感染人数将达到 122,122 (89741~156794)人;若是干预措施能提前 5天,感染人数将减小 2/3 ,估计仅 40,991人;但若是干预措施推迟 5天,预计疫情规模将增长 3倍,感染人数会达到 351,874人。
该文指出,若是继续严格的管控政策,提升诊断水平,推出使用药物,疫情规模将获得极大控制;若是当即在湖北省解除隔离,将在 3月中旬出现第二次疫情高峰,并使疫情延至 4月底,所以建议继续采起有力措施进行防控。
该文是 2月27日投稿,文中数据基于2月9日(当时国内确诊35,982例)。4月30日国内公布累计确诊 84,385例,疫情获得有效控制,都在本文的预测范围以内。
2020年 2月,中山大学胡延庆团队在《科学通报》发表论文 “新型冠状病毒传播的数学模型与预测”,采用分阶段滚动 SEIR 模型对防控措施的效果进行分析,经过新冠疫情数据估算天然基本再生数为 2.57,对疫情发展趋势进行了预测,预计最终全国除湖北省之外的累计感染人数近 14000(到2020年末实际为 18922),除武汉市之外的累计感染人数近 32000(到2020年末实际为 36717)。
2020年 2月,西安交通大学吕军团队论文 “基于 SEIR模型分析相关干预措施在新型冠状病毒肺炎疫情中的做用”,对 SEIR模型加入潜伏期传染率、感染人群变化率等参数,经过新冠疫情数据估算基本再生数为 2.4~2.7。基于模型分析防控手段的有效性,模型显示基于严格限制出行的隔离措施可以减缓疫情发展的趋势,使潜伏和感染人群的峰值分别下降 45. 7%、29. 9%。所以,疫情一旦暴发应及时采起相应等级的应急响应措施,及时出台强力的管控举措,及早限制出行、居家隔离、提示及强制出行戴口罩等防御措施切断病毒传染途径,大幅度减小潜伏和感染人群与易感人群的接触人数,以减缓疫情发展及减小疫情峰值发病人数。
此外,深圳大学林俊锋的论文 “基于引入隐形传播者的 SEIR 模型的 COVID-19 疫情分析和预测”,考虑未监测、未隔离的病毒携带者,在 SEIR 模型中引入隐形传播者(Undiscovered),提升了 SEIR 模型的精度。
中南大学李东杰团队的论文“基于改进传染病动力学易感-暴露-感染-恢复模型 (SEIR) 预测新型冠状病毒肺炎疫情”,基于 SEIR 模型并经过易感人群减小率来反映政府管控措施的效果。
长安大学董是等的论文“基于系统动力学模型的 2019冠状病毒病早期防控机制研究”,以广义 SEIR 模型为基础,引入易感人群、不易感人群、暴露人群(已感染但尚不具备传染性,处于潜伏状态)、感染人群(具备传染性,还没有隔离)、隔离人群(已感染和确诊)、恢复人群和死亡人群 7个不一样状态,以中国、美国、英国、澳大利亚、塞尔维亚和意大利的疫情暴发早期数据对模型参数进行拟合。在此基础上对严格集中管控模式和有限防控模式进行对比分析,认为在疫情暴发的早期,提升保护率、下降感染率,缩短检疫时间,采起严格的隔离政策能够有效抑制疫情的传播与扩散。
本文附录参考文献中给出了一些使用 SEIR 及其改进模型进行新冠疫情研究的论文。
分析和总结这些基于 SEIR 模型研究新冠疫情的论文,主要有三个方面的内容:一是对 SEIR 模型的改进,二是对模型参数的估计,三是对疫情传播和防控措施的预测。这也是传染病动力学模型进行疫情传播研究的基本路径。本节主要讨论 SEIR 模型d 改进。
SEIR 模型的假设比 SI、SIS、SIR 模型更加复杂,也更符合实际状况,于是模型结果每每也与实际数据更为接近。但即使如此,相对于特定传染病、实际疫情的具体状况,SEIR 模型的基本假设仍然存在问题与不足。
发现特定传染病和实际疫情的具体状况,在 SEIR 模型的基础上,考虑新的因素,就能够对 SEIR 模型进行改进。大致来讲,对于 SEIR 模型的改进主要有如下几个方面:
一是对于模型结构的改进,主要是对人群类型的细分。
SIR 模型较 SI 模型增长了康复者(R类),SEIR 模型较 SIR模型增长了潜伏者(E类)。相似地,结合新冠疫情传播和防控的特征,能够并且须要对人群进行进一步的细分。
“早发现、早诊断、早隔离、早治疗”是新冠疫情防控的关键措施。尽早发现患病者和还没有发病的潜伏者,对其进行隔离,能够大幅下降日接触数、传染期接触数。所以,潜伏者处于检出后的隔离状态仍是未检出的正常活动状态,对于疫情传播的影响是具备本质差别的,由此能够在 SEIR模型中引入“隐形传播者(Undiscovered)”。
进一步地,能够考虑增长隔离易感者、隔离接触者、住院患者,并考察不一样人群之间的动力学关系。
新冠疫情患病者有必定的病死率,能够考虑增长病死者人群(Death),根据病死率数据创建患病者与病死者的动力学关系。
又如,考虑不一样人群对病毒的抵抗力不一样,于是被感染的几率不一样,能够细分婴儿、老人人群,对其设定较高的接触感染率;考虑不一样人群病死率的不一样,能够对具备基础病的患者设置较高的病死率。
因而可知,只要认真分析新冠疫情发病机制的特征,分析所考察区域和阶段的特色,就能够发现区别于 SEIR 的特征人群,进而提出新的细分人群,从而对 SEIR 模型进行改进。固然,有些细分人群对于结果影响并不大,或者很难找到该细分人群与其它人群的动力学关系,因此并非说人群分的越多越好。
二是对疫情传播特征的改进,就是给微分方程表达式增长修正项。
SEIR 模型是单向模型,是对实际问题的简化,便于分析和求解。考虑新冠疫情发病机制和传播特色,能够对各种人群之间的传播特性进行更科学、更细致的研究。
例如,新冠疫情的重要病理特征是在潜伏期具备传染性,发病后 5天内传染性较强。实际上,随着疫情发展,患病者基本被收治隔离,日接触数极低,这时疫情主要是经过潜伏者与易感者的接触传播的。针对这一特征,SEIR 模型中仅考虑易感者与患病者接触后感染显然是重大的缺陷,须要考虑易感者与潜伏者接触后感染的影响。
又如,新冠疫情中发现患病治愈者具备免疫期,不是终身免疫,所以能够增长康复者向易感者转变的链接路径;疫情中发现一些潜伏者(暴露者)不必定都转变为患病者,而是也可能回到易感者,所以能够增长潜伏者人群返回易感者人群的链接路径。钟南山团队论文,就是在 SEIR 模型基础上,基于进行隔离与解除隔离的数据而增长了易感者与潜伏者的双向转换路径。
微分方程的表达式是各种人群之间动力学关系的反映,是对仓室模型中各种人群相互联系和转换特征的数学描述。基于改进模型提出各种人群之间新的转换关系,就是在微分方程表达式中增长一个修正项,来描述两个仓室之间的动力学关系。后文将对此案例进行具体分析。
三是对基本假设的完善,就是补充或修正原有的假设。
模型的基本假设都是对实际问题的抽象和简化。至于简化是否合理,就是仁者见仁智者见智的事情了。通常来讲,经典模型、基本模型都是对广泛问题的抽象,结合具体实际问题的特色来考虑就显得不尽合理、完善,所以能够进行补充或修正。
例如,基本假设考察地区的总人数 N 不变,即不考虑生死或人口流动 。对于严重的、长期的疫情,也能够生死的影响。而疫情发生后人口流动几乎是必然的,也是疫情传播的主要途径,疫情防控的主要措施。所以,结合交通流大数据,考虑人流迁移的影响,是研究疫情传播重要内容。
又如,SEIR 模型中对日接触数、日发病率、日治愈率设定为常数,考虑新冠疫情的具体状况,这些参数能够是分段的(不一样人群、不一样阶段),能够是时变的,也能够是某种函数。
最后,须要指出的是,针对新冠疫情而对 SEIR 模型的改进,有的是很是重要并对结果产生重大影响的,例如潜伏期的传染性、对密切接触者的隔离、人员流动的影响;有的则不会有多大影响,反而使模型更为复杂,只能说也是一种探索和尝试吧。
可是,从数学建模和数模竞赛的角度来看,咱们是一个练习而不是研究,只要仔细观察、认真思考,就能对人群更加细分,对某种传播特性给出数学描述,从而提出本身的“改进的 SEIR模型“。再与现有 SEIR 模型作一些比较,与实际数据作一些比对,就很容易写出一篇“较高水平”的数模论文。
说白了,这就是为了改进而改进。但对于小白来讲,仍是颇有价值的训练。
考虑新冠疫情在潜伏期具备传染性,易感者(S 类)除了与患病者(I 类)有效接触而被感染,与潜伏者(E类)有效接触也有可能被感染而转变为潜伏者(E类)。
对 SEIR 模型增长假设:
能够创建以下微分方程:
得:
SEIR 模型的微分方程导数函数
def dySEIR(y, t, lamda, delta, mu): # SEIR 模型,导数函数 s, e, i = y ds_dt = - lamda*s*i # ds/dt = -lamda*s*i de_dt = lamda*s*i - delta*e # de/dt = lamda*s*i - delta*e di_dt = delta*e - mu*i # di/dt = delta*e - mu*i return np.array([ds_dt,de_dt,di_dt])
SEIR 改进模型的微分方程导数函数
def dySEIR2(y, t, lamda, lam2, delta, mu): # SEIR2 模型,导数函数 s, e, i = y ds_dt = - lamda*s*i - lam2*s*e # ds/dt = -lamda*s*i - lam2*s*e de_dt = lamda*s*i + lam2*s*e - delta*e # de/dt = lamda*s*i - delta*e di_dt = delta*e - mu*i # di/dt = delta*e - mu*i return np.array([ds_dt,de_dt,di_dt])
Python 能够直接对向量、向量函数进行定义和赋值,使程序更为简洁。但考虑读者主要是 Python 小白,又涉及到看着就心烦的微分方程组,因此咱们宁愿把程序写得累赘一些,便于读者将程序与前面的微分方程组逐项对应。
# modelCovid5_v1.py # Demo01 of mathematical modeling for Covid2019 # Improved SEIR model for epidemic diseases (改进的 SEIR 模型) # Copyright 2021 Youcans, XUPT # Crated:2021-06-16 # Python小白的数学建模课 @ Youcans # 1. SEIR2 模型,考虑潜伏期具备传染性 from scipy.integrate import odeint # 导入 scipy.integrate 模块 import numpy as np # 导入 numpy包 import matplotlib.pyplot as plt # 导入 matplotlib包 def dySEIR(y, t, lamda, delta, mu): # SEIR 模型,导数函数 s, e, i = y ds_dt = - lamda*s*i # ds/dt = -lamda*s*i de_dt = lamda*s*i - delta*e # de/dt = lamda*s*i - delta*e di_dt = delta*e - mu*i # di/dt = delta*e - mu*i return np.array([ds_dt,de_dt,di_dt]) def dySEIR2(y, t, lamda, lam2, delta, mu): # SEIR2 模型,导数函数 s, e, i = y ds_dt = - lamda*s*i - lam2*s*e # ds/dt = -lamda*s*i - lam2*s*e de_dt = lamda*s*i + lam2*s*e - delta*e # de/dt = lamda*s*i - delta*e di_dt = delta*e - mu*i # di/dt = delta*e - mu*i return np.array([ds_dt,de_dt,di_dt]) # 设置模型参数 number = 1e5 # 总人数 lamda = 1.0 # 日接触率, 患病者天天有效接触的易感者的平均人数 lam2 = 0.25 # 日接触率2, 潜伏者天天有效接触的易感者的平均人数 delta = 0.05 # 日发病率,天天发病成为患病者的潜伏者占潜伏者总数的比例 mu = 0.05 # 日治愈率, 天天治愈的患病者人数占患病者总数的比例 sigma = lamda / mu # 传染期接触数 fsig = 1-1/sigma tEnd = 200 # 预测日期长度 t = np.arange(0.0, tEnd, 1) # (start,stop,step) i0 = 1e-3 # 患病者比例的初值 e0 = 0 # 潜伏者比例的初值 s0 = 1-i0 # 易感者比例的初值 Y0 = (s0, e0, i0) # 微分方程组的初值 # odeint 数值解,求解微分方程初值问题 ySEIR = odeint(dySEIR, Y0, t, args=(lamda,delta,mu)) # SEIR 模型 ySEIR2 = odeint(dySEIR2, Y0, t, args=(lamda,lam2,delta,mu)) # SEIR2 模型 # 输出绘图 print("lamda={}\tmu={}\tsigma={}\t(1-1/sig)={}".format(lamda,mu,sigma,fsig)) plt.title("Comparison between SEIR and improved SEIR model") plt.xlabel('t-youcans') plt.axis([0, tEnd, -0.1, 1.1]) plt.plot(t, ySEIR2[:,0], '-g', label='s(t)-iSEIR') # 易感者比例 plt.plot(t, ySEIR2[:,1], '-b', label='e(t)-iSEIR') # 潜伏者比例 plt.plot(t, ySEIR2[:,2], '-m', label='i(t)-iSEIR') # 患病者比例 # plt.plot(t, 1-ySEIR2[:,0]-ySEIR2[:,1]-ySEIR2[:,2], '-b', label='r(t)-iSEIR') plt.plot(t, ySEIR[:,0], '--g', label='s(t)-SEIR') plt.plot(t, ySEIR[:,1], '--b', label='e(t)-SEIR') plt.plot(t, ySEIR[:,2], '--m', label='i(t)-SEIR') # plt.plot(t, 1-ySEIR[:,0]-ySEIR[:,1]-ySEIR[:,2], '--m', label='r(t)-SEIR') plt.legend(loc='upper right') # youcans plt.show()
上图是对 SEIR 改进模型与 SEIR模型结果的比较,图中实线为 SEIR 改进模型、虚线为 SEIR 模型,不一样颜色分别表示易感者比例 s(t)、潜伏者比例 e(t) 和患病者比例 i(t)。
图中,SEIR 改进模型潜伏者比例 e(t)、患病者比例 i(t) 出现的峰值比 SEIR 模型更早、更强,易感者比例 s(t) 下降的更快,但最终也都趋于稳定。这是因为 SEIR 改进模型假设潜伏者在潜伏期的日接触数 \(\lambda_2\),至关于在整体上增大了日接触数。所以SEIR 改进模型的结果,与在 SEIR 模型中增大日接触率 \(\lambda\) 的状况是相似的,能够参见《B5-SEIR疫情模型》中的图3.2。
上图中 SEIR 改进模型与 SEIR 模型的结果虽然有差异,但差异并不大。若是增大 SEIR 模型中的日接触率 \(\lambda\) ,也能获得相似的结果。换个角度看,若是用实际疫情数据来拟合模型参数,SEIR 模型也能达到很好地拟合,只是在估计的日接触率参数中反映了潜伏者的日接触数的影响。
但若是考虑对患病者进行隔离的防控措施,则状况将会出现很大变化。假设对患病者进行有效隔离——这是最基本、最广泛的传染病防控措施,使患病者的日接触率 \(\lambda\) 下降到未隔离时的20%,而潜伏者在潜伏期的日接触数 \(\lambda_2\)不变。
上图是对 SEIR 改进模型与 SEIR模型结果的比较,所用的模型和程序与上图相同,只是考虑对患病者进行有效隔离而将患病者的日接触率 \(\lambda\) 从 1.0 下降为 0.2。
此时,改进 SEIR 模型与 SEIR 模型的差别较上图显著增大。由于患病者的有效传染数因为隔离而大幅下降,SEIR模型中的疫情大为缓解。若是考虑实际上患病者隔离先后的日接触率的差别更大,采用更小的日接触率 \(\lambda\) ,则疫情很容易受到控制。
可是,在 SEIR 改进模型中,虽然患病者的有效传染数也因为隔离而下降,但潜伏者的有效传染数未受控制而不变,所以疫情较上图(患病者未隔离)虽有推迟和减轻,但仍然很是严重。
以上的分析说明:一方面,对于潜伏期具备传染性的传染病,必须使用 SEIR改进模型,考虑潜伏者的日接触数,才能更真实地反映疫情传播特色;另外一方面,在疫情防控中,不只要及时对患病者采起隔离措施,也要对潜伏者采起隔离措施,才能控制疫情,这就要求对潜伏者"早发现、早诊断、早隔离"。
对潜伏者采起隔离措施,就要求对潜伏者"早发现、早诊断、早隔离"。用考虑潜伏期传染性的 SEIR 改进模型对发现和隔离潜伏者的防控措施的效果进行模拟研究。
比较如下三种状况:(1)未采起防控措施,\(\lambda=1.0,\lambda2=0.25\);(2)对患病者采起隔离措施,但未对潜伏者采起隔离措施,\(\lambda=0.2,\lambda2=0.25\);(3)对患病者、潜伏者都采起隔离措施, \(\lambda=0.2,\lambda2=0.1\)。
上图是采用考虑潜伏期传染性的 SEIR 改进模型对 3 种状况下疫情传播的模拟结果,图中实线、虚线和点划线分别表示第 一、二、3 种状况,不一样颜色不一样颜色分别表示易感者、潜伏者和患病者的比例。
如 4.1 中的分析,对患病者采起隔离措施使患病者日接触数减少(虚线),疫情较未隔离患病者(实线)时有所减轻,潜伏者、患病者比例的波峰的开始时间、峰值时间推后,峰值高度下降,但疫情仍然很严重。
进一步对潜伏者也采起隔离措施使潜伏者日接触数减少(点划线),疫情较未隔离潜伏者时显著减弱,潜伏者、患病者比例的波峰的开始时间、峰值时间显著推迟,峰值高度下降,说明发现和隔离潜伏者的措施对疫情控制是有效和必要的。
【本节完】
参考文献:
版权声明:
欢迎关注『Python小白的数学建模课 @ Youcans』 原创做品
原创做品,转载必须标注原文连接:https://www.cnblogs.com/youcans/p/15020719.html。
Copyright 2021 Youcans, XUPT
Crated:2021-06-15
欢迎关注 『Python小白的数学建模课 @ Youcans』,每周更新数模笔记
Python小白的数学建模课-01.新手必读
Python小白的数学建模课-02.数据导入
Python小白的数学建模课-03.线性规划
Python小白的数学建模课-04.整数规划
Python小白的数学建模课-05.0-1规划
Python小白的数学建模课-06.固定费用问题
Python小白的数学建模课-07.选址问题
Python小白的数学建模课-09.微分方程模型
Python小白的数学建模课-B2.新冠疫情 SI模型
Python小白的数学建模课-B3.新冠疫情 SIS模型
Python小白的数学建模课-B4.新冠疫情 SIR模型
Python小白的数学建模课-B5.新冠疫情 SEIR模型
Python小白的数学建模课-B6.改进 SEIR疫情模型