使用R实现SEIS模型,模拟流行病传播过程
表1 模型参数含义
参数 | 含义 |
---|---|
β | 传染率 |
ω | 潜伏期速率 |
μ | 感染者转化为易感者的速率 |
α | 死亡率 |
S | 易感者 |
E | 暴露者 |
I | 感染者 |
$$
\begin{cases}
\frac{dS}{dt} &= -\beta S I + \mu I, \\
\frac{dE}{dt} &= \beta S I - \omega E, \\
\frac{dI}{dt} &= \omega E - (1 - \alpha) \mu I - \alpha I.
\end{cases}
$$
1.存在潜伏期:疾病需要有明确的潜伏期,即个体在被感染后的一段时间内尚未具有传染性,但已经感染病原体;
2.传染性在潜伏期结束后开始:潜伏期结束后,个体进入传染期,开始具备传染性;
3.所有个体接触感染概率相同,不考虑年龄、性别或其他异质性:SEIS模型假设人群是均匀混合的,即所有个体有均等机会与其他个体接触,且接触的频率和传染风险是相同的;
4.传染病通过人与人的接触传播:传染病应当是通过人与人的接触传播的疾病;
5.感染者恢复后不具有免疫力,而是成为易感者或死亡:在基本SEIS模型中,假设感染者在传染期后存在再次感染的风险,除非感染者死亡;
6.SEIS模型最适合于研究封闭或半封闭的环境,例如社区、学校、医院等场景。在这些环境中,人口的流动性较低,个体之间的接触较频繁,更符合模型的均匀混合假设,并且适合较短时间尺度的传播;
7.疾病传播率相对稳定:SEIS模型假设传播率是常数,即疾病在人群中的传播速度是恒定的;
8.无外部干预:SEIS模型的适用场景一般是假设没有外部干预(如疫苗接种、隔离、治疗等)。
易感者初始比例:99% ,易感者初始比例:0%,感染者初始比例:1% ,传染期速率β
设置为 0.6,潜伏期速率ω
设置为 0.8,感染者转化为易感者速率μ
设置为0.15,死亡速率α
设置为0.05,模拟天数为100天。
library(deSolve)
library(ggplot2)
# 定义SEIS模型的微分方程
SEIS <- function(time, state, pars) {
with(as.list(c(state, pars)), {
dS <- -beta * S* I +mu * I
dE <- beta *S *I - omega *E
dI <- omega * E - (1-alpha) * mu*I-alpha *I
list(c(dS, dE, dI))
})
}
#设置初始参数
S0 =0.99 #期初易感者比例
E0 <- 0 #最初暴露者比例
I0 <- 0.01 #最开始的感染者比例
init <- c(S=S0,E=E0,I=I0)
time <- seq(0,100,by=1) #时间设置100天
#设置各种参数
pars <- c(
beta= 0.6,
omega= 0.8,
mu=0.15,
alpha=0.05
)
#结果展示
res.SEIS <- as.data.frame(lsoda(y=init,times=time,func=SEIS,parms=pars))
ggplot(res.SEIS, aes(x = time)) +
geom_line(aes(y = S, color = "易感者 (S)")) +
geom_line(aes(y = E, color = "暴露者 (E)")) +
geom_line(aes(y = I, color = "感染者 (I)")) +
labs(x = "时间 (t)", y = "人数比例",
title = "SEIS模型:流行病传播模拟",
color = "群体类别") +
theme_minimal() +
theme(legend.position = "top") +
scale_colour_manual(values = c(
"易感者 (S)" = "cornflowerblue",
"暴露者 (E)" = "orange",
"感染者 (I)" = "darkred"
)) +
scale_y_continuous(name = '人数比例') +
labs(x = '时间(天)')
总人口数不变的情况下,引入人口出生对于传染病传播的影响
#模型公式
SEIS <- function(time, state, pars) {
with(as.list(c(state, pars)), {
N <- S + E + I
dS <- -beta * S * I + mu * I - gamma * N
dE <- beta * S * I - omega * E
dI <- omega * E - (1-alpha) * mu*I-alpha *I
list(c(dS, dE, dI))
})
}
#设置初始参数
S0 =0.99 #期初易感者比例
E0 <- 0 #最初暴露者比例
I0 <- 0.01 #最开始的感染者比例
init <- c(S=S0,E=E0,I=I0)
time <- seq(0,60,by=1) #时间设置60天
#设置参数
pars <- c(
beta= 0.6,
omega= 0.8,
mu=0.15,
alpha=0.05,
gamma=0.01
)
#计算公式带入
res.SEIS <- as.data.frame(lsoda(y=init,times=time,func=SEIS,parms=pars))
#绘图
ggplot(res.SEIS, aes(x = time)) +
geom_line(aes(y = S, color = "易感者 (S)")) +
geom_line(aes(y = E, color = "暴露者 (E)")) +
geom_line(aes(y = I, color = "感染者 (I)")) +
labs(x = "时间 (t)", y = "人数比例",
title = "加入出生率后流行病传播模拟",
color = "群体类别") +
theme_minimal() +
theme(legend.position = "top") +
scale_colour_manual(values = c(
"易感者 (S)" = "cornflowerblue",
"暴露者 (E)" = "orange",
"感染者 (I)" = "darkred"
)) +
scale_y_continuous(name = '人数比例') +
labs(x = '时间(天)')
通过仿真结果,可以观察到随着时间的推移,感染者比例会先上升,易感者会下降,并随着时间的增加,暴露者、感染者会转变为易感者后的人数逐渐下降,但由于有死亡人数,所以易感者后续持续稳定,加入出生率后,可以看出随着出生率的增加,感染者的感染人数较未加入出生率的起伏降低,并有持续下降。