SEIS模型

使用R实现SEIS模型,模拟流行病传播过程


日期

SEIS模型:

1 概述

1.1 模型假设:

易感者(Susceptible)、暴露者(Exposed)、感染者(Infectious),基本原理是通过一定的传播速率和潜伏期速率来描述易感个体被感染后,成为感染者被治愈后又转化为易感者的过程。假设所有个体在群体中是均匀混合的,即每个个体与其他人接触的概率是相等的,并且没有特定的空间、地理、社会等因素影响个体的接触模式。人群是封闭的,没有新的人口加入,也没有个体离开(不考虑出生、死亡、移民等影响)。易感者与感染者接触的概率是固定的,每个感染者与易感者接触后,会以一定概率将疾病传给易感者。潜伏期(即从暴露到感染的时间)是固定的,在潜伏期阶段,个体虽然被感染,但没有传染性。SEIS模型考虑感染者治愈后不具有免疫力,从而直接转换为易感者或直接死亡。

1.2 模型描述:

SEIS模型三类个体:易感者(S):尚未感染但易感的个体;暴露者(E):人群中已经被感染但尚未表现出症状或不具有传染性的个体;感染者(I):已经感染并能够传播疾病的个体。

1.3 模型仓室及参数含义

表1 模型参数含义

参数 含义
β 传染率
ω 潜伏期速率
μ 感染者转化为易感者的速率
α 死亡率
S 易感者
E 暴露者
I 感染者

2 模型流程图及方程

$$ \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} $$

3 适用疾病流行条件:

1.存在潜伏期:疾病需要有明确的潜伏期,即个体在被感染后的一段时间内尚未具有传染性,但已经感染病原体;

2.传染性在潜伏期结束后开始:潜伏期结束后,个体进入传染期,开始具备传染性;

3.所有个体接触感染概率相同,不考虑年龄、性别或其他异质性:SEIS模型假设人群是均匀混合的,即所有个体有均等机会与其他个体接触,且接触的频率和传染风险是相同的;

4.传染病通过人与人的接触传播:传染病应当是通过人与人的接触传播的疾病;

5.感染者恢复后不具有免疫力,而是成为易感者或死亡:在基本SEIS模型中,假设感染者在传染期后存在再次感染的风险,除非感染者死亡;

6.SEIS模型最适合于研究封闭或半封闭的环境,例如社区、学校、医院等场景。在这些环境中,人口的流动性较低,个体之间的接触较频繁,更符合模型的均匀混合假设,并且适合较短时间尺度的传播;

7.疾病传播率相对稳定:SEIS模型假设传播率是常数,即疾病在人群中的传播速度是恒定的;

8.无外部干预:SEIS模型的适用场景一般是假设没有外部干预(如疫苗接种、隔离、治疗等)。

4 代码(R)

4.1 条件设定

易感者初始比例:99% ,易感者初始比例:0%,感染者初始比例:1% ,传染期速率β 设置为 0.6,潜伏期速率ω设置为 0.8,感染者转化为易感者速率μ设置为0.15,死亡速率α设置为0.05,模拟天数为100天。

4.2 代码

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 = '时间(天)') 

图1 模型仿真结果图

5 扩展

总人口数不变的情况下,引入人口出生对于传染病传播的影响

#模型公式
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 = '时间(天)') 

图2 扩展模型仿真结果图

结果说明

通过仿真结果,可以观察到随着时间的推移,感染者比例会先上升,易感者会下降,并随着时间的增加,暴露者、感染者会转变为易感者后的人数逐渐下降,但由于有死亡人数,所以易感者后续持续稳定,加入出生率后,可以看出随着出生率的增加,感染者的感染人数较未加入出生率的起伏降低,并有持续下降。

陈佳颖
兜兜牌助听器持有者