Ebola DRC & Uganda 2026: R₀ and Rₜ Estimation

Bundibugyo Virus Outbreak — Biostatistical Analysis

Author

Biostatistics Analysis

Published

May 26, 2026

Background

On 15 May 2026, DRC and Uganda declared an Ebola (Bundibugyo virus) outbreak. WHO declared a PHEIC on 16 May 2026 — the 17th DRC Ebola outbreak. As of 24 May, >1,010 cases and 130 deaths were reported across both countries. This document estimates R₀ and Rₜ using reported case data reconstructed from WHO, CDC, and ECDC situation reports.

Code
# Install packages if needed
#pkgs <- c("EpiEstim", "incidence2", "tidyverse", "patchwork", "scales", "gt")
#new_pkgs <- pkgs[!pkgs %in% installed.packages()[,"Package"]]
#if(length(new_pkgs)) install.packages(new_pkgs, repos = "https://cloud.r-project.org")

library(EpiEstim)
library(tidyverse)
library(patchwork)
library(scales)
library(gt)

1. Data

Data reconstructed from WHO DON, CDC HAN, and ECDC situation reports (24 April – 24 May 2026). Daily new cases are interpolated between official cumulative anchor points.

Code
df <- read_csv("ebola_drc_uganda_2026.csv", show_col_types = FALSE) |>
  mutate(date = as.Date(date))

# DRC only for Rt (Uganda cases too few for robust estimation)
drc <- df |> filter(country == "DRC") |>
  select(date, I = new_cases_estimated, intervention)

drc |>
  select(Date = date, `New Cases` = I, Intervention = intervention) |>
  gt() |>
  tab_header(title = "DRC Daily Estimated New Cases") |>
  tab_style(
    style = cell_fill(color = "#fff3cd"),
    locations = cells_body(rows = Intervention != "None")
  ) |>
  cols_align("center")
DRC Daily Estimated New Cases
Date New Cases Intervention
2026-04-24 1 None
2026-04-27 3 None
2026-04-30 5 None
2026-05-03 9 None
2026-05-06 17 None
2026-05-09 33 None
2026-05-12 62 None
2026-05-14 70 None
2026-05-15 46 Outbreak declared
2026-05-16 34 PHEIC declared
2026-05-17 40 PHEIC declared
2026-05-18 50 Enhanced screening
2026-05-19 130 Enhanced screening
2026-05-20 40 Enhanced screening
2026-05-21 35 Response scaling
2026-05-22 105 Response scaling
2026-05-23 120 Response scaling
2026-05-24 104 Response scaling

2. Epidemic Curve

Code
vlines <- drc |> filter(intervention != "None") |>
  distinct(date, intervention)

p_epi <- ggplot(drc, aes(x = date, y = I)) +
  geom_col(aes(fill = I), show.legend = FALSE) +
  geom_vline(data = vlines, aes(xintercept = date, color = intervention),
             linetype = "dashed", linewidth = 0.8) +
  scale_fill_gradient(low = "#f7cac9", high = "#c0392b") +
  scale_color_manual(values = c("Outbreak declared" = "#e67e22",
                                "PHEIC declared"    = "#8e44ad",
                                "Enhanced screening"= "#2980b9",
                                "Response scaling"  = "#27ae60")) +
  scale_x_date(date_labels = "%b %d", date_breaks = "5 days") +
  labs(title = "Ebola DRC 2026 — Daily New Cases",
       subtitle = "Bundibugyo virus | Ituri, Nord-Kivu, Sud-Kivu provinces",
       x = NULL, y = "New Cases", color = "Intervention") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "bottom",
        plot.title = element_text(face = "bold"))

p_epi

Epidemic curve of DRC Ebola cases 2026


3. R₀ Estimation (Exponential Growth Phase)

R₀ is estimated from the exponential growth phase (Apr 24 – May 15) using the Lotka-Euler equation:

\[R_0 = 1 + r \cdot T_g\]

where r is the growth rate and T_g is the mean generation time.

