作者:Anderson

翻译:郑金鑫  中国疾病预防控制中心,流行病与卫生统计专业

目前许多国家都出现相应的疫苗问题,丹麦爆发了5例麻疹后,疫苗问题再次成为热点。与日本爆发的麻疹疫情相比,丹麦的疫情不算严重。但是当地卫生部仍然警惕,可能会发生潜在的疾病流行。在这里,我们将使用Shiny创建一个应用程序,描述疫苗接种对传染病的影响过程。在Shiny应用程序中,我们增加了参数选项,用户可自己调试不同参数,以观察疫苗接种对传染病暴发的影响。希望该程序能够加深人们对疫苗接种的认识。

SIR疾病传播类型

susceptible-infectious-recovered (SIR)疾病传播模型是最简单,最经典的一种刻画疾病传播的模型,它可成功用于描述麻疹,流感,水痘,腮腺炎和风疹的疾病爆发。 SIR模型可通过改变参数进行扩展,以适应早期感染或疫苗接种引起的疾病传播。已有大量文献记录了可在R中实现SIR模型,因此在本文我们将在前期工作基础上,基于SIR模型添加一个额外的参数以描述接种疫苗的个体在传播中的作用,并在Shiny应用程序中实现所有内容。

我们将使用4个参数的SIR模型,假设某一群体中的人群可分为4类:易感人群(S),已感染人群(I),恢复人群(R)和免疫接种人群(V)个人。已经感染的人群在开始阶段非常少,因为疾病的传播是由具有传染性的病人传播至他人导致感染人群增加,R中的初始人数为0,因为开始疾病传播开始阶段,并没有发展到治愈阶段。剩下的人群都属于S(之前没有患过疾病)或V(接种疫苗/具有免疫力)。设置如下图所示。将V添加到SIR模型中可以减少疾病的传播,因为如果疾病已经免疫或接种疫苗,它就不会感染与之接触的个体。

SIR模型的这种扩展可用于模拟与解释传染性疾病的传播,在模型中,我们将忽视死于其他原因的疾病,新疫苗接种人数及该人群新增人口也一并忽略。该模型的最重要的前提条件是,总人口规模在一段时间内是恒定的,而且传播率β和γ在这段时间内是恒定的,并且该人群中的任何人都可以与其他任何人接触。要计算爆发的最后效果,我们需要为模型设置一些初始参数。直接影响模型的参数有:

  • β - 从S到I的转变率。该比率定义为基本生殖数R0除以感染期(即,每个病人每天有效接触的平均人数)

  • γ-从I到R的转变率。该值是疾病期的倒数,因为一旦疾病期结束,该个体将自动转移到R组。

因此,我们在shiny应用程序中,设置了以下参数。

  • 基本生殖数R0–每个感染者可能感染的平均个体数,即疾病的传染性

  • 感染期

  • 人口数量

  • 最初感染的人数

  • 具有免疫个体的比例V. 如果不是100%,则该百分比应乘以疫苗有效性。

  • 要考虑的时间范围

SIR 公式

下面的代码中显示了这些初始参数的示例

 1# Set parameters 2timeframe <- 200    # Look at development over 200 days 3pinf <- 5           # Initial number of infected persons 4popsize <- 5700000  # Population size (5.7 mio in Denmark) 5pvac <- .90         # Proportion vaccinated 6vaceff <- .95       # Effectiveness of vaccine 7connum <- 15        # R0, the reproductive number. 15 is roughly measles 8infper <- 14        # Infection period, 14 days 910# Compute the proportions in each of the compartments at11# the initial outbreak12init <- c(S = 1 - pinf / popsize - pvac * vaceff,13          I = pinf / popsize,14          R = 0,15          V = pvac * vaceff 16         )1718# First set the parameters for beta and gamma19parameters <- c(beta = connum / infper,20                gamma = 1 / infper)21## Time frame22times      <- seq(0, timeframe, by = .2)

基于上面概述的模型,我们现在可以设置以下一组耦合微分方程

如果βS(t)-γ> 0那么受感染的个体数量将增加且疾病将暴发。如果βS(t)-γ<0,则感染的数量将减少,且疾病停止流行。请注意,由于S(t)随着时间的推移而减少,暴发最终将自行消失,因为当前大多数人口集中在恢复组中,从易感人群组进入回复组,不在感染疾病。现在我们准备定义描述传染病传播过程的微分方程。将传染的过程公式化,当前的时间点,time,当前状态 state(即,4个人群)和参数parameters。

 1## Create a SIR function with an extra V component 2sirv <- function(time, state, parameters) { 3  with(as.list(c(state, parameters)), { 4    dS <- -beta * S * I 5    dI <-  beta * S * I - gamma * I 6    dR <-                 gamma * I 7    dV <- 0 8    return(list(c(dS, dI, dR, dV))) 9  })10}

