How to serial interval?

Sam Abbott

London School of Hygiene & Tropical Medicine

16 June 2026

Talk plan

  • What is a serial interval, and why do we want it?
  • A delay seen through censoring and truncation
  • The same machinery in software, and beyond transmission pairs
  • A within-host informed approach, and a generic alternative
  • Delay estimation in practice
  • Representing composed distributions
  • How can you help me?

samabbott.co.uk/how-to-serial-interval

Lorentz Center workshop, Connecting Survival Analysis and Infectious Disease Modeling, Leiden, 16 June 2026.

What is a serial interval?

Two delays: serial and generation interval

  • Serial interval (SI): time between symptom onset of infector and infectee
  • Generation interval (GI): time between infections
  • The SI can be negative: the infectee’s symptoms can appear before the infector’s, for example with presymptomatic transmission
  • The GI is what some transmission models need; the SI is usually what we get to observe

Source: within-host informed event-time framework (Jamieson et al., working paper)

But we rarely observe this exactly

  • Infection and transmission times are latent — we almost never see them directly
  • Symptom onsets are recorded to a day at best, and “onset” is itself imprecise: definitions vary, and recall is biased
  • So we never fully observe it — we come to how we currently handle that next
  • Estimating a serial interval is really estimating a delay from incomplete data

Source: within-host informed event-time framework (Jamieson et al., working paper)

Why do we want it?

  • Feeds \(R_t\) through the renewal equation, and links the growth rate \(r\) to the reproduction number \(R\)
  • Beyond renewal: used to reconstruct infection times from onsets by deconvolution
  • Also feeds forecasting and contact tracing
  • But the SI is a proxy for the generation interval, the quantity some transmission models need
  • And do we want the measure itself? The transmission-pair data are what is valuable; the serial interval is just one summary of them

Note

Defined from the right reference cohort, the forward SI links \(r\) to \(R\) just as the GI does.

A delay seen through censoring and truncation

How do we currently suggest people estimate and report a delay distribution?

  • Adjust for within-interval censoring of both events (always)
  • Right truncation is the correction for dynamical (epidemic-phase) bias
  • Fit several distributions and compare with model-fit statistics
  • Report uncertainty, and share de-identified line lists and code

Note

Later, the Andes-virus analysis works through a version of this checklist: andv-linelist-analysis.

Flowchart: Fig 3 of Charniga et al. (2024), PLOS Comput Biol, CC-BY 4.0

One delay, built up in three steps

  • For now treat the serial interval as a single event-to-event delay, ignoring that it is itself composed — we return to that later
  • Daily or weekly data put both the primary (infector) and secondary (infectee) events in windows, not at points
  • In real time, long delays have not happened yet
  • Build the observation model up in three steps:
    1. primary interval censoring
    2. secondary interval censoring
    3. right truncation

Diagram: this talk

1. Primary interval censoring

  • The infector’s event falls in a window \([0, w_P]\)
  • It need not be uniform, but a uniform primary is a fair assumption, especially when the window is short
  • Mix the delay over where the event sat in the window — a convolution on the CDF

\[ F_{\mathrm{PEC}}(t) = \int_{0}^{w_P} g(\tau)\, F(t - \tau)\, d\tau \]

Maths after primarycensored

Note

We can solve this integral, and have done so analytically for common families: gamma, lognormal, and Weibull with a uniform primary window.

2. Secondary interval censoring

  • The infectee’s onset is also recorded to the day
  • The probability in a daily bin is a difference of the primary-censored CDF
  • This doubles as a probability mass function for a continuous delay in daily discrete-time models (EpiNow2, EpiEstim, epinowcast)

\[ \Pr\!\big(T \in [n, n + w_S]\big) = F_{\mathrm{PEC}}(n + w_S) - F_{\mathrm{PEC}}(n) \]

Note

In the past this was often written as a double integral, which is typically more complicated to evaluate.

3. Right truncation

  • In real time we only see a pair if the secondary event is before the cutoff \(C\)
  • Condition on being observed: divide by the CDF at the truncation horizon
  • Short delays are over-represented early in an epidemic

