Skip to content

Original ResearchVolume 1, Issue 2, Winter 2025

When Most People Infect Nobody: What Overdispersion Does to an Outbreak

We fixed the average number of people one infection passes on and swept only the unevenness around that average, across 680,000 simulated branching-process outbreaks, then checked every extinction probability against its exact analytic root.

Written jointly by the Science Journaling Club

Study
Computational study
Review
Peer-edited by the club review board
Length
11 sectionsabout 24 min

Abstract

An outbreak's average reproduction number, RR, does not say how that transmission is shared out. We fixed R=2.5R = 2.5 and swept the negative binomial dispersion parameter kk across seventeen values from 0.01 (extreme superspreading) to 10,000 (indistinguishable from Poisson, no superspreading at all), running 40,000 independent branching-process replicates per value and checking every simulated extinction probability against the exact analytic root of the offspring distribution's probability-generating function. They agreed everywhere: the largest deviation across all seventeen cells was 2.26 standard errors, and none exceeded 3. At the realistic value k=0.1k = 0.1, reported for SARS and SARS-CoV-2, a lone introduction died out on its own 86.11% ± 0.17 percentage points of the time. At k=10,000k = 10{,}000, the near-homogeneous case with the identical average, it died out only 10.51% ± 0.15 points of the time, matching the classical Poisson branching-process result (0.1074) to 3.65×10-5. Same average transmission, nine-fold difference in how often the chain simply stops. Among the cases that transmit at all when k=0.1k = 0.1, the most active 10% account for 81.9% of all onward infection. We then compared two ways of spending an identical unit of control effort, defined as an equal fractional cut to the uncontrolled mean: thinning every case's transmission uniformly, against capping only the largest gathering-driven events to hit that same mean. Across thirteen effort levels, uniform thinning produced a higher extinction probability than capping at eleven of them, by up to 5.2 percentage points (z=19.4z = 19.4) at 45% effort, reversing only at the very edge of guaranteed elimination. No person, gathering or pathogen was involved in any of it; every number above is the printed output of a program the club wrote and ran on a laptop. Master seed 20251217.

Same Average, Different Disease

Two outbreaks can share the exact same reproduction number and behave like different diseases. That sentence sounds like a hedge, but the arithmetic below forces it on you the moment you stop describing transmission with one number and start describing it with two.

The first number is the one every news report already carries: RR, the average number of people one infectious case goes on to infect. The second number nobody puts in a headline is how unevenly that average is achieved. An RR of 2.5 spread evenly, almost everyone infecting two or three people, is a wholly different physical process from an RR of 2.5 built almost entirely out of zeros punctuated by the rare case who infects thirty people at a choir practice. Real respiratory pathogens sit far over toward the second picture. SARS did. SARS-CoV-2 did. Measles, by contrast, sits close to the first. We built the smallest model that has both numbers in it, held the first one fixed, and turned only the second.

Turning it changed the outbreak's fate more than turning RR itself would have. At the realistic value for a respiratory virus with real superspreading, a fresh introduction fizzled out on its own 86% of the time. Give the identical average transmission to a population with no superspreading at all, everyone equally likely to pass it on, and it fizzled only 11% of the time. Nine times more likely to die out, for free, from unevenness alone, no change in the average at all.

What follows builds the model, checks its own arithmetic against a closed-form answer at every one of seventeen settings, quantifies how concentrated transmission gets, and ends by pitting two control strategies against each other at matched cost, with a result that surprised the club and that we did not enjoy writing up.

The Machine We Built

The club has no clinic, no swabs, no case log of any kind. What we have is a room with laptops in it, so what follows is a simulation of a mathematical object, not a record of anyone getting sick. The object is a branching process, the same construction Galton and Watson used in 1875 to ask whether aristocratic surnames die out [1], later formalised into the field's standard toolkit by Harris [2] and by Athreya and Ney [3].

One case starts a chain at generation zero. Every case in a generation independently produces some number of new cases, drawn from a negative binomial distribution with mean RR and dispersion parameter kk:

