3  Good Health and Well-Being

Ensure healthy lives and promote well-being for all at all ages

Setup Code
library(tidyverse)
library(readxl)
library(patchwork)
theme_set(theme_bw())

# skip the last row
measles <- read_xlsx("data/03/measles.xlsx", n_max = 44334)
rubella <- read_xlsx("data/03/rubella.xlsx", n_max = 16567)

3.1 Original Data

Source: WHO/UNICEF Estimates of National Immunization Coverage (WUENIC), 2023 Revision (completed 15 July 2025), data from 1980-2024.

Downloaded data for all countries and all antigens, from 1980 to 2024 for measles and rubella on 2025-08-07.

You can download more data about coverage of other vaccinations at immunizationdata.who.int.

  • GROUP: All “COUNTRIES”
  • CODE: 3-letter ISO country code
  • NAME: Country name
  • YEAR: 1980-2024
  • ANTIGEN: “MCV1”, “MCV2”, or “RCV1”
  • ANTIGEN_DESCRIPTION: Longer description of ANTIGEN
  • COVERAGE_CATEGORY: “ADMIN”, “OFFICIAL” or “WUENIC”
  • COVERAGE_CATEGORY_DESCRIPTION: Longer description of COVERAGE_CATEGORY
  • TARGET_NUMBER: Number of infants in the target population
  • DOSES: How many doses were administered
  • COVERAGE: The percentage in the target population who have received one (RCV1, MCV1) or two (MCV2) doses of antigen-containing vaccine in a given year.
Plot Code
ggplot(rubella, aes(x = YEAR, y = COVERAGE, colour = COVERAGE_CATEGORY)) +
  geom_smooth() +
  scale_color_manual(values = c("#DD1367", "#00689D", "#FD6925"),
                     guide = guide_legend(position = "inside")) +
  coord_cartesian(ylim = c(0, 100)) +
  labs(x = NULL, color = NULL, y = "Percent Coverage") +
  theme(legend.position.inside = c(.8, .2),
        legend.background = element_blank())
Figure 3.1: The mean rubella vaccination coverage across time for the three categories of estimate

3.2 Simplified Subsets

3.2.1 Coverage

Coverage categories are Administrative, Official, or WHO/UNICEF Estimates (wuenic). This set removes redundant columns and simplifies the column names, making them easier to join to data such as that in Chapter 1.

Code to create measles_coverage and rubella_coverage
measles_coverage <- measles |>
  select(country_code = CODE,
         country_name = NAME,
         year = YEAR,
         antigen = ANTIGEN,
         coverage = COVERAGE,
         cat = COVERAGE_CATEGORY) |>
  mutate(cat = tolower(cat)) |>
  pivot_wider(names_from = cat, values_from = coverage)
  
rubella_coverage <- rubella |>
  select(country_code = CODE,
         country_name = NAME,
         year = YEAR,
         antigen = ANTIGEN,
         coverage = COVERAGE,
         cat = COVERAGE_CATEGORY) |>
  mutate(cat = tolower(cat)) |>
  pivot_wider(names_from = cat, values_from = coverage)

These data sets are good for practicing data merging and dealing with missing data.

Table 3.1: The first rows of measles_coverage
country_code country_name year antigen admin official wuenic
AFG Afghanistan 2024 MCV2 61.73 62.00 44
AFG Afghanistan 2024 MCV1 78.26 78.00 55
ALB Albania 2024 MCV1 80.73 80.73 81
ALB Albania 2024 MCV2 91.82 91.82 92
DZA Algeria 2024 MCV1 93.91 NA 94
DZA Algeria 2024 MCV2 90.25 NA 90
Plot Code
geom <- geom_point(alpha = 0.05, na.rm = TRUE, color = "#4C9F38")

mcv1 <- filter(measles_coverage, antigen == "MCV1")

ao <- ggplot(mcv1, aes(x = admin, y = official)) +
  geom +
  coord_cartesian(xlim = c(0, 150), ylim = c(0, 150)) +
  labs(x = "Administrative",
       y = "Official")

aw <- ggplot(mcv1, aes(x = wuenic, y = admin)) +
  geom +
  coord_cartesian(xlim = c(0, 100), ylim = c(0, 150)) +
  labs(x = "Estimated",
       y = "Administrative")

ow <- ggplot(mcv1, aes(x = wuenic, y = official)) +
  geom +
  coord_cartesian(xlim = c(0, 100), ylim = c(0, 150)) +
  labs(x = "Estimated",
       y = "Official")

design <- "
  1112
  1112
  1113
  1113
"

ao + aw + ow + plot_layout(design = design)
Figure 3.2: The relationships among administrative, offical, and WHO/UNICEF estimates for measles

3.3 Resources