SIR SIRE 传染病预测模型与代码应用之概念篇

SIR模型概念

看到网上很多人在讲新冠肺炎的预测模型,主流的是SIR 与 SIRE, 这里大致记录一下我对传染病模型的理解。之后会陆续补充该模型的应用,扩展,以及code。

一、SIR的由来(网络资料):
该模型最早是在1760年于Daniel Bernoulli对于天花预防的研究中有所提到。该模型具体被引入是20世纪初基于Hamer、Ross等人在建立传染病数学模型的研究中做出了大量的工作,直到1927年Kermack与McKendrick在研究流行于伦敦的黑死病时提出了的SIR仓室模型。

二、数学模型:
1.Standard SIR Model:
在该模型中我们假设该病毒是发生在短时间内,因此我们不考虑该人群的出生率与死亡率以及流动性,也就是说人口数不变。
我们可以用一张图来表示标准的SIR模型:
引用于IDM
基于该图示我们可以了解到,SIR主要用来模拟一个系统中人群的感染-康复情况。

即 S 人群基于被感染系数 β 被转换为I,然后 I 人群基于康复系数 γ 被转换为 R人群。在免疫/抗体经过一定时间有可能消失的情况下,R 人群有可能会变回 S 人群(基于免疫消失系数:δ)。当你考虑到免疫消失系数 δ 后,这就是一个SIRS模型,很简单。

首先定义Variables:
S (Susceptible): 所有可能被感染的人。
I (Infectious):被感染者,同时具有能力向S传播病毒。
R(Recovered):康复者,具有抗体。
β( effective contact rate):被感染系数。
γ(removal rate):康复系数。
δ(loss of immunity):免疫消失系数。
N:模型中总的人数。
t:模型中的时间单位。

好,根据这些变量,我们可以将SIR模型的积分方程 (differential equation) 写出来:

d S d t = − β S I N \frac{dS}{dt}=-\frac{\beta SI}{N} dtdS=NβSI
d I d t = β S I N − γ I \frac{dI}{dt}= \frac{\beta SI}{N}-\gamma I dtdI=NβSIγI
d I d t = γ I \frac{dI}{dt}=\gamma I dtdI=γI
Note:该积分方程是用来表示3个阶段中人群向其他阶段转换速度的3个rate。
在这里插入图片描述

很明显在不考虑失去免疫的情况下,S(可被感染人群)的数量会一直下降。此外,如果 d I d t > 0 \frac{dI}{dt}>0 dtdI>0则I呈现正增长(被感染人群持续增加),大流行就会爆发。展开该不等式:
d I d t = β S I N − γ I > 0 \frac{dI}{dt}= \frac{\beta SI}{N}-\gamma I >0 dtdI=NβSIγI>0
β S I N γ > I \frac{\beta SI}{N\gamma} >I NγβSI>I
在病毒爆发的初期我们可以假设每个人都有可能被感染,即 S(可能被感染人群)=N(总人群), 简化后方程为:
R 0 = β γ > 1 R_{0}= \frac{\beta }{\gamma} >1 R0=γβ>1
也就是说当R0大于1是,被感染人群会持续增加,病毒就会爆发式传染。
此外,对I的微分方程进行integral,我们可以得到:
I ( t ) ← e ( β S N − γ ) t I(t)\leftarrow e^{( \beta \frac{S}{N}-\gamma)t } I(t)e(βNSγ)t
可以理解为当R0大于1时,被感染人数将会呈指数型增长。

R0: The basic reproduction number, R0, is defined as the expected number of secondary cases
produced by a single (typical) infection in a completely susceptible population. ------ Jones Stanford University

抑制传染病的方法
那基于这个方程,我们有什么办法降低爆发的概率吗?
我们可以从三个方面出发:
1)降低被感染系数 β,比如勤洗手,戴口罩。
2)增加康复系数 γ,比如特效药。
3)在上面的方程中我们假设S=N,现实中我们可以通过接种疫苗的方式来使越来越多的人群在被感染前获得免疫力,如接种疫苗。

以上便是SIR模型,理解了SIR模型剩下的几种模型都是换汤不换药。