Var(offspring)=R+R2k.\mathrm{Var}(\text{offspring}) = R + \frac{R^2}{k}.

Small kk means most draws are zero and a few are large: heavy overdispersion, heavy superspreading. Large kk squeezes the variance down toward RR itself, and as k→∞k \to \infty the negative binomial converges to a plain Poisson distribution, the textbook homogeneous-mixing case with no superspreading whatsoever. RR is held fixed at 2.5 throughout the main sweep, close to the early estimate of 2.2 reported for Wuhan-strain SARS-CoV-2 [14] and to early SARS estimates, a plausible order of magnitude for a novel respiratory pathogen's reproduction number rather than a claim about any one outbreak. kk runs across seventeen values from 0.01 to 10,000 on a logarithmic grid chosen to include the range of dispersion estimates the literature actually reports for real pathogens, k≈0.1k \approx 0.1–0.16 for SARS and SARS-CoV-2 [4,5,6], up through values an order of magnitude or more larger for diseases that transmit more evenly.

The process has no depletion of susceptibles and no spatial structure, and it keeps no calendar. A "generation" is a step in a transmission chain, not a week or a day. The model is deliberately the simplest object that has both a mean and a shape around that mean, and it describes only the early, exponential phase of a real outbreak, before immunity or behaviour change has any chance to bite [7]. A chain is scored EXTINCT the generation it produces zero new cases, and ESCAPED once its cumulative size passes 5,000, a cutoff large enough that no supercritical branching process crossing it is coming back down: once a chain of this kind is not extinct, it grows without bound with probability 1 [3]. So "escaped" and "did not go extinct" are the same event for every practical purpose here.

Working Notes From the Club Table

Meeting 1
First draft simulated one branching process at a time, person by person. Someone timed it: about forty minutes for a single dispersion value at 40,000 replicates. Seventeen values would have taken most of a school day.

Meeting 1, later
Realised the offspring distribution only ever needs to be summed, never enumerated. A generation of nn active cases, each drawing NegBin(k,p)(k,p), sums to a single NegBin(nk,p)(nk,p) draw. Rewrote the whole inner loop around one call to numpy's vectorised negative-binomial sampler per generation. Full 17-value sweep: under a minute.

Meeting 2
Argued about the large-outbreak cutoff. Someone wanted 500, on the grounds that it is obviously already an epidemic by then. Someone else pointed out that at k=0.01k=0.01 a chain can sit near zero for many generations before one enormous draw sends it past any cutoff at once, so a small cutoff might catch a chain mid-fluctuation rather than genuinely past the point of no return. Settled on 5,000 and checked: zero replicates, across all 680,000, were still "active" (neither extinct nor over cutoff) when the generation limit was reached. The concern was real; the number handled it.

Meeting 2, later
First run of the validation table had one cell at z=3.9z = 3.9. Panic, briefly. The bug was in the analytic solver, not the simulation: the fixed-point iteration was being stopped after a fixed 200 steps regardless of how close it had gotten, and at k=0.01k=0.01 that was not enough steps to reach machine precision. Switched to an explicit convergence check. Every cell now sits under 2.3 SE.

Meeting 3
Designing the control comparison took the whole meeting. First proposal compared "reduce RR by 20%" against "cap gatherings at 10 people," which is not a fair fight, because nobody had checked whether those two policies cost the same amount of anything. Settled on defining effort identically for both, as the fraction of the raw uncontrolled mean removed, and solving numerically for whatever cap achieves that. See §8 for what this choice does and does not let us claim.

Meeting 4
Ran the control comparison expecting gathering caps to win, because that is what we had all half-remembered from the news coverage of superspreading. They did not win, at matched effort, across most of the range. Re-ran with a fresh seed to make sure. Same answer. Nobody was pleased. Seed fixed at 20251217 and the file has not been touched since.

The Arithmetic

Seventeen dispersion values, 40,000 replicates each, 680,000 branching processes run from a single introduction. Extinction is a coin flip repeated 40,000 times, so its standard error is the ordinary binomial one, p(1−p)/n\sqrt{p(1-p)/n}, printed beside every estimate below rather than left for the reader to guess at.

