Each day's cases arrive spread out over the following days, governed by the reporting delay distribution. So a recent day's count is only part observed; the rest is still in the post. A nowcast adds the two back together — and the bookkeeping is just a sum over reporting delays.
…so the present is only partly observed
Take all the events that actually happened on a given reference date t (say, everyone who developed symptoms that day). They don't all appear in the data at once: each is entered after a reporting delay d = 0, 1, 2, … days. The fraction of a day's cases that come in at each delay is the reporting delay distribution pd. So the day's eventual total Nt is spread forward over the following days.
Now look at the data as of "now", calendar date T. For a reference date t, only the reports with delay d ≤ T − t have had time to arrive. Everything with a longer delay is still to come. That splits every recent day's count into two pieces:
A nowcast is just observed + estimated missing = Nt. Counting only what's observed makes the most recent days look artificially low — the curve dips toward the present, which is easy to mistake for a real downturn.
Spread each day's cases by pd, then add observed + missing back up
The top panel shows the reporting delay distribution for the highlighted day t*: its Nt* cases get spread across delays in the proportions pd. The delays we've already seen (d ≤ T − t*) are teal; the delays still to come (d > T − t*) are amber.
The bottom panel turns that around: for every reference date it sums over delays to give a stacked bar — observed on the bottom, estimated missing on top. The two together are the nowcast, and they track the eventual curve Nt (slate line). The teal tops alone are the misleading dip.
observed + missing, with the bounds that matter
Write nt,d for the number of events with reference date t that are reported after a delay of exactly d days. On average a day's cases follow the delay distribution, nt,d ≈ Nt · pd. As of "now" T, the boundary between seen and unseen is the delay d = T − t: everything up to it has arrived, everything beyond it has not.
The two sums meet exactly at the boundary — the observed sum stops at d = T − t and the missing sum starts at d = T − t + 1 — so together they recover the full total:
We only ever see the observed sum. The nowcast estimates the missing sum from the delay distribution. Since the fraction of a day's reports expected in by now is the delay CDF F(T − t) = Σd=0T−t pd, the expected still-to-come is the rest:
So the familiar "divide by the fraction reported" nowcast is just the observed sum plus an estimate of the missing sum. The delay here is a discretised lognormal (the session uses plnorm with meanlog 1, sdlog 0.5); from a target mean m and spread s the parameters are σ² = ln(1 + s²/m²) and μ = ln m − σ²/2.
The delay CDF says how much of a reference date is in by now, so we divide by it
A reference date's cases are not all reported at once. Pick a recent reference date t*. Reports that have had a delay of d ≤ T − t* days have had time to arrive, so the share of that date we have seen by now is the delay CDF F(T − t*). The figure shows where that share comes from: each report-day carries a cap of height Nt* · pd, and the CDF is the running total of the caps up to the now line.
The red now line at day T is the truncation boundary. Caps at or before it are already reported, in teal; caps beyond it are still in the post, in amber and hatched. The bar at the foot of the figure reads off F(T − t*) at the current setting. The simplest nowcast divides the observed count by that proportion, which recovers Nt*.
The reference dates stay fixed; as time passes the cells fill in and the epidemic curve is reconstructed
Lay the nt,d out as a grid: each row is a fixed reference date t, each column a reporting delay d. The bars on the left are the epidemic curve by reference date — each row's filled length is the sum of its observed cells, the faint length its eventual total Nt. Press play and watch "now" T advance: the boundary sweeps across, cells flip from missing to observed, and the observed curve climbs to meet the truth. The dates never move — the triangle fills in.
Cell shading shows the expected number of reports at that delay (darker = more). With weekly reporting the data are still daily, but reports are only released once every 7 days — so the triangle fills in weekly batches and the recent curve jumps up in steps rather than creeping.
baselinenowcast all reduce to filling in the missing cells.