Code
library(tidyverse)
library(targets)
library(sf)
library(gt)
library(kableExtra)
library(lubridate)

matrix_from_vector <- function(x, ncol) {
  n_balanced <- ceiling(length(x) / ncol) * ncol
  matrix(c(x, rep(NA, n_balanced - length(x))), ncol = ncol)
}

clrs_light <- MetBrewer::met.brewer("Tiepolo") %>% colorspace::lighten(0.8)

# Generated via random.org
set.seed(2385)

# Load targets stuff
tar_config_set(store = here::here('_targets'),
               script = here::here('_targets.R'))

invisible(list2env(tar_read(graphic_functions), .GlobalEnv))
tar_load(c(daily_panel, derogation_map_data))
Code
info <- list(
  n_days = length(unique(daily_panel$day)),
  n_countries = length(unique(daily_panel$iso3)),
  n_rows = scales::label_comma()(nrow(daily_panel)),
  dates = map(list(
    start_date = min(daily_panel$day),
    end_date = max(daily_panel$day)
  ), ~list(date = ., 
           nice = format(., "%B %e, %Y"),
           year = year(.)))
)

Overview

We combine data from the International Covenant on Civil and Political Rights (ICCPR), the World Health Organization (WHO), Oxford’s COVID-19 Government Response Tracker, the Pandemic Backsliding Project (PanDem), and the Varieties of Democracy (V-Dem) project to track government responses, COVID case counts, and derogation status at a daily level.

Countries and dates included

We include data from 139 countries for 477 days from March 11, 2020 to June 30, 2021, resulting in a panel with 66,303 country-day observations.

Code
countries <- daily_panel %>% 
  distinct(who_region, who_region_long, country_name) %>% 
  arrange(who_region) %>% 
  mutate(who = paste0(who_region_long, " (", who_region, ")")) %>% 
  group_by(who) %>% 
  nest() %>% 
  mutate(nice_matrix = map(data, ~matrix_from_vector(.$country_name, ncol = 6))) %>% 
  mutate(matrix_rows = map_int(nice_matrix, ~nrow(.)))

row_groups <- countries$matrix_rows %>% 
  set_names(countries$who)

reduce(countries$nice_matrix, rbind) %>% 
  kbl(table.attr = "class=\'table-sm\'") %>% 
  kable_styling(bootstrap_options = c("basic"), 
                full_width = FALSE) %>% 
  pack_rows(index = row_groups, indent = FALSE, 
            label_row_css = 'background-color: rgb(2, 184, 117); color: #ffffff; text-align: center;')
Regional Office for Africa (AFRO)
Algeria Central African Republic Gabon Madagascar Nigeria Uganda
Angola Chad Gambia Malawi Rwanda Tanzania
Benin Congo - Brazzaville Ghana Mali Senegal Zambia
Botswana Côte d’Ivoire Guinea Mauritania Sierra Leone Zimbabwe
Burkina Faso Congo - Kinshasa Kenya Mozambique South Africa
Burundi Eritrea Lesotho Namibia South Sudan
Cameroon Ethiopia Liberia Niger Togo
Regional Office for the Americas (AMRO)
Argentina Chile Dominican Republic Haiti Nicaragua United States
Bolivia Colombia Ecuador Honduras Panama Uruguay
Brazil Costa Rica El Salvador Jamaica Paraguay Venezuela
Canada Cuba Guatemala Mexico Peru
Regional Office for the Eastern Mediterranean (EMRO)
Afghanistan Iraq Lebanon Pakistan Somalia United Arab Emirates
Egypt Jordan Morocco Qatar Sudan
Iran Kuwait Oman Saudi Arabia Tunisia
Regional Office for Europe (EURO)
Albania Croatia Greece Lithuania Russia Tajikistan
Austria Czechia Hungary Netherlands Serbia United Kingdom
Azerbaijan Denmark Ireland Norway Slovakia Türkiye
Belarus Finland Israel Poland Slovenia Turkmenistan
Belgium France Italy Portugal Spain Ukraine
Bosnia & Herzegovina Georgia Kazakhstan Moldova Sweden Uzbekistan
Bulgaria Germany Kyrgyzstan Romania Switzerland
Regional Office for South-East Asia (SEARO)
Bangladesh Indonesia Nepal Thailand
India Myanmar (Burma) Sri Lanka
Regional Office for the Western Pacific (WPRO)
Australia Japan Mongolia Philippines Vietnam
Cambodia Laos New Zealand South Korea
China Malaysia Papua New Guinea Singapore

