锈与骨:在绝望的生活中寻获希望 – 《锈与骨》影评
《狼之子雨与雪》:让人有结婚的冲动 – 《狼之子雨与雪》影
《斯托克》:这个大叔不太冷 – 《斯托克》影评
《南方的野兽》:美国的非洲式童话 – 《南方的野兽》影评
猎杀本拉登:无关正义或者邪恶 – 《猎杀本拉登》影评
《大希望温泉》:“说”来“说”去,“笑”意全无 – 《大希
《最漫长的日托》:天才还是英雄? – 《辛普森大电影:最漫
莎士比亚机器的电影化轰鸣 – 《凯撒必须死》影评
写给《爱》 – 《爱》影评
《在国外》:灯塔在哪里? – 《在异国》影评
您现在所在的位置:>主页 > 新闻中心 >
科学网用R分析COVID

作者简介Tim Churches是新南威尔士大学临床医学院的高级研究员,也是Ingham应用医学研究所的健康数据科学家。 他的研究领域涉及普通医学、全科医学、职业卫生和公共卫生实践,尤其是人口健康监测和临床流行病学。

英文原文的链接:COVID-19 epidemiology with R


前言
我在2020年3月4日撰写本文时,世界正处于由SARS-Cov2病毒引起的全球COVID-19大流行的风口浪尖。 每个新闻报道都以令人震惊且不断增长的全球累计病例数和因COVID-19造成的死亡人数为主导。 遍布全球的仪表盘像圣诞树一样开始亮起来。


对于R用户来说,浅显的问题:“ R可以提供帮助了解情况的信息吗?”


答案是:“是的,很多!”


实际上,R是暴发流行病学家选择的工具之一,可在CRAN和其他地方快速搜索到许多专门用于暴发管理和分析的R程序包。 这篇文章并不是要评论可用的软件包,而是要展示R Epidemics联盟(RECON)站点上一些优秀程序包的实用性,以及将使用R和tidyverse包进行数据采集、整理和可视化。这篇文章基于我在过去几周发表的两篇关于同一主题的更长更详细的博客文章,但使用了美国数据。


数据采集
获得的COVID-19流行病的详细、准确和最新的数据并不像看上去那么简单。 受影响的各个国家及其省/政府网站都提供了因病毒引起的病例数、治愈数和死亡数的详实汇总数据,但这些数据往往是嵌入(通常为非英语)文本的计数形式。


从这些政府网站上提取和整理的数据有几个潜在来源。一个广泛使用的数据源是由约翰霍普金斯大学系统科学与工程中心(JHU CCSE)整理的数据集,它用作上述仪表板的数据源。它非常容易使用:只需从相应的GitHub URL读取CSV文件即可。然而,它缺乏细节(这不是它的预期目的),当作为不同的每日病例时间序列检查时,它含有相当多的缺失或异常数据点,这是一个相对较小的问题,在这里将进一步探讨。


另一套便捷的资源是相关的维基百科页面,例如针对中国的维基百科页面。日本、韩国、伊朗、意大利和许多其他国家/地区都有相应的页面。这些Wikipedia页面往往更加详细,并且可以很好地索引回原始的源网页,但是对于Web抓取来说,它们具有很大的挑战性,因为随着不同wikipedia贡献者调整它们的外观,出现数据的表格格式经常改变。尽管如此,我们还是会从合适的维基百科页面上抓取到有关美国(截至3月4日)已确诊的COVID-19病例的详细数据。另一个好处是维基百科页面是版本化的,因此可以从特定版本的表中收集数据。 但是,如果您想每天更新数据,则使用Wikipedia页面作为源进行Web抓取代码,并且每天维护。


约翰霍普金斯大学整理的病例数据
获取这些数据很容易。他们提供的时间序列格式对我们而言是最方便的。我们将删除与“钻石公主”号游轮相关的美国病例,因为我们可以假定这些病例在遣返时被隔离在家中,因此不太可能引发更多病例。我们还将JHU数据中的日期前移一天,以近似反映美国时区,因为原始日期是相当于午夜的格林威治时间。这是必要的,因为我们将把JHU数据与源自维基百科的美国数据结合在一起,这些数据是根据参考美国当地时区的日期制成的表格。


我们还需要区分JHU数据(以累积计数形式提供),以获取每日病例数。每日病例数在流行病学方面比累积计数更有用。dplyr包将轻松处理这些工作。

jhu_url <- paste("https://raw.githubusercontent.com/CSSEGISandData/", 
  "COVID-19/master/csse_covid_19_data/", "csse_covid_19_time_series/", 
  "time_series_19-covid-Confirmed.csv", sep = "")
  
  us_confirmed_long_jhu <- read_csv(jhu_url) %>% rename(province = "Province/State", 
  country_region = "Country/Region") %>% pivot_longer(-c(province, 
  country_region, Lat, Long), names_to = "Date", values_to = "cumulative_cases") %>% 
  # adjust JHU dates back one day to reflect US time, more or less 
  mutate(Date = mdy(Date) - days(1)) %>% filter(country_region == 
  "US") %>% arrange(province, Date) %>% group_by(province) %>% 
  mutate(incident_cases = c(0, diff(cumulative_cases))) %>% 
  ungroup() %>% select(-c(country_region, Lat, Long, cumulative_cases)) %>% 
  filter(str_detect(province, "Diamond Princess", negate = TRUE))