X00132-用R语言解读传染病传播模型源码 传染病模型原理:自由增长模型、SI模型、SIS模型、SIR模型 用R语言手动实现 基于EpiModel包的自动化实现 如何获取新冠数据 北京的数据带入模型预测

在传染病研究领域,通过模型来理解疾病传播动态至关重要。今天咱们就用R语言深入探讨几种常见传染病模型的源码实现,包括自由增长模型、SI模型、SIS模型和SIR模型。

传染病模型原理

自由增长模型

自由增长模型假设在无任何限制条件下,感染人数呈指数增长。数学表达式为$dI/dt = \beta I$,其中$I$是感染人数,$\beta$是感染率。这个模型相对简单,但它是理解传染病初期增长态势的基础。

SI模型

SI模型将人群分为易感者(S)和感染者(I)两类。其核心方程为:

\[

\frac{dS}{dt} = -\beta S I \\

\frac{dI}{dt} = \beta S I

\]

这里$\beta$同样是感染率,模型假设易感者与感染者接触后会以一定概率被感染,且感染者不会恢复或死亡。

SIS模型

SIS模型在SI基础上,增加了感染者恢复后重新成为易感者的设定。方程如下:

\[

\frac{dS}{dt} = -\beta S I + \gamma I \\

\frac{dI}{dt} = \beta S I - \gamma I

X00132-用R语言解读传染病传播模型源码 传染病模型原理:自由增长模型、SI模型、SIS模型、SIR模型 用R语言手动实现 基于EpiModel包的自动化实现 如何获取新冠数据 北京的数据带入模型预测

\]

$\gamma$代表恢复率,意味着感染者恢复健康后又回到易感人群。

SIR模型

SIR模型更为复杂,把人群分为易感者(S)、感染者(I)和康复者(R)。其方程为:

\[

\frac{dS}{dt} = -\beta S I \\

\frac{dI}{dt} = \beta S I - \gamma I \\

\frac{dR}{dt} = \gamma I

\]

康复者获得了免疫力,不再易感,从感染循环中移除。

用R语言手动实现

以SIR模型为例,我们来手动实现一下。

# 定义参数
beta <- 0.2  # 感染率
gamma <- 0.1 # 恢复率
N <- 1000    # 总人数
I0 <- 1      # 初始感染人数
S0 <- N - I0 # 初始易感人数
R0 <- 0      # 初始康复人数
days <- 100  # 模拟天数

# 创建数据框存储结果
result <- data.frame(day = 0, S = S0, I = I0, R = R0)

# 迭代模拟
for (i in 1:days) {
  dS <- -beta * result$S[i] * result$I[i] / N
  dI <- beta * result$S[i] * result$I[i] / N - gamma * result$I[i]
  dR <- gamma * result$I[i]
  
  S_next <- result$S[i] + dS
  I_next <- result$I[i] + dI
  R_next <- result$R[i] + dR
  
  new_row <- data.frame(day = i, S = S_next, I = I_next, R = R_next)
  result <- rbind(result, new_row)
}

# 绘图
library(ggplot2)
ggplot(result, aes(x = day)) +
  geom_line(aes(y = S, color = "Susceptible")) +
  geom_line(aes(y = I, color = "Infected")) +
  geom_line(aes(y = R, color = "Recovered")) +
  labs(title = "SIR Model Simulation",
       x = "Days",
       y = "Number of People",
       color = "Group")

代码分析:首先我们定义了模型所需的参数,如感染率、恢复率、总人数、初始感染、易感和康复人数,以及模拟天数。接着创建一个数据框result来存储每一天的状态。在循环中,根据SIR模型的方程计算每一天易感者、感染者和康复者数量的变化,并更新数据框。最后用ggplot2包绘图展示结果。

基于EpiModel包的自动化实现

EpiModel包提供了更便捷的方式来实现传染病模型。

library(EpiModel)

# 定义参数
param <- param.net(inf.prob = 0.2, rec.rate = 0.1)
init <- init.net(i.num = 1, s.num = 999)
net <- network.initialize(1000)

# 运行SIR模型
mod <- netsim(net, param, init, type = "SIR")

# 绘图
plot(mod)

代码分析:加载EpiModel包后,我们通过param.net定义模型参数,init.net设置初始状态,network.initialize初始化网络结构。然后使用netsim函数运行SIR模型,并直接用plot函数绘制结果。EpiModel包大大简化了模型实现过程,适合快速进行模拟分析。

如何获取新冠数据

获取新冠数据可以通过多种途径,比如约翰霍普金斯大学的公开数据仓库。可以使用Rhttr包来请求数据。

library(httr)
url <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
response <- GET(url)
data <- read.csv(text = content(response, "text"))

代码分析:先加载httr包,定义数据的URL地址,用GET函数发送请求获取数据,最后用read.csv将获取的文本数据转换为数据框格式。

北京的数据带入模型预测

假设我们已经从上述方式获取到北京的新冠确诊数据,我们可以将其处理后带入之前的模型进行预测。但实际操作中,还需考虑数据的清洗、时间序列处理等步骤。

# 假设data是获取到的包含北京数据的数据框
beijing_data <- data[data$Province.State == "Beijing", ]
# 对数据进行处理,例如提取时间序列数据
time_series <- as.numeric(t(beijing_data[,-(1:4)]))

# 这里简单假设我们用自由增长模型来预测
# 拟合数据得到感染率beta
# 实际中这需要更复杂的统计方法,这里只是示例
beta_est <- mean(diff(time_series) / time_series[-length(time_series)])

# 预测未来10天
days_to_predict <- 10
prediction <- numeric(days_to_predict)
prediction[1] <- time_series[length(time_series)]
for (i in 2:days_to_predict) {
  prediction[i] <- prediction[i - 1] * (1 + beta_est)
}

代码分析:先从总的数据中筛选出北京的数据,提取确诊人数的时间序列。然后简单估计了自由增长模型中的感染率beta(实际中需要更严谨的统计方法),最后根据自由增长模型预测未来10天的确诊人数。

通过R语言,我们不仅能深入理解传染病模型的原理,还能利用各种工具实现模型、获取数据并进行预测,为传染病防控提供有力支持。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