Nowcasting: observed + missing

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.

Each day's cases are spread across 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.

In the NFIDD session, onsets observed up to day 70 look like they are flattening and falling, while the complete data shows they were still rising. The apparent downturn was entirely the missing reports — pure right truncation.

Counts → reporting distribution → nowcast

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 (reports in) missing (still to come) eventual count Nt now (T)
day t* = 44 observedt* = missingt* = nowcastt* = % reported =
Drag t* back from the present: at t* = T (delay 0 only) almost everything is amber — barely any of today's cases are in yet. A few days back, the teal observed part has nearly caught up. Increase the delay mean and the amber wedge eats further back into the series: a longer delay means more days are badly incomplete.

The bookkeeping is one sum over delays

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.

nt,d = events with reference date t reported after delay d   (≈ Nt pd)
observedt = Σd=0 T−t nt,d       missingt = Σd=T−t+1 D nt,d

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:

Nt = observedt + missingt = Σd=0 D nt,d

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:

nowcastt = observedt + observedt · 1 − F(T−t)F(T−t)  =  observedtF(T−t)

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.

Why the recent edge is so uncertain. When only a small F(T − t) has been seen, the missing sum dwarfs the observed one, so the nowcast leans almost entirely on the assumed delay distribution rather than on data. That is why an honest nowcast widens sharply toward the present, and why getting pd right matters most for the last few days.

The simplest nowcast: scale up by the proportion reported

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*.

observedt = Nt · F(T − t)   →   nowcastt = observedtF(T − t)
onsets N(t) by reference date reports already in (d ≤ T − t*) reports still to come (d > T − t*) now (T) — truncation cut
date t* = F(T − t*) reported = observedt* = scale-up × 1/F = nowcastt* =
Sweep t* → T (or drag T back) and watch the now line eat into the kernel: at t* = T only the delay-0 cap is teal, so F is tiny and the scale-up 1/F explodes. This nowcast is a point estimate — no honest uncertainty of its own — and dividing a small, noisy observed count by a small F(T − t) is most fragile exactly at the recent edge, where we care most. Getting principled uncertainty (and sharing strength across dates) is precisely why the course moves on from this baseline to the Bayesian nowcasting models.

The reporting triangle, filling in over time

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.

observed (reported by now) still to come eventual N(t) now (T) boundary
now T = day
reporting schedule:

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.

Recent reference dates (the bottom rows, closest to T) have fewer observed cells, so less of their total is seen and more must be nowcast — which is exactly why the uncertainty grows toward the present.

Things worth remembering

The big picture. Reporting delay spreads each day's cases forward, so the present is only partly observed. Nowcasting adds the missing reports back: observedt + missingt = Nt — a single sum over reporting delays, with the boundary set by how long each day has had to be reported.