\[ L^{\mathrm{RT}} = \frac{F_{\mathrm{PEC}}(n + w_S) - F_{\mathrm{PEC}}(n)} {F_{\mathrm{PEC}}(C - P)} \]

Diagram: this talk

Note

Each step is a different bias adjustment, composed together.

The same machinery, in software

What primarycensored solves

  • Really a wrapper for any delay distribution: it adds the primary and secondary censoring and truncation around whatever family you choose
  • Analytic primary-censored CDFs for gamma, lognormal, and Weibull with a uniform primary; numerical integration otherwise
  • Signed support (normal, logistic, Laplace, Cauchy, Gumbel) for delays that can be negative
  • And a non-parametric, hazard-based estimator (#312) — it needs an eye on it, and is not clearly a good idea: for onward reuse we have little guidance yet on how to estimate or report these

Empirical (censored) samples vs the analytic PMF — primarycensored · estimator #312

Tied into the ecosystem

  • The same delay \(f\) enters three of our tools in different forms:
    • epidist — individual-level delays from line lists
    • EpiNow2 — delays in estimate_dist, estimate_truncation, estimate_infections
    • epinowcast — population-level nowcasting: \(f\)’s hazard modified over time, or straight discrete-time hazards; with uncertainty on the counts
  • How to choose between them is an open question — is there guidance in the time-to-event literature?

epidist — individual likelihood \[ \textstyle\prod_i f(t_i) \]

EpiNow2 — convolve incidence \[ C_t = \sum_{\tau} f(\tau)\, I_{t-\tau} \]

epinowcast\(f\)’s hazard, modified (or free) \[ \operatorname{logit} h_d = \operatorname{logit} h_d^{f} + \text{effects} \] \[ \mathbb{E}[n_{t,d}] = \lambda_t\, h_d\textstyle\prod_{d'<d}(1-h_{d'}) \]

Ongoing work

Point-source outbreaks are the same problem

  • A common-source outbreak shares one exposure window
  • The distribution of exposure times within the source may itself differ — it need not be uniform
  • Estimate the incubation period from onset dates; the same censoring and dynamical-bias issues apply
  • A Legionnaires’ model in use by UKHSA does this, deconvolving onsets into a release time and an incubation period (Egan & Hall 2011)
  • It extends naturally to multiple candidate sources

Diagram: this talk, after the point-source incubation idea of Egan & Hall (2011)

What is coming: more windows, more families

  • The censored CDF is the delay density \(f\) convolved with the primary-event window \(H_w\):

\[ F_{\mathrm{cens}}(q) = \int_0^q H_w(q-u)\, f(u)\, du \]

  • Expanding the window as exponentials reduces this to Laplace-type transforms \(T_f(\xi;\tau)=\int_0^\tau e^{\xi u} f(u)\,du\) of \(f\):

\[ F_{\mathrm{cens}}(q) = \sum_k a_k(q)\, T_f(\xi_k; q) \]

  • The window (uniform, exponentially tilted, logistic, Gumbel) sets the \(a_k, \xi_k\); the delay family sets whether \(T_f\) is analytic
Delay family Transform
exponential, gamma, inverse Gaussian analytic
Weibull, generalised gamma, Gompertz, log-logistic, Burr semi-analytic
lognormal numerical

Transform extension to non-uniform windows: Jamieson et al. (working paper); logistic and Gumbel windows after Egan & Hall (2011)

Back to the serial interval

Now think of it as a composed delay

  • We treated the SI as one event-to-event delay; it can be thought of as a composition of delays
  • Onsets are what we see; infection and transmission are latent

\[ GT = LP + U \] \[ SI = GT + (IP_2 - IP_1) \]

  • The composition is where the biology can enter

Source: within-host informed event-time framework (Jamieson et al., working paper)

A within-host informed approach

One within-host model coupling the delays

  • A shared pathogen load \(V(t)\) in the infector drives three event hazards
    • infectiousness onset \(h_I\)
    • symptom onset \(h_S\)
    • transmission \(p_{\text{trans}}\)
  • So \(LP\), \(U\), and \(IP_1\) are coupled by the viral load, not separate marginals
  • The delays stay mutually consistent, and the parameters keep a biological meaning
  • Builds on the within-host to Burr-distribution idea of Jamieson & Hall (2024)