*Reference:
The SIR Model for Spread of Disease - The Differential Equation Model
Author(s): David Smith and Lang Moore
url:https://www.maa.org/press/periodicals/loci/joma/the-sir-model-for-spread-of-disease-the-differential-equation-model

  • 6
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是 MATLAB 中实现 SI、SIS、SIRSIRP 模型代码示例: SI 模型: ```matlab function [t, y] = SI_Model(beta, gamma, I0, N, t_end) % 变量说明: % beta:传染率 % gamma:恢复率 % I0:初始感染人数 % N:总人口数 % t_end:模拟时间 % 设置初始状态 S0 = N - I0; y0 = [S0; I0]; % 定义ODE函数 f = @(t, y) [-beta * y(1) * y(2)/N; beta * y(1) * y(2)/N - gamma * y(2)]; % 模拟ODE [t, y] = ode45(f, [0, t_end], y0); % 绘制结果 plot(t, y(:,1), 'b-', t, y(:,2), 'r-'); xlabel('时间'); ylabel('人数'); legend('易感者', '感染者'); title(['SI模型(beta=', num2str(beta), ', gamma=', num2str(gamma), ', I0=', num2str(I0), ')']); ``` SIS 模型: ```matlab function [t, y] = SIS_Model(beta, gamma, I0, N, t_end) % 变量说明: % beta:传染率 % gamma:恢复率 % I0:初始感染人数 % N:总人口数 % t_end:模拟时间 % 设置初始状态 S0 = N - I0; y0 = [S0; I0]; % 定义ODE函数 f = @(t, y) [-beta * y(1) * y(2)/N + gamma * y(2); beta * y(1) * y(2)/N - gamma * y(2)]; % 模拟ODE [t, y] = ode45(f, [0, t_end], y0); % 绘制结果 plot(t, y(:,1), 'b-', t, y(:,2), 'r-'); xlabel('时间'); ylabel('人数'); legend('易感者', '感染者'); title(['SIS模型(beta=', num2str(beta), ', gamma=', num2str(gamma), ', I0=', num2str(I0), ')']); ``` SIR 模型: ```matlab function [t, y] = SIR_Model(beta, gamma, I0, N, t_end) % 变量说明: % beta:传染率 % gamma:恢复率 % I0:初始感染人数 % N:总人口数 % t_end:模拟时间 % 设置初始状态 S0 = N - I0; R0 = 0; y0 = [S0; I0; R0]; % 定义ODE函数 f = @(t, y) [-beta * y(1) * y(2)/N; beta * y(1) * y(2)/N - gamma * y(2); gamma * y(2)]; % 模拟ODE [t, y] = ode45(f, [0, t_end], y0); % 绘制结果 plot(t, y(:,1), 'b-', t, y(:,2), 'r-', t, y(:,3), 'g-'); xlabel('时间'); ylabel('人数'); legend('易感者', '感染者', '康复者'); title(['SIR模型(beta=', num2str(beta), ', gamma=', num2str(gamma), ', I0=', num2str(I0), ')']); ``` SIRP 模型: ```matlab function [t, y] = SIRP_Model(beta, gamma, mu, I0, N, t_end) % 变量说明: % beta:传染率 % gamma:恢复率 % mu:病死率 % I0:初始感染人数 % N:总人口数 % t_end:模拟时间 % 设置初始状态 S0 = N - I0; R0 = 0; P0 = 0; y0 = [S0; I0; R0; P0]; % 定义ODE函数 f = @(t, y) [-beta * y(1) * y(2)/N; beta * y(1) * y(2)/N - (gamma + mu) * y(2); gamma * y(2); mu * y(2)]; % 模拟ODE [t, y] = ode45(f, [0, t_end], y0); % 绘制结果 plot(t, y(:,1), 'b-', t, y(:,2), 'r-', t, y(:,3), 'g-', t, y(:,4), 'k-'); xlabel('时间'); ylabel('人数'); legend('易感者', '感染者', '康复者', '死亡者'); title(['SIRP模型(beta=', num2str(beta), ', gamma=', num2str(gamma), ', mu=', num2str(mu), ', I0=', num2str(I0), ')']); ``` 以上是实现 SI、SIS、SIRSIRP 模型的 MATLAB 代码示例,您可以根据需要进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值