86.11%extinct, k=0.1 (realistic)
10.51%extinct, k=10,000 (~Poisson)
8.2×more likely to fizzle, same R
81.9%of transmission from top 10% of cases, k=0.1

Hold R=2.5R=2.5 fixed and read down the dispersion column. At k=0.01k=0.01, about as overdispersed as this study goes, a single introduction goes extinct 98.40% of the time. At k=1k=1, a middling amount of unevenness, 39.94%. At k=10,000k=10{,}000, effectively no unevenness at all, only 10.51%. The mean transmission never moved. Every one of these numbers describes the same average disease.

Now look at concentration. Among the cases that transmit at all under k=0.1k=0.1, rank them by how many secondary infections they actually caused and ask what share the top tenth holds: 81.9%. The top fifth holds 96.5%. Compress kk down to 0.01 and the top tenth holds effectively all of it, because at that level of overdispersion almost the entire epidemic is carried by a handful of draws. Loosen kk all the way to the Poisson limit and the top tenth still holds 22.5%, not 10%, because even people transmitting with zero real difference between them will still show apparent "superspreaders" once you rank them after the fact; a Poisson count has variance too. Any headline that reports a bare "X% cause Y% of transmission" without that Poisson floor is reporting some sampling noise alongside the real heterogeneity, undifferentiated, a conflation the dispersion parameter itself was introduced specifically to avoid [4,9].

10% fair-share reference0255075100%10⁻²10⁻¹10⁰10¹10²10³10⁴dispersion parameter k (log scale)share of transmission, top 10% of casesTRANSMISSION CONCENTRATION vs DISPERSION
Figure 3. Share of total transmission held by the most active tenth of cases, from a 3,000,000-draw sample of the offspring distribution at each dispersion value. The dashed line marks the 10% a perfectly even split would give every decile; the curve never reaches it, even at the Poisson limit, because ranking after the fact always finds apparent "top performers" in pure counting noise.

Figure 4 draws the two extremes of the sweep as what they actually are: probability distributions over "how many people did this one case infect," both with the identical mean of 2.5. That picture sits behind every number in this section.

025%50%75%secondary infections caused by one case, xP(exactly x secondary infections)SAME MEAN (R=2.5), TWO SHAPES012345678910>10
  • k = 0.1 (realistic)
  • k = 10,000 (~Poisson)
Figure 4. Exact probability mass function of secondary infections per case at the two ends of the sweep, both with mean 2.5. At k=0.1k=0.1, 72.2% of cases infect exactly nobody and the distribution trails off in a thin tail past 10; at k=10,000k=10{,}000 the same average produces a distribution clustered around 2 and 3 with almost nothing past 10. That shape difference is what the whole article is about.

Checking Our Own Work

None of the numbers above are worth anything if the simulation is simply broken in a way that happens to look plausible. Branching-process theory hands us an exact target to check against. For a process whose offspring probability-generating function is G(s)=E[soffspring]G(s) = E[s^{\text{offspring}}], the extinction probability starting from one individual is the smallest non-negative root of G(s)=sG(s) = s [1,3]. For our negative binomial offspring distribution,

G(s)=(1+Rk(1−s))−kG(s) = \left(1 + \frac{R}{k}(1-s)\right)^{-k}

which has no closed algebraic root, but GG is convex and increasing on [0,1][0,1], so the fixed-point iteration q→G(q)q \to G(q), started at q=0q=0, climbs monotonically to exactly that smallest root. Every one of the seventeen rows below prints this analytic root beside the simulated extinction fraction from 40,000 replicates, the resulting Monte Carlo standard error, and the z-score of the difference, so agreement is stated in the same units as the noise rather than asserted in prose.