Framework: Jamieson et al. (working paper). Within-host idea: Jamieson et al. (2024)

The viral-load trajectory

  • A rise-and-fall pathogen load with four interpretable parameters
    • growth rate \(r\)
    • peak time \(m\)
    • decay rate \(d\)
    • transition sharpness \(\kappa\)

\[ V(t) = A\, e^{rt} \left\{1 + \tfrac{r}{d}\,e^{\kappa(t-m)}\right\}^{-(r+d)/\kappa} \]

  • In reality it is often more complex, with substantial individual-level variation (Russell et al. 2024)

Framework: Jamieson et al. (working paper). Trajectory form follows Ke et al. 2021, Puhach et al. 2023

Per-event hazards turn load into delays

  • Each event is a stochastic activation with a hazard set by the load

\[ F_Z(t) = 1 - \exp\!\left\{-\!\int_0^t h_Z(s)\,ds\right\} \]

  • \(V(t)\) is shaped by \(r, m, d, \kappa\); a per-event scale \(\beta_Z\) sets how strongly each event responds to load

Each delay reads off the same \(V(t)\):

infectiousness onset \(\to LP\) \[ h_I(t) = \beta_I\, V(t) \]

symptom onset \(\to IP\) \[ h_S(t) = \beta_S\, V(t) \]

transmission \(\to U\) (so \(GT = LP + U\)) \[ \lambda_T(u \mid LP{=}\ell) = c\,p_{\text{trans}} = c\,\beta_T\, V(\ell + u) \]

Note

Why these forms? Each rate is proportional to load as a parsimonious baseline; other activation functions give other families (\(V(t)\,g(t)\) gives the Burr).

  • \(h_S = \beta_S V\): no fixed symptom threshold, so a stochastic activation
  • \(\lambda_T = c\,p_{\text{trans}}\) with \(p_{\text{trans}}=\beta_T V\): a contact (rate \(c\)) and infection given contact, only after infectiousness — so \(U\) is timed from \(LP\)
  • \(\beta_I, \beta_S\) may be related if symptoms track infectiousness

Framework: Jamieson et al. (working paper)

SARS-CoV-2: shorter generation time for Omicron

  • Dutch household transmission pairs, Delta replaced by Omicron
  • Shorter mean generation time for Omicron than Delta
  • Lower WAIC and LOOIC than a lognormal generation-time model, for both strains

Framework: Jamieson et al. (working paper). Data: Backer et al. 2022, Park et al. 2023

SARS-CoV-2: fit to the serial intervals

  • Both models reproduce the modal interval and the tails
  • For Omicron the within-host informed model captures the peak and both tails better than the lognormal
  • The fit stays comparable while keeping a biological link to the latent generation time

Framework: Jamieson et al. (working paper)

Mpox: bringing in external viral-load information

  • 34 high-confidence mpox transmission pairs
  • External viral-load data build informative priors on the trajectory parameters \((\log r, \log d, m, \log\kappa)\)
  • The decline \(\log d\) and peak time \(m\) shift under the viral-load prior: external information constrains weakly identified parameters
  • A natural next step: jointly fit the transmission pairs and the viral-load data, rather than passing one in as a prior

Framework: Jamieson et al. (working paper). Mpox pairs: Miura et al. 2024; viral load: Yang et al. 2024

You don’t need a within-host model

The hierarchy is agnostic to the hazard

  • The event-time hierarchy holds for any hazard form; the within-host \(V(t)\) is one choice
  • A generic alternative: contact-interval survival models — time from infectiousness onset to infectious contact is a transmission hazard, with no within-host trajectory needed (Kenah 2011)
  • This contact interval is exactly our \(U\) (infectiousness onset to transmission), so \(GT = LP + U\) — now with \(U\) from a generic hazard, not \(V(t)\)

Note

For an ordered pair \((i,j)\), the contact interval \(\tau_{ij}\) is the time from \(i\)’s onset of infectiousness to the first infectious contact from \(i\) to \(j\) (one able to infect a susceptible) — right-censored if none occurs before \(i\) is removed. Kenah models it through its hazard, \(f(\tau)=\lambda(\tau)\,e^{-\int_0^\tau \lambda}\), with covariates as a Cox-type \(\lambda(\tau\mid X)=\lambda_0(\tau)\,e^{\beta^\top X}\).