一旦我们有了sirv()函数,我们就可以使用deSolve包中的ode()函数来求解耦合微分方程。

 1library("deSolve") 2 3## Solve the set of coupled differential equations 4out <- ode(y = init, 5           times = times, 6           func = sirv, 7           parms = parameters 8          ) 9head(as.data.frame(out))10##   time         S            I            R     V11## 1  0.0 0.1449991 8.771930e-07 0.000000e+00 0.85512## 2  0.2 0.1449991 8.920417e-07 1.263739e-08 0.85513## 3  0.4 0.1449991 9.071419e-07 2.548870e-08 0.85514## 4  0.6 0.1449990 9.224976e-07 3.855756e-08 0.85515## 5  0.8 0.1449990 9.381132e-07 5.184763e-08 0.85516## 6  1.0 0.1449990 9.539932e-07 6.536268e-08 0.855

基本生殖数R0的值取决于传染病类型的种类,下表中看到.R0的大值意味着该疾病具有高度传染性。

常见传染病的基本生殖基数R0

现在具备一切条件后,我们只需要将它整合到Shiny应用程序中,可方便轻松访问,并且允许用户尝试设置不同的参数值来查看其疾病的后果。查看结果的一种方法是绘制四个群体中每个群体的人口比例:

 1library("ggplot2") 2library("tidyverse") 3ldata <- as.data.frame(out) %>% gather(key, value, -time)  4head(ldata) 5##   time key     value 6## 1  0.0   S 0.1449991 7## 2  0.2   S 0.1449991 8## 3  0.4   S 0.1449991 9## 4  0.6   S 0.144999010## 5  0.8   S 0.144999011## 6  1.0   S 0.144999012#plot13ggplot(data=ldata, 14       aes(x = time,15           y = value,16           group = key,17           col = key18           )) + 19      ylab("Proportion of full population") + xlab("Time (days)") +20      geom_line(size = 2) + 21      scale_colour_manual(values = c("red", "green4", "black", "blue")) +22      scale_y_continuous(labels = scales::percent, limits = c(0, 1))

该图显示了传染病模型的结果以及随时间各人群所占的比例。有趣的是观察到的易感性比例下降的程度(以及多快)。蓝线显示接种疫苗/先前免疫个体的实际比例,在该模型中它一直保持不变。当疾病暴发时,恢复组中的新个体将被进入到免疫组中。还可以计算显示爆发影响的简单统计数据。

1# Proportion of full population that got the 2# disease by end of time frame3ldata %>% filter(time == max(time), key=="R") %>% 4          mutate(prop = round(100 * value, 2))5## Warning: package 'bindrcpp' was built under R version 3.5.26##   time key     value  prop7## 1  200   R 0.1137451 11.37

在这里,我们可得出当疾病暴发时,约11.37%的人口患有此病。我们还可以计算患有疾病的易感人群的比例。

1# Proportion of susceptible that will get 2# the disease by end of time frame3as.data.frame(out) %>% filter(row_number() == n()) %>% 4          mutate(res = round(100*(R + I) / (S + I + R), 2)) %>% pull(res)5## [1] 81.84

如何预防疾病的流行

R0表示受感染者将感染的人数。如果这个数字小于1,那么爆发将自行消失,如果R0> 1则爆发流行病。群体免疫力是接种/免疫人数所占的百分比,与R0密切相关。我们可以直接计算这些数字:

1# Proportion of population that need to be 2# immune for herd immunity3round(100 * (1 - 1 / (connum)), 2)4## [1] 93.33

因此,当R0 = 15时,从第1天开始需要93.33%的免疫力。第1天的有效R0是根据已经免疫的人数按比例缩小的疾病的R0。尽管这里的基本生殖数是R0 = 15,但由于免疫和接种疫苗的个体数量,感染者感染的个体的有效数量仅为2.18。但是,由于这个数字大于1,它仍然会变成爆发。

在评估疫苗接种的影响时,需要考虑与接种疫苗的成本和风险相比的疾病发生的频率,风险和成本。例如,假设1000名感染麻疹的人中大约有1-2人会死亡,10000名接种疫苗的群体中如有1人面临大脑水肿的风险。如果某一地区570万人中只有1%的人感染麻疹,那么对应的麻疹病人就有57000人,其中%2的死亡率估计,114人可能因麻疹而死亡,但是按照80%接种率,接种疫苗后会有456人将面临大脑水肿的风险。

应该强调的是,我们已经使用常微分方程进行所有计算。因此,我们没有考虑在实际情况中可能发生的随机波动。因此,我们在这里看到的数字应该被视为平均效应,而实际效果可能比我们在这里看到的更温和或更差。

传染病模型Shiny应用

源代码获取:https://github.com/ekstroem/Shiny-Vaccine

文章来源: Buildinga Shiny app to show the impact of vaccines

http://sandsynligvis.dk/2019/03/06/building-a-shiny-app-to-show-the-impact-of-vaccines/

往期精彩:

  • 诹图系列(1): 简单条形图

  • 字节跳动(今日头条),为何战斗力如此凶猛?

  • shinydashboard与shiny_史上最全(二)

  • R语言中文社区2018年终文章整理(作者篇)

  • R语言中文社区2018年终文章整理(类型篇)