kanalytic root qsimulated (40,000 reps)SEdiffz
0.010.9840680.9840250.000627−0.000043−0.07
0.020.9686330.9684000.000875−0.000233−0.27
0.050.9250980.9250500.001317−0.000048−0.04
0.10.8606850.8610750.0017290.0003900.23
0.160.7945190.7924500.002028−0.002069−1.02
0.30.6748360.6737000.002344−0.001136−0.48
0.50.5582580.5533250.002486−0.004933−1.98
10.4000000.3993500.002449−0.000650−0.27
20.2753050.2763000.0022360.0009950.45
50.1791700.1803250.0019220.0011550.60
100.1437410.1477500.0017740.0040092.26
300.1195330.1224000.0016390.0028671.75
1000.1110100.1108000.001569−0.000210−0.13
3000.1085730.1098000.0015630.0012270.79
10000.1077210.1048500.001532−0.002871−1.87
30000.1074770.1072000.001547−0.000277−0.18
100000.1073920.1051250.001534−0.002267−1.48

The largest deviation across all seventeen cells is 2.26 standard errors, at k=10k=10. Under the null hypothesis that the simulation is correct, seventeen independent z-scores would be expected to produce roughly one value beyond 2 SE by chance alone (about 5% of 17), and we got two, both unremarkable; none crossed 3, where we would have stopped and gone looking for a bug in earnest, the way §3 describes us actually doing once, in the solver rather than the simulator.

0.25.5.75110⁻²10⁻¹10⁰10¹10²10³10⁴dispersion parameter k (log scale)extinction probabilityEXTINCTION PROBABILITY vs DISPERSION, R = 2.5

Grey: analytic PGF root.

Dots: simulated (±2 SE, mostly smaller than the marker).

Figure 1. Simulated extinction probability (ember dots, error bars at ±2 standard errors, mostly hidden inside the marker at this replicate count) against the exact analytic root of the offspring probability-generating function (grey curve), across the full dispersion sweep. The curve does not fit the points; it predicts them, computed independently before any simulation ran.

Turning the Dial to Poisson

A negative binomial distribution converges to a Poisson distribution as its dispersion parameter grows without bound. That convergence is not a modelling assumption but a limit that can be checked, and doing so gives a second, independent handle on whether the whole apparatus is behaving. The Poisson analogue of the extinction equation replaces GG with G(s)=e−R(1−s)G(s) = e^{-R(1-s)}, the classical branching-process result quoted in every textbook treatment of epidemics as chains [7,3]. Solving it the identical way, by fixed-point iteration from q=0q=0, gives qPoisson=0.107355q_{\text{Poisson}} = 0.107355. The largest-kk row of the negative binomial sweep, k=10,000k=10{,}000, gives an analytic root of 0.1073920.107392. The two differ by 3.65×10-5, a relative difference of 0.034%, exactly the size of gap a finite (if very large) kk should leave against the true infinite limit, and no larger.

Figure 2 shows a different kind of convergence: not the dispersion parameter approaching its limit, but the simulation itself approaching the truth as more replicates accumulate. Every one of the 40,000 replicates at k=0.1k=0.1 already carries an order in which it was generated. Taking the running mean of the first nn of them, for nn stepping up from 100 to the full 40,000, traces out exactly the shrinking-envelope picture Monte Carlo theory promises: noisy and occasionally several standard errors off the mark early, settling down as nn grows, with the width of the plausible band shrinking as 1/n1/\sqrt{n}.

.80.85.90.951001,00010,00040,000replicates included, n (log scale)running extinction estimateMONTE CARLO CONVERGENCE, k = 0.1band: running ±2 SE

Dashed line: analytic root, 0.8607.

Figure 2. Running extinction-probability estimate at k=0.1k=0.1 as replicates accumulate from 100 to the full 40,000, with a running ±2 SE band. The trace wanders by several standard errors while nn is still small, then narrows onto the analytic value (dashed) as the sample grows, which is what convergence is supposed to look like rather than a claim made about it.

The Obvious Objection

Strongest objection

Superspreading events are famous specifically because targeting them works. MERS-CoV outbreaks were overwhelmingly driven by hospital and household clusters rather than even spread [15]. Wong and Collins, analysing early COVID-19 cluster data, concluded that "large superspreading events should be the targets of interventions that minimize tail exposure" [10]. Sneppen and colleagues went further, showing that overdispersion actually increases the effectiveness of limiting non-repetitive contacts, the very policy this study's Strategy B is meant to approximate [11]. If the professional literature says targeting the tail is the efficient move, why does §8 below find the opposite?

The honest answer is that "efficient" is doing different work in the two arguments. Wong and Collins, and Sneppen and colleagues, are making a claim about cost-effectiveness: a small number of banned gatherings or a small amount of contact-tracing effort aimed at the tail removes a disproportionate share of total transmission, because so much of RR is concentrated there when kk is small. That claim survives entirely intact in our own numbers; it is visible directly in Figure 4, where a strongly overdispersed population puts 82% of its transmission in the top tenth of cases. A policy that only has to remove a little RR can indeed get most of its result from a small, targeted action against the tail.

Our own comparison in §8 asks a narrower and different question: once you have already decided how much mean transmission to remove, is it better to remove it by capping the tail or by thinning everything uniformly? Those are not competing answers to the same question. They are answers to two different questions, and a reader who wants the efficient real-world policy needs the first one; a reader who wants to know what happens to the shape of an outbreak once a given amount of its transmission is gone needs the second. We built the model for the second question, and we should have flagged the difference earlier in the club than we did.

Two Ways to Spend the Same Effort

Take dispersion k=0.1k=0.1 as the working baseline, since that is the order of magnitude the literature actually reports for SARS-like transmission [4,5,6]. Define effort ee identically for two strategies, as the fraction of the uncontrolled mean transmission R0=2.5R_0=2.5 removed. Strategy A, uniform reduction, thins every case's transmission by retention (1−e)(1-e); this is a binomial thinning of the offspring distribution, and because binomial thinning of a negative binomial preserves its dispersion parameter exactly, Strategy A leaves kk untouched and simply scales the mean down to R0(1−e)R_0(1-e). Strategy B, capping large gatherings, imposes a ceiling C(e)C(e) on any single case's secondary infections, solved numerically so that E[min⁡(X,C)]=R0(1−e)E[\min(X,C)] = R_0(1-e) exactly, the identical resulting mean as Strategy A at the same ee, by construction. Twenty thousand replicates were run per strategy per effort level, fourteen levels from e=0e=0 to e=0.65e=0.65.

We expected the gathering cap to do better, or at worst tie, since it targets exactly the mechanism popularly blamed for keeping epidemics alive. It did not. At eleven of the thirteen non-trivial effort levels, uniform thinning produced a higher extinction probability than capping, by a margin the standard errors do not explain away.

effort eR after controlA: uniform thinningB: gathering capA − Bz
0.002.5000.8587 ± 0.00250.8640 ± 0.0024−0.0053−1.53
0.052.3750.8658 ± 0.00240.8635 ± 0.00240.00230.67
0.102.2500.8779 ± 0.00230.8592 ± 0.00250.01875.52
0.152.1250.8826 ± 0.00230.8634 ± 0.00240.01925.77
0.202.0000.8928 ± 0.00220.8607 ± 0.00240.03229.79
0.251.8750.8972 ± 0.00210.8633 ± 0.00240.033910.44
0.301.7500.9023 ± 0.00210.8675 ± 0.00240.034810.92
0.351.6250.9230 ± 0.00190.8757 ± 0.00230.047315.77
0.401.5000.9318 ± 0.00180.8812 ± 0.00230.050517.43
0.451.3750.9482 ± 0.00160.8964 ± 0.00220.051819.42
0.501.2500.9610 ± 0.00140.9149 ± 0.00200.046119.21
0.551.1250.9776 ± 0.00100.9479 ± 0.00160.029815.75
0.601.0000.9918 ± 0.00060.9860 ± 0.00080.00595.58
0.650.8750.9992 ± 0.00020.9998 ± 0.0001−0.0007−2.84
.80.85.90.951.000.20.40.6effort e (fraction of mean R removed)extinction probabilityTWO CONTROL STRATEGIES AT MATCHED EFFORTe=0.6: R≤1
  • A: uniform thinning (fixed k)
  • B: gathering cap (raises k)