Diagram: this talk, after the contact-interval idea of Kenah (2011)

Delay estimation in practice

Biases I have not mentioned

  • We have focused on censoring and truncation, but transmission data carry more
  • Household and cluster data: susceptible depletion shortens the observed generation and serial intervals as susceptibles run out
  • Who infected whom is uncertain; coprimary and tertiary cases contaminate pairs
  • The reference cohort matters: which event reporting is conditioned on
  • Observation is often missing not at random
  • Other pathogens compose differently: vector-borne diseases add an extrinsic incubation period in the vector, and further delays

Andes virus: Epuyén, 2018-19 — the model

  • First sustained person-to-person hantavirus spread: one zoonotic introduction, four human generations, super-spreading (Martínez et al. 2020)
  • Index cases give the incubation period; sourced cases give source-onset to onset
  • The serial interval is a convolution of transmission timing \(\delta\) and the secondary incubation period — \(\delta\) can be negative
  • \(R(t)\) and offspring dispersion come from the same fit

Andes virus: Epuyén, 2018-19 — results

  • The incubation period and transmission timing \(\delta\), with the derived generation and serial intervals
  • \(\delta\) sits close to source onset, so transmission is near presymptomatic
  • The within-host approach could replace all these empirical delays — the incubation period and \(\delta\) — here

Bundibugyo Ebola: Isiro, 2012 — the model

  • A line list, early in an outbreak — not a serial interval, but the same censoring problem
  • The original onset-to-death estimate was a point estimate with no uncertainty (Rosello et al. 2015); the reanalysis adds it
  • Each case has four delays, with a per-case identity \(D_{od} = D_{oa} + D_{ad}\)
  • Death versus discharge is a competing risk; the split is the case-fatality ratio

Bundibugyo Ebola: Isiro, 2012 — results

  • The four delays fitted under double interval censoring, compared across lognormal, gamma, and Weibull
  • Gamma fits best (lowest WAIC); dashed lines mark the prior point estimates
  • Fitting several families and comparing is the Charniga checklist in action

Representing composed distributions

Why?

  • As we have seen, many epidemiological delays can be thought of as composed of delays between events
  • The serial interval is a generation time plus an incubation difference, observed through primary and secondary censoring and truncation
  • The same few biases recur, in different combinations
  • We want to write a delay down once, from reusable, tested parts, and reuse it across models

Note

A longer take on this idea of building models from parts: Juniper seminar (YouTube)

CensoredDistributions.jl

  • A Julia package, in effect a version of primarycensored
  • Censoring and truncation are just wrappers around a delay
  • The result is a distribution you can pdf, rand, and fit with Turing.jl
using CensoredDistributions, Distributions, Turing

# a censored, truncated delay
d = double_interval_censored(
    Gamma(2, 3); upper = 15, interval = 1)

# fit it with Turing.jl
@model function fit(y, w)
    α ~ truncated(Normal(2, 1), 0, Inf)
    θ ~ truncated(Normal(3, 1), 0, Inf)
    y ~ weight(double_interval_censored(
        Gamma(α, θ); upper = 15, interval = 1), w)
end

Building distributions from parts

  • In development: compose the delays between events
  • Additive chains, competing outcomes by racing hazards, or a data field that selects the sub-model
  • Then wrap the whole delay in the observation model
  • Covariates can modify it — on the hazard scale, or within individual delay leaves
# build delays between events from parts
si = sequential(generation_time, incubation)

# competing outcomes by probability (a CFR) ...
resolve = competing(:death => (death, cfr),
                   :discharge => (discharge, 1 - cfr))
# ... or by racing hazards:
# competing(:death => death, :discharge => discharge)

# a record field selects the sub-model
delay = selecting(:index => incubation, :sourced => si)

# assemble the record, then observe it through
# interval censoring + truncation
tree = compose((delay = delay, resolution = resolve))
obs  = double_interval_censored(tree; interval = 1)

In-flight composer work: CensoredDistributions.jl#363