通过Shiny app实现疫苗预防疾病的过程相关推荐

  1. Shiny平台构建与R包开发(七)——Shiny APP部署

    本节展示了如何分享和部署Shiny APP.您可以将开发好的Shiny APP部署在自己的服务器上,或是将其部署在公共的平台(即shinyapps.io)上.这里仅分享后者.对于如何将Shiny AP ...

  2. 极简主义shiny app

    转载自:http://site.douban.com/182577/widget/notes/10568279/note/349413814/ 为了上课,赶制了一个异常简单的shiny app.展示二 ...

  3. 使用CSS美化shiny app效果

    shiny 是R语言的web框架,当我们要开发一个shiny app时,一般包含两个文件,ui.R和server.R. 本文介绍一个使用CSS对shiny app效果进行美化的简单例子.该例子是在sh ...

  4. R Shiny App文件默认加载顺序

    每个shiny app目录下假如有server.R或者是app.R,则认为是shiny app的目录,shiny会自动执行文件,把app run起来. 文件的加载规则如下: 优先识别server.R文 ...

  5. 夏天多吃这4种食材,去暑祛火又预防疾病!

    酷热夏天的炎热难忍,已让很多人承受不住,再再加"桑拿天"就需要来到,那份炎热湿冷的时节也是令人痛苦不堪.哪些中署.容易上火.病症等各种各样不适感便会接踵而来.因此夏天保健养生预防疾 ...

  6. R语言Shiny App和 交互式绘图echarts4r包Advanced深探

    更新 library(shiny) ui <- fluidPage(fluidRow(column(12, actionButton("update", "Upda ...

  7. 【作业】{r} :Shiny app 中使用 isolate 函数,达到 app 作图变换时的不实时反馈效果

    作业要求: 在本节中, Shiny app 中使用 isolate 函数,达到 app 作图变换时的不实时反馈效果,即添加一个类似 " 刷新 "(refresh)按钮,实现每次图像 ...

  8. r shiny app learning tutorial a sliderinput

    control + L can clean the r command line library(shiny)ui=fluidPage(# inputsliderInput(inputId = &qu ...

  9. r shiny app的学习和使用,这个我认为是作为大学生最适合的入门网页开发工具!!!

    最简单的rshinyapp的结构 一个library 一个ui 一个server 一个把ui和server结合到一起组成rshiny app的代码 r语言的最大的特点是直观 就很适合学生教育 忽然发现 ...

  10. C# WinForm程序App.Config数据库连接配置文件的使用过程

    App.Config[应用程序配置文件],它其实就是一个标准的XML文件,不过.Net类库已经封装了读取这个文件的方法.可以很方便的使用.看下使用过程. 1.右键解决方案资源管理器中你的项目名,[添加 ...

最新文章

  1. [20170206]为什么少1个段.txt
  2. python下载word文件-Python用python-docx读写word文档
  3. MYSQL数据库的优化(二)
  4. Python爬虫学习二爬虫基础了解
  5. java 基础编程题 5
  6. Python+django网页设计入门(8):网站项目文件夹布局
  7. python实现文件编码转换_Python实现批量转换文件编码的方法
  8. 用perl发送http请求
  9. Anaconda 安装 OpenCV 遇到的问题
  10. [转帖]windows+xshell+xming访问非桌面版Linux服务器
  11. java mvc jquery weui_weui开发笔记
  12. matlab多目标遗传算法工具箱,运用MATLAB遗传算法工具箱求解非线性多目标优化问题,...
  13. c语言求最小公约数和最小公倍数,c语言求最大公约数和最小公倍数
  14. 电商产品设计:拆单规则和业务场景详解
  15. 【BUUCTF】CTF_Crypto 密码学_Quoted-printable(引用可打印)
  16. 前端新手小白,入职第一天,我都做了什么
  17. Linux下打包压缩war和解压war包 zip和jar
  18. redis主从配置(一主多从)
  19. 数据结构——数据结构算法之《图》
  20. 【活动推荐】2020中国DevOps社区峰会(成都站)

热门文章

  1. Win下Eclipse提交hadoop程序出错:org.apache.hadoop.security.AccessControlException: Permission denied: user=
  2. 阿里为什么推荐使用LongAdder?而不是AtomicLong?
  3. 这个教人写出烂代码的项目在 GitHub 上火了...
  4. MySQL:Left Join 这个坑,千万别踩!
  5. 面试官:谈谈你对IO流和NIO的理解
  6. 身处小公司,如何在2年内快速突破,拿到大厂offer?
  7. 程序员以上帝视角解读“旅行青蛙”,你的呱真的在旅行嘛?
  8. 我怕三十的红包太多,先发为敬!
  9. wifi共享大师电脑版_【小度wifi驱动下载】小度wifi驱动win10官方下载 v3.1 电脑版...
  10. 从棋盘左上角到右下角共有多少种走法