tidycovid19

{tidycovid19}: An R Package to Download, Tidy and Visualize Covid-19 Related Data


output: github_document
always_allow_html: true
author: Joachim Gassen

knitr::opts_chunk$set(
  echo = TRUE, warning = FALSE, message = FALSE, 
  cache = TRUE, fig.path = "man/figures/", fig.align="center"
)
library(tidyverse)
library(knitr)

Download, Tidy and Visualize Covid-19 Related Data

Disclaimer

I am an applied economist studying the economic effects of regulatory interventions on corporate transparency and leading the Open Science Data Center (OSDC) of the TRR 266 Accounting for Transparency, which is funded by the German Science Foundation (DFG).
The OSDC has the objective to make research transparent in a way that others can contribute and collaborate.

This is the spirit that motivated me to set up this package. I am clearly no epidemiologist so I will abstain from from providing infrastructure for analyzing the spread of the disease or estimating the effects of non-pharmaceutical interventions. Instead this package serves the purpose to facilitate the use of various Covid-19 related data sources with a special focus on non-pharmaceutical interventions.

In that way, I hope that it might be helpful for others that are interested in doing research on the Covid 19 pandemic by promoting the benefits of open science.

The Data

As of r format(Sys.Date(), "%B %d, %Y") these are the included data sources

data(tidycovid19_data_sources)
df <- tidycovid19_data_sources %>% select(-id)
df$description[nrow(df)] <- paste(
  "The merged dataset provided by the tidycovid19 R package. Contains data",
  "from all sources mentioned above."
)
kable(df) %>% kableExtra::kable_styling()

How to Use the Package

The idea is simple. Load the data using the functions above and code away. So, for example:

# Suggestion by AndreaPi (issue #19)

library(tidyverse)
library(tidycovid19)
library(zoo)

df <- download_merged_data(cached = TRUE, silent = TRUE)

df %>%
  filter(iso3c == "USA") %>%
  mutate(
    new_cases = confirmed - lag(confirmed),
    ave_new_cases = rollmean(new_cases, 7, na.pad=TRUE, align="right")
  ) %>%
  filter(!is.na(new_cases), !is.na(ave_new_cases)) %>%
  ggplot(aes(x = date)) +
  geom_bar(aes(y = new_cases), stat = "identity", fill = "lightblue") +
  geom_line(aes(y = ave_new_cases), color ="red") +
  theme_minimal()

The data comes with two meta data sets that describe the data. The data frame tidycovid19_data_sources listed above provides short descriptions and links for each data source used by the package. The data frame tidycovid19_variable_defintions provides variable definitions for each variable included in the merged country-day data frame provided by download_merged_data():

data(tidycovid19_variable_definitions)
df <- tidycovid19_variable_definitions %>%
  select(var_name, var_def)
kable(df) %>% kableExtra::kable_styling()

There are more examples on how to code in the code file in the main directory with the revealing name code_examples.R. Explore and reuse!

Visualization

The focus of the package lies on data collection and not on visualization as there are already many great tools floating around. Regardless, there are three functions that allow you to visualize some of the key data that the package provides.

Plot Covid-19 Spread over Event Time

The function plot_covid19_spread() allows you to quickly visualize the spread of the virus in relation to governmental intervention measures. It is inspired by the insightful displays created by John Burn-Murdoch from the Financial Times and offers various customization options.

#remotes::install_github("joachim-gassen/tidycovid19")

library(tidycovid19)

merged <- download_merged_data(cached = TRUE, silent = TRUE)
plot_covid19_spread(
  merged, highlight = c("ITA", "ESP", "GBR", "FRA", "DEU", "USA", "BRA", "MEX"),
  intervention = "lockdown", edate_cutoff = 330
)

Plot Covid-19 Stripes

Another option to visualize the spread of Covid-19, in particular if you want to compare many countries, is to produce a stripes-based visualization. Meet the Covid-19 stripes:

plot_covid19_stripes()

Again, the function comes with many options. As an example, you can easily switch to a per capita display:

plot_covid19_stripes(
  per_capita = TRUE, 
  population_cutoff = TRUE, 
  sort_countries = "magnitude"
)

Or single out countries that you are interested in

plot_covid19_stripes(
  type = "confirmed", 
  countries = c("ITA", "ESP", "FRA", "GBR", "DEU", "USA", "BRA", "MEX"),
  sort_countries = "countries"
)

Map Covid-19

Finally, I also included a basic mapping function. map_covid19() allows you to map the spread of the virus at a certain date both world-wide …

map_covid19(merged, cumulative = TRUE, per_capita = TRUE)

… or for certain regions.

map_covid19(merged, type = "deaths", cumulative = TRUE, per_capita = TRUE, region = "Europe") 

If you have enough time (takes several minutes), you can also create an animation to visualize the spread of the virus over time.

df <- merged %>% filter(!is.na(confirmed))
map_covid19(
  df, type = "confirmed", per_capita = TRUE, dates = unique(df$date)
)

Again, you can customize the data that you want to plot and of course you can also modify the plot itself by using normal ggplot syntax.

Shiny App

Sorry, I could not resist. The options of the plot_covid19_spread() make the
implementation of a shiny app a little bit to tempting to pass. The command
shiny_covid19_spread() starts the app. Click on the image to be taken to the
online app. You can use it to customize your plot_covid19_spread()
display as it allows copying the plot generating code to the clipboard,
thanks to the fine {rclipboard}
package. You can now also customize the app by providing plot_covid19_spread()
options as a list to the plot_options parameter.

[![Screenshot of `shiny_covid19_spread()` app](man/figures/shiny_covid19_spread.png)](https://jgassen.shinyapps.io/tidycovid19/)

As the shinyapps.io server has had some issues with exhausting connections, you can also
use this alternative server.

Blog posts

The blog posts are mostly dated. I am leaving the links here for reference:

  • An intro blog post providing a quick walk-through of the package.

  • A blog post on the OWID vaccination data.

  • A blog post on the new visuals of the package.

  • A blog post on the visualizer degrees of freedom that are inherent in a plot of the Covid-19 spread.

  • A blog post on the PDF scraping of the new Google Covid-19 Community Movement Reports.

  • A somewhat dated blog post comparing the ACAPS and Oxford data on governmental interventions.

  • An older blog post that showcases some descriptive visuals to see what one can do with the data retrieved by this package.

Why yet another package on Covid-19?

There are several packages that provide data and infrastructure related to Covid-19. Two prominent cases are:

  • {nCov2019}: This package has a focus on Chinese data but also contains data on other countries and regions. It contains a shiny dashboard.
  • {conronavirus}: This package provides
    the Johns Hopkins University CSSE dataset together with a dashboard

Additional R related resources on Covid-19 can be found here and here.

Other than the packages mentioned above, the key objective of the {tidycovid19} package is to provide transparent access to various data sources at the country-day level, including data on governmental interventions and on behavioral response of the public. It does not contain any data per se. Instead, it provides functions to pull data from publicly available authoritative sources. The sources and the data are documented by additional data frames included in the package. While the combined data frame generated by download_merged_data() aggregates data at the country-day level, some functions also provide sub-country level data on request.

For those interested in speedy downloads it alternatively provides the option to download from the cached data in this repo (stored in the directory cached_data). The cached data is updated daily.