使用R实现SEI模型,模拟流行病传播过程
易感者(Susceptible)、暴露者(Exposed)、感染者(Infectious),基本原理是通过一定的传播速率和潜伏期速率来描述易感个体被感染的过程假设所有个体在群体中是均匀混合的,即每个个体与其他人接触的概率是相等的,并且没有特定的空间、地理、社会等因素影响个体的接触模式。人群是封闭的,没有新的人口加入,也没有个体离开(不考虑出生、死亡、移民等影响)。易感者与感染者接触的概率是固定的,每个感染者与易感者接触后,会以一定概率将疾病传给易感者。潜伏期(即从暴露到感染的时间)是固定的,在潜伏期阶段,个体虽然被感染,但没有传染性。同时,SEI模型不考虑康复后的免疫效果,个体一旦离开感染者状态便不再具有传染性,并假设不再受到再次感染的风险传染病的传播完全依赖于人群内的接触,没有从外界引入新的感染者。
SEI模型三类个体:易感者(S):尚未感染但易感的个体;暴露者(E):人群中已经被感染但尚未表现出症状或不具有传染性的个体;感染者(I):已经感染并能够传播疾病的个体。
表1 模型参数含义
参数 | 含义 |
---|---|
β | 传染率 |
ω | 潜伏期速率 |
S | 易感者 |
E | 暴露者 |
I | 感染者 |
$$
\begin{cases}
\frac{dS}{dt} = -\beta S I \\
\frac{dE}{dt} = \beta S I - \omega E \\
\frac{dI}{dt} = \omega E
\end{cases}
$$
1.存在潜伏期:疾病需要有明确的潜伏期,即个体在被感染后的一段时间内尚未具有传染性,但已经感染病原体;
2.传染性在潜伏期结束后开始:潜伏期结束后,个体进入传染期,开始具备传染性;
3.所有个体接触感染概率相同:SEI模型假设人群是均匀混合的,即所有个体有均等机会与其他个体接触,且接触的频率和传染风险是相同的;
4.传染病通过人与人的接触传播:传染病应当是通过人与人的接触传播的疾病,例如呼吸道传播(如麻疹、SARS、COVID-19)、体液接触传播(如艾滋病、埃博拉病毒)等。对于通过动物或其他媒介传播的疾病,可能需要更复杂的模型(如SEIR模型或带有媒介因素的模型);
5.感染者恢复后不立即再感染:在基本SEI模型中,假设感染者在传染期后不会立即再次感染,通常默认感染者已经康复或退出了流行病传播过程;
6.人口相对稳定,封闭群体:SEI模型通常假设总人口是封闭的,不考虑出生、死亡或移民等影响。这意味着模型最适合用于相对短时间内观察疾病传播的情况,或用于对封闭社区进行流行病学分析;
7.病程较短且感染期明确:SEI模型更适合那些病程较短,且传染期和潜伏期相对明确的疾病;
8.疾病传播率相对稳定:SEI模型假设传播率是常数,即疾病在人群中的传播速度是恒定的。
易感者初始比例:99% ,暴露者初始比例:0%,感染者初始比例:1% ,传染期速率β
设置为 0.8,潜伏期速率ω
设置为 0.1,模拟天数为 80天。
library(ggplot2)
library(deSolve)
# 定义SEI模型的微分方程
SEI <- function(time, state, pars) {
with(as.list(c(state, pars)), {
dS <- -beta * S * I # 易感者S的变化率
dE <- beta * S * I - omega * E # 暴露者E的变化率
dI <- omega * E
list(c(dS, dE, dI))
})
}
#模拟过程
S0 =0.99 #期初易感者比例
E0 <- 0 #最初暴露者比例
I0 <- 0.01 #最开始的感染者比例
init <- c(S=S0,E=E0,I=I0)
time <- seq(0,80,by=1) #模拟天数为80天
#设置参数,模拟流行传播
pars <- c(
beta = 0.8, #传染率
omega = 0.1 #潜伏期转化率
)
res.SEI <- as.data.frame(lsoda(y=init,times=time,func=SEI,parms=pars))
ggplot(res.SEI, 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 = "SEI模型:流行病传播模拟",
color = "群体类别") +
theme_minimal() +
theme(legend.position = "top") +
scale_colour_manual(values = c(
"易感者 (S)" = "cornflowerblue",
"暴露者 (E)" = "orange",
"感染者 (I)" = "darkred"
)) +
scale_y_continuous(name = '人数比例') +
labs(x = '时间(天)')
引入疫苗接种策略,对于易感者进行疫苗接种,从而使得部分易感者转化为免疫人群,从而不被感染,并且减少易感者转为暴露者的概率
SEI <- function(time, state, pars) { with(as.list(c(state, pars)), {
dS<- -beta * S * I - v * S # 添加疫苗接种率
dE <- beta * S * I -omega * E
dI <- omega * E
list(c(dS, dE, dI))
}) }
# 模拟过程
S0 <- 0.9 # 期初易感者比例
E0 <- 0 # 期初潜伏者比例
I0 <- 0.01 #期初感染者比例
init <- c(S = S0, E = E0, I = I0)
time <- seq(0, 80, by= 1) # 模拟天数为80天
# 设置参数,模拟流行传播
pars <- c( beta = 0.6, # 传染率
omega = 0.1, # 潜伏期转化率
v = 0.1 # 接种率
)
# 运行模型
res.SEI <- as.data.frame(lsoda(y = init, times = time, func = SEI,parms = pars))
# 结果分析
ggplot(res.SEI, 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 = "时间 (天)", y = "人数比例", title= "SEI模型:疫苗接种后传播模拟", color = "群体类别") +
theme_minimal() +theme(legend.position = "top") +
scale_colour_manual(values = c( "易感者(S)" = "cornflowerblue", "暴露者 (E)" = "orange", "感染者 (I)" ="darkred" )) +
scale_y_continuous(name = "人数比例") + labs(x = "时间(天)")
通过仿真结果,可以观察到随着时间的推移,感染者比例会上升,易感者会下降,暴露者在前期先增后减,后易感者减少,由于感染者感染后具有免疫力,不再变为易感者,所以使得感染者逐渐趋近于总人口数。 后加入疫苗接种后,易感者具有免疫力,从而可以减少初期易感者的人数,从而减少S-E-I的人数,从图中可以看出感染者的感染人数比例下降。