For Bundibugyo Ebola, we use a serial interval of mean = 12.0 days, SD = 5.3 days (based on prior Bundibugyo outbreaks; Althaus et al.; WHO Ebola Response Team literature).

Code
# Exponential growth phase subset
growth_phase <- drc |> filter(date <= as.Date("2026-05-15"), I > 0)

# Fit log-linear model
fit <- lm(log(I + 1) ~ as.numeric(date), data = growth_phase)
r   <- coef(fit)[2]  # daily growth rate

# Generation time parameters (Bundibugyo; Althaus 2014 / WHO EVD team)
Tg_mean <- 12.0
Tg_sd   <- 5.3

# R0 via Lotka-Euler (gamma-distributed generation time)
shape <- (Tg_mean / Tg_sd)^2
rate  <- Tg_mean / Tg_sd^2
R0    <- (1 + r / rate)^shape

# Bootstrap CI
set.seed(42)
boot_r <- replicate(2000, {
  samp <- sample_n(growth_phase, nrow(growth_phase), replace = TRUE)
  coef(lm(log(I + 1) ~ as.numeric(date), data = samp))[2]
})
R0_boot <- (1 + boot_r / rate)^shape
R0_ci   <- quantile(R0_boot, c(0.025, 0.975))

tibble(
  Parameter     = c("Daily growth rate (r)", "Mean serial interval", "R₀", "95% CI lower", "95% CI upper"),
  Value         = round(c(r, Tg_mean, R0, R0_ci[1], R0_ci[2]), 3)
) |>
  gt() |>
  tab_header(title = "R₀ Estimation — Exponential Growth Phase") |>
  tab_style(style = cell_fill(color = "#fdecea"),
            locations = cells_body(rows = Parameter == "R₀")) |>
  fmt_number(columns = Value, decimals = 3)
R₀ Estimation — Exponential Growth Phase
Parameter Value
Daily growth rate (r) 0.168
Mean serial interval 12.000
R₀ 5.454
95% CI lower 4.315
95% CI upper 6.579

Interpretation: An R₀ > 1 confirms sustained human-to-human transmission. R₀ values for past Ebola outbreaks typically range 1.5 – 2.5; Bundibugyo 2007 Uganda outbreak had R₀ ≈ 1.34 – 2.12.


4. Rₜ Estimation Over Time (EpiEstim)

Rₜ captures how transmissibility changes as interventions are applied. We use the parametric SI (serial interval) method from EpiEstim with a 7-day sliding window.

Code
# Prepare incidence vector
inc_vec <- drc |>
  arrange(date) |>
  mutate(I = pmax(I, 0)) |>
  pull(I)

# EpiEstim config — parametric serial interval
config <- make_config(
  method          = "parametric_si",
  mean_si         = 12.0,
  std_si          = 5.3,
  t_start         = 2:(length(inc_vec) - 6),
  t_end           = 8:length(inc_vec)
)

res <- estimate_R(incid = inc_vec, method = "parametric_si", config = config)

# Extract results with dates
rt_df <- res$R |>
  as_tibble() |>
  mutate(
    date = drc$date[t_end],
    Rt   = `Mean(R)`,
    lower = `Quantile.0.025(R)`,
    upper = `Quantile.0.975(R)`
  )

# Intervention dates for shading
interventions <- tibble(
  xmin  = as.Date(c("2026-05-15", "2026-05-16", "2026-05-18")),
  xmax  = as.Date(c("2026-05-16", "2026-05-18", "2026-05-24")),
  label = c("Outbreak\ndeclared", "PHEIC\ndeclared", "Response\nscaling"),
  ypos  = c(3.8, 3.5, 3.2)
)