Backing different model types

  • Composed delays back different model types
  • Individual likelihoods; counts via convolution or reporting hazards; or lowered onto a reaction network for a mechanistic model
# individual level: likelihood / simulate
logpdf(d, t);   rand(d)

# counts: convolve with incidence (EpiNow2)
expected = convolve(infections, d)

# or as reporting hazards (epinowcast)
h = delay_hazard(pmf)

# mechanistic: lower the delay onto a transition
# of a Catalyst reaction network (linear chain)
using Catalyst
chain = linear_chain_reactions(d, I, R)

Note

Simulation and logpdf for individual data, convolution for counts, or — via the linear-chain trick — a Catalyst reaction network for a compartmental model.

How can you help me?

Ask 1: review my hazard-based delay estimator

I have an open PR in primarycensored that adds non-parametric, hazard-based delay estimation alongside the parametric families.

  • It estimates the delay PMF on fixed bins, either directly (a simplex) or through per-bin discrete-time hazards, with a random-walk or IID random-effects prior on logit(hazard).
  • Hazards and PMF are interconvertible, and both fit through the same doubly-censored, right-truncated likelihood as the parametric distributions.
  • It drops the parametric-shape assumption while still handling the censoring and truncation.

The ask

primarycensored#312: is the discrete-time hazard formulation right, and how should we modellers handle a non-parametric delay estimate for onward use? We have little guidance on reusing one.

Ask 2: pairwise / contact-interval survival models

I want to push Eben Kenah’s pairwise survival idea further and connect it to the event-time view of serial and generation intervals.

  • Kenah (2011) treats the contact interval as a time-to-event variable and does survival analysis on who infected whom.
  • That feels like the right language for the dependent point process behind generation and serial intervals.
  • The transmission data are interval-censored on both ends, and the at-risk set changes as susceptibles are depleted.

The ask

How do we bring contact-interval survival machinery to dependent transmission data, and where does it break when start times are unobserved and the risk set is itself part of what we are estimating?

Ask 3: why are you not anxious about double interval censoring?

We spend a lot of effort on primary plus secondary interval censoring, dynamical bias, and real-time truncation. You handle interval censoring routinely and seem far less worried.

  • Are we over-engineering this, and what is genuinely different on our side?
  • My guesses: the start time is itself censored, and the events are dependent through transmission — you estimate in real time too, so it is probably not that.

Ask 4: what would a survival-time model for outbreak size look like?

  • We estimate the current size of the 2026 DRC Bundibugyo (Ebola) outbreak in real time — not a delay, but the same toolkit
  • A joint Bayesian renewal model over all these streams, with ascertainment; committed deaths give a lower bound

The ask

What would a survival / time-to-event model look like? Where would competing-risks or multi-state thinking help?

Model: BVDOutbreakSize (Abbott, Sherratt, Brand, Funk); diagram this talk

Ask 5: which delay tool, when — or none of them?

  • We have a growing toolbox: epidist, EpiNow2, epinowcast, and the composed-distribution machinery
  • We do not have good guidance on which to use when — individual versus population level, parametric versus not
  • Or maybe none of them, and the right answer is a time-to-event / survival model instead

The ask

Help us match tool to question — and tell us where a survival-analysis model would simply be the better choice.

Ask 6: how should the reporting advice adapt for survival methods?

  • Charniga et al. (2024) give best-practice advice for estimating and reporting delay distributions, written largely from the modelling side
  • Survival analysis brings Turnbull, interval-censored likelihoods, competing risks, and frailty — with their own reporting conventions

The ask

How should that advice be updated to fold in survival-analysis methods? Help us write the next version of the checklist — one that speaks both languages.

Wrapping up

Summary

  • A serial interval is a delay seen through censoring and truncation: within-interval censoring of both events, and right truncation for dynamical bias
  • Treated simply it is event-to-event; really it is a composition of delays, which is where the biology, or a generic hazard, enters
  • Within-host informed models couple the delays; generic contact-interval models need less
  • The estimate is only as good as the data collection and the biases behind it
  • Composable tooling lets us write these delays once and reuse them across model types

Thank you

An ecosystem for estimating and using delays: