SIMID course notes · hazards & waiting times

Simulation models are usually parameterised with rates — a recovery rate, a rate of contact, a force of infection. But a stochastic model needs to draw a probability: the chance that one particular individual recovers, gets infected, or dies within a given time window. Turning one into the other correctly takes one formula.

p = 1 − exp(−rate · time)
rate
the instantaneous hazard — events per unit time — assumed constant over the interval below.
time
the length of the interval you're asking about, in the same time unit as the rate.
p
the probability that the event has occurred at least once by the end of that interval.

Holds exactly whenever the rate can be treated as constant across [0, time]. If the rate itself drifts over the interval, replace rate · time with the accumulated hazard ∫ rate(s) ds — same formula, just integrated.

01 — the mismatch

A rate is not a probability

A rate has units of 1/time and no upper bound: a recovery rate of 2 per day is a perfectly ordinary parameter. A probability has no units and lives strictly inside [0, 1]. Those are different kinds of number, so "just multiply by time" cannot be the whole story.

Try it anyway: at a rate of 2 recoveries per day, one day gives rate · time = 2 × 1 = 2. A probability of 2 is meaningless — yet this is exactly the shortcut it's tempting to code into a model. Something has to bend rate · time back down into [0, 1], and keep it there for any rate and any time. That something is the exponential in the formula above.

Rule of thumb: rate · time is always at least as large as the true probability, and only agrees with it when rate · time is small — the explorer below and the "shortcut" section further down make this precise.

02 — where the formula comes from

The constant-rate argument

The formula falls out of one assumption: the event arrives "completely at random" at a constant intensity — no memory of how long the individual has already been waited. Chop the interval into slices and take the limit.

  1. Split [0, time] into n tiny slices of width dt = time / n. Because the rate is constant, the chance the event happens during any one slice is just rate · dt, whichever slice it is. chance of surviving one slice = 1 − rate · dt
  2. The slices are independent (that's what "no memory" buys you), so the chance of surviving all n of them — i.e. the event still hasn't happened by time — is the product of the per-slice survival chances. survival to time = (1 − rate · time / n)ⁿ
  3. Let the slices get infinitely thin (n → ∞). This is exactly the classic limit that defines e, and it collapses to a clean exponential. (1 − rate · time / n)ⁿ → exp(−rate · time)
  4. "Event hasn't happened" and "event has happened" are complements, so subtract from 1. p(time) = 1 − exp(−rate · time)

This is the cumulative distribution function of the exponential distribution — the standard model for a waiting time under a constant hazard. It's also the only continuous distribution with the memoryless property built into step 2: an individual who has survived to day 10 has exactly the same recovery probability over the next day as one who started today. That's a strong assumption, but it's the one "a constant rate" always encodes.

Try it

Set a rate and drag along the time axis (or the slider) to see the exact probability, the naive rate · time shortcut, and where the two part ways.

exact — 1 − e⁻ʳᵃᵗᵉ·ᵗⁱᵐᵉ shortcut — rate · time
rate · time
0.90
exact p = 1 − e⁻ʳᵗ
0.593
shortcut rate · time
0.900
shortcut error
+51.9%
rate · time exceeds 1 here — the shortcut predicts a probability above 100% and is not usable at this point.
timerate · timeexact pshortcut rate·time

03 — when the shortcut is fine

When can I just use rate × time?

Expand the exponential: exp(−x) ≈ 1 − x + x²/2 − …, so 1 − exp(−x) ≈ x − x²/2 + …. For small x = rate · time, the linear term dominates and the shortcut is a good stand-in for the real formula.

That's precisely the situation inside most discrete-time simulations: a short step Δt multiplied by a rate that isn't enormous keeps rate · Δt small, so drawing a per-step event with probability rate · Δt is a reasonable Euler-style approximation of the exact 1 − exp(−rate · Δt). As a working rule, rate · time stays within about 5% of the exact value while rate · time < 0.1; by rate · time ≈ 1 the two have diverged sharply, and the shortcut can exceed 1 outright — a reliable sign that the time step is too coarse for the rate being simulated.

04 — worked example

Recovery in a simulated outbreak

A. Probability of recovery within a given window

Infectious individuals recover at a constant rate γ = 0.2 / day (a mean infectious period of 1/γ = 5 days). What's the chance a given individual has recovered within 1 day? Within 10 days?

1 day:   p = 1 − exp(−0.2 × 1) = 1 − exp(−0.2) ≈ 0.181  (shortcut: 0.2 — close, since rate·time is small)

10 days:   p = 1 − exp(−0.2 × 10) = 1 − exp(−2) ≈ 0.865  (shortcut: 2.0 — meaningless here)

B. Turning a rate into a daily transition probability

A discrete-time model that advances one day at a time needs, for every infectious agent, a per-day probability of recovering. The correct value to draw from is the exact formula applied to one time step, not the rate itself:

per-day recovery probability = 1 − exp(−γ × 1) = 1 − exp(−0.2) ≈ 0.181, not γ = 0.2.

The gap is small at this rate and this step size — but it grows with a coarser step (say, a weekly update) or a faster rate (say, a short serial interval), which is why simulations built around long or variable time steps should convert through the exponential rather than hard-coding the rate as a probability.

Recap

  • p = 1 − exp(−rate · time) converts a constant rate into the probability the event has happened by time.
  • It comes from treating the event as arriving at random with constant intensity — a memoryless, constant-hazard process.
  • rate · time alone only approximates p well when it's small; it always sits at or above the true probability, and it can exceed 1 where the true probability cannot.
  • If the rate itself varies over the interval, integrate it: use ∫ rate(s) ds in place of rate · time.
SIMID course notes — rates, hazards, and waiting times under the constant-rate assumption.