p_rt <- ggplot(rt_df, aes(x = date)) +
  geom_rect(data = interventions,
            aes(xmin = xmin, xmax = xmax, ymin = -Inf, ymax = Inf, fill = label),
            alpha = 0.12, inherit.aes = FALSE) +
  geom_ribbon(aes(ymin = lower, ymax = upper), fill = "#3498db", alpha = 0.25) +
  geom_line(aes(y = Rt), color = "#2c3e50", linewidth = 1.1) +
  geom_point(aes(y = Rt), color = "#e74c3c", size = 1.8) +
  geom_hline(yintercept = 1, linetype = "dashed", color = "red", linewidth = 0.9) +
  annotate("text", x = min(rt_df$date) + 1, y = 1.08,
           label = "Rₜ = 1 (control threshold)", color = "red", size = 3.2, hjust = 0) +
  scale_fill_manual(values = c("Outbreak\ndeclared" = "#e67e22",
                                "PHEIC\ndeclared"    = "#8e44ad",
                                "Response\nscaling"  = "#27ae60")) +
  scale_x_date(date_labels = "%b %d", date_breaks = "4 days") +
  scale_y_continuous(limits = c(0, NA)) +
  labs(title    = "Effective Reproduction Number Rₜ — DRC Ebola 2026",
       subtitle = "7-day sliding window | Parametric serial interval (mean=12d, SD=5.3d)",
       x = NULL, y = "Rₜ", fill = "Intervention") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "bottom",
        plot.title = element_text(face = "bold"))

p_rt

Rt over time for DRC Ebola 2026


5. Combined Dashboard

Code
p_epi / p_rt +
  plot_annotation(
    title   = "Ebola DRC & Uganda 2026 — Transmission Analysis",
    caption = "Sources: WHO DON-602/603, CDC HAN-530, ECDC Threat Assessment | Analysis: EpiEstim (Cori et al., 2013)",
    theme   = theme(plot.title = element_text(face = "bold", size = 14))
  )


6. Summary Table

Code
latest_rt <- rt_df |> slice_tail(n = 1)

tibble(
  Metric     = c("R₀ (exponential phase)", "Latest Rₜ (95% CI)", 
                 "Total suspected cases (DRC)", "Total Uganda cases",
                 "CFR (confirmed)", "PHEIC declared"),
  Value      = c(
    paste0(round(R0, 2), " (", round(R0_ci[1],2), "–", round(R0_ci[2],2), ")"),
    paste0(round(latest_rt$Rt, 2),
           " (", round(latest_rt$lower, 2), "–", round(latest_rt$upper, 2), ")"),
    "904 (as of 23 May 2026)",
    "7 confirmed (as of 23 May 2026)",
    "~12% among confirmed",
    "16 May 2026"
  )
) |>
  gt() |>
  tab_header(
    title    = "Key Epidemiological Indicators",
    subtitle = "Bundibugyo Ebola — DRC & Uganda 2026"
  ) |>
  tab_style(style = list(cell_fill(color = "#fdecea"), cell_text(weight = "bold")),
            locations = cells_body(rows = 1:2)) |>
  cols_align("left", columns = Value)
Key Epidemiological Indicators
Bundibugyo Ebola — DRC & Uganda 2026
Metric Value
R₀ (exponential phase) 5.45 (4.31–6.58)
Latest Rₜ (95% CI) 3.92 (3.61–4.25)
Total suspected cases (DRC) 904 (as of 23 May 2026)
Total Uganda cases 7 confirmed (as of 23 May 2026)
CFR (confirmed) ~12% among confirmed
PHEIC declared 16 May 2026

7. Interpretation

  • R₀ > 1 during the undetected phase (Apr 24 – May 15) confirms rapid unchecked spread before detection — consistent with the 4-week detection gap.
  • Rₜ trends show whether post-declaration interventions (contact tracing, isolation, travel screening) are bending the curve below the critical threshold of Rₜ = 1.
  • Rₜ dropping toward 1 signals control; sustained Rₜ > 1 indicates ongoing exponential growth requiring intensified response.
  • Bundibugyo historically has lower R₀ than Zaire strain (~1.3–2.1), but the delayed detection and geographic spread to Kampala elevate outbreak risk considerably.

Data reconstructed from WHO/CDC/ECDC official situation reports. Serial interval parameters from Althaus (2014) and WHO Ebola Response Team literature. Analysis uses EpiEstim (Cori et al., 2013, AJE).