General overview of full data

Here’s an overview of the complete panel data:

glimpse(daily_panel)
## Rows: 66,303
## Columns: 82
## $ country_name                 <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afgha…
## $ iso3                         <chr> "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG…
## $ day                          <date> 2020-03-11, 2020-03-12, 2020-03-13, 2020-03-14, 2020-03-15, 2020-03-16, 2020-03-…
## $ day_num                      <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23…
## $ year                         <dbl> 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 202…
## $ year_quarter                 <chr> "2020-Q2", "2020-Q2", "2020-Q2", "2020-Q2", "2020-Q2", "2020-Q2", "2020-Q2", "202…
## $ year_quarter_day             <chr> "2020-01-01", "2020-01-01", "2020-01-01", "2020-01-01", "2020-01-01", "2020-01-01…
## $ year_week                    <chr> "2020-W11", "2020-W11", "2020-W11", "2020-W11", "2020-W11", "2020-W12", "2020-W12…
## $ year_week_day                <chr> "2020-03-09", "2020-03-09", "2020-03-09", "2020-03-09", "2020-03-09", "2020-03-16…
## $ who_region                   <chr> "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "…
## $ who_region_long              <chr> "Regional Office for the Eastern Mediterranean", "Regional Office for the Eastern…
## $ who_subregion                <chr> "EMRD", "EMRD", "EMRD", "EMRD", "EMRD", "EMRD", "EMRD", "EMRD", "EMRD", "EMRD", "…
## $ subregion_imputed            <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ new_cases                    <dbl> 3, 0, 0, 3, 6, 5, -1, 0, 0, 0, 0, 10, 6, 2, 32, 6, 11, 15, 8, 0, 52, 26, 43, 34, …
## $ cumulative_cases             <dbl> 11, 11, 11, 14, 20, 25, 24, 24, 24, 24, 24, 34, 40, 42, 74, 80, 91, 106, 114, 114…
## $ new_deaths                   <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 1, 0, 2, 0, …
## $ cumulative_deaths            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 4, 4, 4, 4, 4, 5, 5, 7, 7, …
## $ iccpr_derogation_filed       <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ derogation_start             <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ derogation_ineffect          <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ derogation_end               <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ prior_iccpr_derogations      <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ prior_iccpr_other_action     <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ stringency_index             <dbl> 27.8, 27.8, 27.8, 38.9, 38.9, 38.9, 38.9, 41.7, 41.7, 41.7, 41.7, 41.7, 41.7, 50.…
## $ c3_cancel_events             <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
## $ c4_gatherings                <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, …
## $ c5_public_transport          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
## $ c6_stay_at_home              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
## $ c7_internal_movement         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ c8_intl_travel               <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, …
## $ e1_income_support            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ e2_debt_relief               <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ c3_cancel_events_bin         <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ c4_gatherings_bin            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, …
## $ c5_public_transport_bin      <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ c6_stay_at_home_bin          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ c7_internal_movement_bin     <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ c8_intl_travel_bin           <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ e1_income_support_bin        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ e2_debt_relief_bin           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ c3_cancel_events_added       <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c3_cancel_events_removed     <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c3_cancel_events_never       <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ c4_gatherings_added          <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c4_gatherings_removed        <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c4_gatherings_never          <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ c5_public_transport_added    <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c5_public_transport_removed  <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c5_public_transport_never    <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ c6_stay_at_home_added        <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c6_stay_at_home_removed      <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c6_stay_at_home_never        <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ c7_internal_movement_added   <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c7_internal_movement_removed <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c7_internal_movement_never   <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ c8_intl_travel_added         <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c8_intl_travel_removed       <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ c8_intl_travel_never         <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ e1_income_support_added      <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ e1_income_support_removed    <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ e1_income_support_never      <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ e2_debt_relief_added         <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ e2_debt_relief_removed       <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
## $ e2_debt_relief_never         <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ pandem                       <dbl> 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.1…
## $ panback                      <dbl> 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0…
## $ pandem_discrim               <ord> None, None, None, None, None, None, None, None, None, None, None, None, None, Non…
## $ pandem_ndrights              <ord> None, None, None, None, None, None, None, None, None, None, None, None, None, Non…
## $ pandem_abusive               <ord> None, None, None, None, None, None, None, None, None, None, None, None, None, Non…
## $ pandem_nolimit               <ord> None, None, None, None, None, None, None, None, None, None, None, None, None, Non…
## $ pandem_media                 <ord> Major, Major, Major, Major, Major, Major, Major, Major, Major, Major, Major, Majo…
## $ v2csreprss                   <dbl> 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.3…
## $ v2xcs_ccsi                   <dbl> 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.7…
## $ v2x_corr                     <dbl> 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.90…
## $ v2x_rule                     <dbl> 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.21…
## $ v2x_civlib                   <dbl> 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.55…
## $ v2x_clphy                    <dbl> 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.52…
## $ v2x_clpriv                   <dbl> 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.4…
## $ v2x_clpol                    <dbl> 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.68…
## $ v2x_polyarchy                <dbl> 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.35…
## $ v2x_libdem                   <dbl> 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.19…
## $ v2x_regime_amb               <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, …