Figure 5. Extinction probability under two control strategies that remove the identical fraction of uncontrolled mean transmission at every effort level. Uniform thinning (A) preserves the dispersion parameter and stays ahead of the gathering cap (B) across most of the range; the dashed line marks the effort past which A alone drives RR below 1, guaranteeing eventual extinction regardless of dispersion, where both strategies converge toward certainty and the ranking briefly reverses.

The gap peaks at e=0.45e=0.45: uniform thinning reaches 94.8% extinction, the gathering cap reaches 89.6%, a difference of 5.2 percentage points at z=19.4z=19.4, not a number that Monte Carlo noise produces by accident. The reversal at e=0.65e=0.65, where the cap edges narrowly ahead, sits right where RR after control has already dropped below 1 for both strategies; a subcritical branching process goes extinct with probability 1 regardless of its dispersion [3], so both strategies are converging to certainty there and the ranking between two numbers both pinned near 1 is not the same kind of fact as the ranking in the middle of the table.

The mechanism is not mysterious once you have §4 in hand. Thinning preserves the dispersion parameter kk, so it preserves the very unevenness that §4 showed makes extinction more likely at a fixed mean. Capping specifically removes that unevenness, trading it for a lower, more homogeneous mean instead, and a more homogeneous distribution is, at any fixed mean, the harder one to kill. The heterogeneity that makes an epidemic driven by superspreading look frightening in a news report is, once you remove exactly as much of it as removing all that heterogeneity costs you in mean transmission, partly what was keeping it fragile.

What This Model Cannot Tell You

Say plainly what is missing. No depletion of susceptibles enters the model, so nothing here describes a full epidemic curve, only its early exponential phase before immunity has any chance to matter [7,13]. No network, repeated contact structure or setting enters it either; the negative binomial's overdispersion stands in for "some cases transmit far more than others" without saying why. A real outbreak's heterogeneity comes from some mix of individual biology and the venues people gather in, in proportions this study has no way to separate [4,17]. A "generation" is a step in a transmission chain, not a unit of calendar time, so nothing here estimates doubling time or epidemic duration.

The control comparison in §8 carries its own, larger cost. Modelling a gathering ban as a clean mathematical cap on secondary infections, with a fractional randomised rounding purely so the resulting mean lands on an exact target, is a best-case idealisation. Real bans are patchy, evadable, unevenly enforced, and touch some settings and not others [12]. And "effort," defined here as an equal fractional cut to the uncontrolled mean, is one specific, transparent way to make the two strategies comparable, not a claim about which one is cheaper, more enforceable, or more politically survivable, and none of it touches the cost-effectiveness argument that §7 credits as a real and different result [10,11].

Finally: every replicate here shares one RR and one kk for its whole run. Real dispersion estimates carry their own uncertainty, generally wide, and a full accounting would carry that uncertainty through the whole pipeline rather than fixing k=0.1k=0.1 as if it were known to four figures. We did not do that here, and a reader using any of these numbers for a real policy decision should treat k=0.1k=0.1 as a representative order of magnitude, not a measurement.

Reproducing This

Every number in this article is the printed output of one file, run once, with its seed stated in the file itself:

python analysis/superspreading.py > analysis/superspreading-output.txt

It requires Python 3.12 and numpy, nothing else. On the laptop the club used it printed its own total, 45.1 seconds, well inside the ten-minute budget the club sets itself for a single computational study. The seed, 20251217, is split by numpy's SeedSequence into an independent stream per dispersion cell and per control cell, so no cell's randomness can leak into any other, and rerunning the file reproduces every table above to the last printed digit. The interactive model linked at the top of this page runs the same offspring distribution and the same matched-effort control definition live in the browser, with the dispersion slider defaulting to the article's own headline comparison.

References

Reproduce these numbers

From the analysis folder, run:

python superspreading.py > superspreading-output.txt
Seed
20251217
Analysis code
superspreading.py28 kB