The case curve we actually see — symptom onsets, reports — is never the same as the latent infections that drove it. Each infection is observed only after an individual delay, and adding those delayed contributions up across the whole population is a convolution. It shifts the curve later and smears it wider. This is the forward data-generating process; inference later runs it in reverse.
Population-level delays turn into a convolution of two time series
Work in discrete daily time. Let I(t) be the number of latent infections on day t, and let f(s) be the delay distribution — the probability that an infected person is observed (e.g. develops symptoms) exactly s days later. An infection on day t−s shows up on day t with probability f(s). Sum those contributions over every earlier day and you get the observed count C(t):
That single sum is the convolution, written C = I ∗ f. Read it as a recipe: for each output day t, walk back over the infection history, weight each past day by how likely its infections are to surface today, and add. Two things happen as a result, and they are the whole story of this page:
| Symbol | Meaning | In the figures |
|---|---|---|
| I(t) | latent incidence (infections) on day t | blue filled bars |
| f(s) | discretised delay distribution (a PMF over days) | teal kernel weights |
| C(t) | observed counts (onsets / reports) on day t | orange bold line |
A continuous delay distribution, discretised into per-day probabilities
The incubation period is naturally a continuous distribution, but our counts are tallied by day. We therefore discretise it into a probability mass function f(s), one bar per whole day of delay. Here we use a lognormal delay with a chosen mean m and standard deviation ssd. Match the moments, then take daily differences of the CDF:
The bars are then renormalised to sum to 1 over the days we keep (0 … Smax). Slide the mean and the spread and watch the shape: a small mean piles probability on the first day or two; a large spread flattens it into a long right tail. This f(s) is the kernel that does all the shifting and smearing in the next figures.
Feed an infection curve through the delay and watch the onsets appear
Here is the whole forward process at a glance. The blue filled bars are a latent infection curve I(t) — control its peak day and width, and add an optional second wave. The orange line is the resulting onset curve C(t) after convolving with the same delay PMF as above. Move any slider and watch the orange curve slide right (by about the delay mean) and flatten out (by about the delay spread).
The convolution sum, one output day at a time
This is the heart of it. To get the single observed value C(t*) on one output day t*, the convolution does three things:
Drag t* across the axis — or press ▶ play — and watch the flipped kernel sweep left to right, its weighted products rise and fall, and their running sum trace out the entire onset curve, point by point.
Why inference is the convolution run in reverse
Everything above is the forward direction: given infections and a delay, produce the observations. In practice we have the opposite problem — we see the onsets C(t) and want the infections I(t) that we never observed directly. Recovering I from C and f is deconvolution, and the course fits it as a Bayesian model.
| Forward (this page) | Inverse (inference) | |
|---|---|---|
| You know | I(t) and f(s) | C(t) and f(s) |
| You want | C(t) | I(t) |
| Operation | convolution I ∗ f | deconvolution |
| Difficulty | one direct sum | ill-posed; needs priors & MCMC |
| Uncertainty | none (deterministic) | large, esp. for recent days |