ICCPR derogations

Our data is based on reading the texts of ICCPR derogations at the UN Treaty Collection site at https://treaties.un.org/. We create these variables:

  • ICCPR derogation filed (iccpr_derogation_filed): Date that derogation notice was filed/received by the UN. This is a dichotomous variable that is TRUE on the day the country files the notice and FALSE otherwise.
  • Derogation start (derogation_start): This is the date noted within the derogation text of when the emergency provisions and suspension of rights starts. This is a dichotomous variable that is TRUE on the day the country starts its derogation and FALSE otherwise.
  • Derogation in effect (derogation_ineffect): This is a dichotomous variable that is TRUE if the country is currently derogating and FALSE if not.
  • Derogation end (derogation_end): This is the date noted within the derogation text of when emergency provisions stop and rights observances resume. This is a dichotomous variable that is TRUE on the day the country finishes its derogation and FALSE otherwise.
Note

In many cases states filed derogations after the derogations actually started, so filed dates are often after the derogation start dates. Also note that states often updated the timing of derogations to extend, so there may be multiple filing dates within one derogation period.

Here’s an overview of these variables:

daily_panel %>%
  select(country_name, iso3, day, iccpr_derogation_filed,
         derogation_start, derogation_ineffect, derogation_end) %>% 
  glimpse()
## Rows: 66,303
## Columns: 7
## $ country_name           <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan…
## $ iso3                   <chr> "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AF…
## $ day                    <date> 2020-03-11, 2020-03-12, 2020-03-13, 2020-03-14, 2020-03-15, 2020-03-16, 2020-03-17, 20…
## $ iccpr_derogation_filed <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL…
## $ derogation_start       <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL…
## $ derogation_ineffect    <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL…
## $ derogation_end         <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL…

And here’s an extract of the data from June 11, 2020, the day that Argentina filed a derogation notice:

Code
daily_panel %>%
  filter(day == ymd("2020-06-11")) %>%
  select(country_name, iso3, day, iccpr_derogation_filed,
         derogation_start, derogation_ineffect, derogation_end) %>% 
  gt() %>% 
  cols_width(country_name ~ px(250),
             iso3 ~ px(60)) %>% 
  data_color(columns = contains("derogation"),
             fn = scales::col_factor(c(clrs_light[1], clrs_light[8]), 
                                     domain = c(FALSE, TRUE))) %>% 
  opt_interactive(use_compact_mode = TRUE, use_highlight = TRUE)

And here’s a map of all the countries that derogated between January 2020 and June 2021:

Code
ggplot() +
  geom_sf(data = derogation_map_data, aes(fill = derogations_1plus),
          linewidth = 0.1, color = "white") +
  coord_sf(crs = st_crs("+proj=robin"), datum = NA) +
  scale_fill_binned(low = colorspace::lighten(clrs[1], amount = 0.8), 
                    high = clrs[1], na.value = "grey85",
                    breaks = c(1, 5, 10, 15, 20),
                    limits = c(1, 20),
                    name = "Derogations filed: ",
                    guide = guide_colorsteps(barwidth = 7, barheight = 0.4,
                                             title.vjust = 1)) +
  theme_pandem() +
  theme(panel.border = element_blank(),
        legend.title = element_text(face = "bold"),
        legend.justification = "center")

Prior ICCPR actions

To account for whether countries have engaged with ICCPR derogation procedures prior to the COVID-19 pandemic (signalling that they perhaps care about treaty obligations), we include two binary indicators for (1) whether the country has derogated from the ICCPR in the past and (2) whether the country has completed any other type of ICCPR-related actions. These are time-invariant and act more like overall indicator variables, like continent or region.

daily_panel %>% 
  group_by(country_name, iso3) %>% 
  summarize(across(starts_with("prior"), ~mean(.))) %>% 
  ungroup() %>% 
  glimpse()
## Rows: 139
## Columns: 4
## $ country_name             <chr> "Afghanistan", "Albania", "Algeria", "Angola", "Argentina", "Australia", "Austria", "…
## $ iso3                     <chr> "AFG", "ALB", "DZA", "AGO", "ARG", "AUS", "AUT", "AZE", "BGD", "BLR", "BEL", "BEN", "…
## $ prior_iccpr_derogations  <dbl> 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0…
## $ prior_iccpr_other_action <dbl> 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0…

WHO COVID case counts

We collect daily case counts from the WHO’s COVID-19 Dashboard. We use these variables:

  • WHO region (who_region and who_region_long): One of six WHO regional offices:
    • Regional Office for Africa (AFRO)
    • Regional Office for the Americas (AMRO)
    • Regional Office for the Eastern Mediterranean (EMRO)
    • Regional Office for Europe (EURO)
    • Regional Office for South-East Asia (SEARO)
    • Regional Office for the Western Pacific (WPRO)
  • New cases (new_cases): New confirmed cases of COVID-19. Calculated by subtracting previous cumulative case count from current cumulative cases count.
  • Cumulative cases (cumulative_cases): Cumulative confirmed cases of COVID-19 reported to the WHO to date.
  • New deaths (new_deaths): New confirmed COVID-19 deaths. Calculated by subtracting previous cumulative deaths from current cumulative deaths.
  • Cumulative deaths (cumulative_deaths): Cumulative confirmed COVID-19 deaths reported to the WHO to date.

We omit all “other” observations not assigned to any country (like cruise ships), and remove all non-states that don’t appear in the UN’s ICCPR list or in V-Dem, including:

Code
nonstates <- c("Falkland Islands", "Fore Islands", "Guernsey", "Guam", 
               "Isle of Man ", "Jersey", "Saint Pierre and Miquelon", 
               "Pitcairn Islands", "Puerto Rico", "Reunion Island", "Tokelau", 
               "Holy See", "Wallis and Futuna", "Bonaire", "Sint Eustatius", 
               "Saba", "Mayotte", "Gibraltar ", "Greenland", "Guadeloupe")

matrix_from_vector(nonstates, ncol = 5) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = c("basic"), 
                full_width = FALSE) %>% 
  pack_rows("Omitted non-states", 1, 4, indent = FALSE, 
            label_row_css = 'background-color: rgb(184, 71, 67); color: #ffffff; text-align: center;')
Omitted non-states
Falkland Islands Isle of Man Puerto Rico Wallis and Futuna Mayotte
Fore Islands Jersey Reunion Island Bonaire Gibraltar
Guernsey Saint Pierre and Miquelon Tokelau Sint Eustatius Greenland
Guam Pitcairn Islands Holy See Saba Guadeloupe

Here’s an overview of these variables:

daily_panel %>%
  select(country_name, iso3, day, who_region, who_region_long,
         new_cases, cumulative_cases, new_deaths, cumulative_deaths) %>% 
  glimpse()
## Rows: 66,303
## Columns: 9
## $ country_name      <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "A…
## $ iso3              <chr> "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "…
## $ day               <date> 2020-03-11, 2020-03-12, 2020-03-13, 2020-03-14, 2020-03-15, 2020-03-16, 2020-03-17, 2020-03…
## $ who_region        <chr> "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMRO", "EMR…
## $ who_region_long   <chr> "Regional Office for the Eastern Mediterranean", "Regional Office for the Eastern Mediterran…
## $ new_cases         <dbl> 3, 0, 0, 3, 6, 5, -1, 0, 0, 0, 0, 10, 6, 2, 32, 6, 11, 15, 8, 0, 52, 26, 43, 34, 1, 29, 38, …
## $ cumulative_cases  <dbl> 11, 11, 11, 14, 20, 25, 24, 24, 24, 24, 24, 34, 40, 42, 74, 80, 91, 106, 114, 114, 166, 192,…
## $ new_deaths        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 1, 0, 2, 0, 4, 3, 1, 0,…
## $ cumulative_deaths <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 4, 4, 4, 4, 4, 5, 5, 7, 7, 11, 14, 15,…

Oxford government responses

To measure the severity of government responses to COVID-19, we use data from the Oxford COVID-19 Government Response Tracker. We use the project’s overall stringency index, as well as several measures of economic policies and containment and closure policies:

  • Stringency index (stringency_index): Composite measure of multiple indicators (C1–C8 and H1), ranging from 0 to 100. See the complete methodology for more details.

  • Cancel public events (c3_cancel_events): Indicator of whether the country canceled public events.

    • 0: no measures; 1: recommend canceling; 2: require canceling; Blank: no data
  • Limits on gatherings (c4_gatherings): Indicator of whether the country limited public gatherings.

    • 0: no restrictions; 1: restrictions on very large gatherings (the limit is above 1000 people); 2: restrictions on gatherings between 101-1000 people; 3: restrictions on gatherings between 11-100 people; 4: restrictions on gatherings of 10 people or less; Blank: no data
  • Close public transport (c5_public_transport): Indicator of whether the country closed public transport.

    • 0: no measures; 1: recommend closing (or significantly reduce volume/route/means of transport available); 2: require closing (or prohibit most citizens from using it); Blank: no data
  • Stay at home requirements (c6_stay_at_home): Indicator of whether the country imposed shelter-in-place requirements.

    • 0: no measures; 1: recommend not leaving house; 2: require not leaving house with exceptions for daily exercise, grocery shopping, and ‘essential’ trips; 3: require not leaving house with minimal exceptions (eg allowed to leave once a week, or only one person can leave at a time, etc); Blank: no data
  • Restrictions on internal movement (c7_internal_movement): Indicator of whether the country imposed restrictions on internal movement between cities or regions.

    • 0: no measures; 1: recommend not to travel between regions/cities; 2: internal movement restrictions in place; Blank: no data
  • International travel controls (c8_intl_travel): Indicator of whether the country imposed restrictions on international travel (for foreign travellers, not citizens).

    • 0: no restrictions; 1: screening arrivals; 2: quarantine arrivals from some or all regions; 3: ban arrivals from some regions; 4: ban on all regions or total border closure; Blank: no data
  • Income support (e1_income_support): Indicator of whether the country provided direct cash payments for those unable to work.

    • 0: no income support; 1: government is replacing less than 50% of lost salary (or if a flat sum, it is less than 50% median salary); 2: government is replacing 50% or more of lost salary (or if a flat sum, it is greater than 50% median salary); Blank: no data
  • Debt relief (e2_debt_relief): Indicator of whether the country froze financial obligations for households (e.g. loan freezes, eviction bans, etc.)

    • 0: no debt/contract relief; 1: narrow relief, specific to one kind of contract; 2: broad debt/contract relief; Blank: no data

Here’s an overview of these variables:

daily_panel %>% 
  select(country_name, iso3, day, stringency_index, c3_cancel_events,
         c4_gatherings, c5_public_transport,
         c6_stay_at_home, c7_internal_movement,
         c8_intl_travel, e1_income_support, e2_debt_relief) %>% 
  glimpse()
## Rows: 66,303
## Columns: 12
## $ country_name         <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan",…
## $ iso3                 <chr> "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG"…
## $ day                  <date> 2020-03-11, 2020-03-12, 2020-03-13, 2020-03-14, 2020-03-15, 2020-03-16, 2020-03-17, 2020…
## $ stringency_index     <dbl> 27.8, 27.8, 27.8, 38.9, 38.9, 38.9, 38.9, 41.7, 41.7, 41.7, 41.7, 41.7, 41.7, 50.9, 59.3,…
## $ c3_cancel_events     <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ c4_gatherings        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4,…
## $ c5_public_transport  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ c6_stay_at_home      <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ c7_internal_movement <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ c8_intl_travel       <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,…
## $ e1_income_support    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ e2_debt_relief       <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…

And here’s an extract of the data from June 11, 2020:

Code
daily_panel %>%
  filter(day == ymd("2020-06-11")) %>%
  select(country_name, iso3, day, stringency_index, c3_cancel_events,
         c4_gatherings, c5_public_transport,
         c6_stay_at_home, c7_internal_movement,
         c8_intl_travel, e1_income_support, e2_debt_relief) %>% 
  gt() %>% 
  cols_width(country_name ~ px(250),
             iso3 ~ px(60),
             day ~ px(150)) %>% 
  opt_interactive(use_compact_mode = TRUE, use_highlight = TRUE)

Pandemic Backsliding Project (PanDem)

We also measure the severity of government responses with data from the Pandemic Backsliding Project (PanDem).

Warning

Importantly, since these are all measured quarterly and our main data is daily, these variables act more like country-level fixed effects in our models, capturing the overall level of the severity of pandemic response on a given day.

We use the following variables:

  • Year + quarter (year_quarter): Numeric representation of the year and quarter, with quarter ranging from 0.1 to 0.4 (so 2020.4 is Q4 of 2020). PanDem treats March 11–March 31, 2020 as Q2 instead of Q1, so we recode our data accordingly (i.e. March 13, 2020 is 2020.2)

  • Pandemic Violations of Democratic Standards Index (pandem): Index measuring the extent to which governments violated democratic standards in their COVID-19 emergency response. Ranges from 0–1 and incorporates details about 7 different types of violations (type1, type2, type3, type4, type5, type6, and type7 from PanDem).

  • Pandemic Backsliding Index (panback): Index measuring the extent to which democracy has receded because of violations of government standards during COVID-19. Ranges from 0–1 and incorporates both pandem and V-Dem’s liberal democracy index (v2x_libdem) in 2019.

  • Discriminatory measures (pandem_discrim; originally type1): Ordinal measure of whether emergency measure violated the principle of non-discrimination from the ICCPR.

    • None: no discrimination; Minor: de facto minor discrimination; Moderate: de jure minor discrimination; Major: major either de factor or de jure discrimination
  • Derogations from non-derogable rights (pandem_ndrights; originally type2): Ordinal measure of whether countries derogated from non-derogable ICCPR rights.

    • None: no on all items of ICCPR provisions; Major: yes on any item of ICCPR provisions
  • Abusive enforcement (pandem_abusive; originally type3): Ordinal measure of whether state security violated physical integrity rights while enforcing emergency measures

    • None: no to very few reports; Minor: sometimes; Moderate: often; Major: widespread
  • No time limit (pandem_nolimit; originally type4): Ordinal measure of whether emergency measures failed to state a time limit

    • None: there is a declared end date for all measures; Minor: there is no end date for some or all measures, but measured ended within the quarter; Moderate: there is no end date for some or all measures and the measures have not ended during the quarter
  • Restrictions on media freedom (pandem_media; originally type7): Ordinal measure of whether limits were placed on media freedom as part of pandemic emergency measures

    • None: no de jure or de facto restrictions; Minor: some de jure or de facto restrictions; Moderate: widespread limitations on access to information but few de jure or de facto restrictions on how media can report about the pandemic; Major: severe restrictions, limits, and/or harassment (the PanDem codebook has a lot more detail about how all these are coded; this index is the most complex of the 7 types)

And here’s an overview of these variables:

daily_panel %>% 
  select(country_name, iso3, day, year_quarter, 
         pandem, panback, starts_with("pandem_")) %>% 
  glimpse()
## Rows: 66,303
## Columns: 11
## $ country_name    <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afg…
## $ iso3            <chr> "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AF…
## $ day             <date> 2020-03-11, 2020-03-12, 2020-03-13, 2020-03-14, 2020-03-15, 2020-03-16, 2020-03-17, 2020-03-1…
## $ year_quarter    <chr> "2020-Q2", "2020-Q2", "2020-Q2", "2020-Q2", "2020-Q2", "2020-Q2", "2020-Q2", "2020-Q2", "2020-…
## $ pandem          <dbl> 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15…
## $ panback         <dbl> 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912, 0.0912…
## $ pandem_discrim  <ord> None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None…
## $ pandem_ndrights <ord> None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None…
## $ pandem_abusive  <ord> None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None…
## $ pandem_nolimit  <ord> None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None…
## $ pandem_media    <ord> Major, Major, Major, Major, Major, Major, Major, Major, Major, Major, Major, Major, Major, Maj…

Varieties of Democracy project (V-Dem)

Finally, to measure additional country-level characteristics, we use several variables from the Varieties of Democracy (V-Dem) project.

Warning

Importantly, since these are all measured annually and our main data is daily, these variables act more like country-level fixed effects in our models, capturing the overall level of civil society, human rights, and other characteristics on a given day.

Here’s an overview of these variables:

  • CSO repression (v2csreprss)
  • Core civil society index (v2xcs_ccsi): Combination of entry/exit requirements, repression, and participatory environment
  • Political corruption index (v2x_corr): Combination of public sector, executive, legislative, and judicial corruption (less to more, 0–1)
  • Rule of law (v2x_rule)
  • Civil liberties (v2x_civlib)
  • Physical violence (v2x_clphy)
  • Private civil liberties (v2x_clpriv)
  • Political civil liberties index (v2x_clpol)
  • Electoral democracy index (v2x_polyarchy)
  • Regimes of the world scores (v2x_regime_amb)
daily_panel %>% 
  select(country_name, iso3, day, starts_with("v2")) %>%
  glimpse()
## Rows: 66,303
## Columns: 14
## $ country_name   <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afgh…
## $ iso3           <chr> "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG…
## $ day            <date> 2020-03-11, 2020-03-12, 2020-03-13, 2020-03-14, 2020-03-15, 2020-03-16, 2020-03-17, 2020-03-18…
## $ v2csreprss     <dbl> 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36, 1.36,…
## $ v2xcs_ccsi     <dbl> 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75,…
## $ v2x_corr       <dbl> 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.901, 0.90…
## $ v2x_rule       <dbl> 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.213, 0.21…
## $ v2x_civlib     <dbl> 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.559, 0.55…
## $ v2x_clphy      <dbl> 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.52…
## $ v2x_clpriv     <dbl> 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47,…
## $ v2x_clpol      <dbl> 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.685, 0.68…
## $ v2x_polyarchy  <dbl> 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.351, 0.35…
## $ v2x_libdem     <dbl> 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.191, 0.19…
## $ v2x_regime_amb <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,…