Protocol · pre-specified
Observed-vs-expected analysis of adverse events of special interest in VAERS
Analysis code at the time of fixing:
analysis/observed_vs_expected.py SHA-256 a94120691c777785b86d6269590022cfb853ddc6c58ecd827f613275c828e121; analysis/vaers_analyses.py SHA-256 627170de72c59bdba3bfdad424325e7104bd6920575a4f1d9ff4654490241aea.Status: published on this site with the hashes above. Not yet deposited in an external registry (OSF); deviations from this protocol will be listed in a dated "Deviations" section below rather than by editing it.
1. Question
For selected vaccine–event pairs with an established or debated safety question, are US VAERS reports with onset in a biologically plausible risk window more or less numerous than the background incidence of the event would predict for the number of doses given?
2. Data
- Reports: VAERS public data files (domestic reports, all years to the June 2026 release). Vaccine type from VAERS_VAX; event from MedDRA PTs in VAERS_SYMPTOMS; onset interval NUMDAYS.
- Doses: HRSA VICP statistics report, edition 09/01/2026 — cumulative US doses distributed 2006-01-01 to 2024-12-31 (source CDC); CDC COVID-19 doses administered to 2022-12-28 (data.cdc.gov unsk-b7fc).
- Background incidence: published general-population rates compiled in
data/science/background_rates.json(Black 2021, Gubernot 2021, Willame 2023, Li 2021, Payne 2022, Tate 2008, Christensen 2021), with US sources preferred.
3. Pairs, windows and background rates
| Vaccine (period) | Event | Window (days) | Primary background | Sensitivity background |
|---|---|---|---|---|
| Influenza (2006–2024) | Guillain-Barré syndrome | 1–42 | Black 2021, US, all ages | Gubernot 2021, US VSD, age-standardised |
| Influenza | Bell's palsy | 1–42 | Black 2021, US, all ages | Black 2021, ≥70 |
| Influenza | Transverse myelitis | 1–42 | Gubernot 2021, US, all ages | Black 2021, women 26–62 |
| COVID-19 (2020–2022) | Myocarditis/pericarditis | 0–7 | Willame 2023, Europe, age-standardised | Li 2021, men 18–34 |
| COVID-19 | Guillain-Barré syndrome | 1–42 | Black 2021, all ages | Black 2021, ≥60 |
| COVID-19 | Cerebral venous sinus thrombosis | 1–42 | Payne 2022, US, all ages | Payne 2022, women 18–29 |
| COVID-19 | Immune thrombocytopenia | 1–42 | Gubernot 2021, US claims, all ages | Gubernot 2021, ≥65 |
| COVID-19 | Bell's palsy | 1–42 | Black 2021, all ages | Black 2021, ≥70 |
| MMR + MMRV (2006–2024) | Febrile seizure | 0–14 | Christensen 2021, Denmark, 3–60 months (mean of sexes) | — |
| MMR + MMRV | Immune thrombocytopenia | 1–42 | Gubernot 2021, US claims, 0–4 y | Gubernot 2021, <18 y |
| Rotavirus (2006–2024) | Intussusception | 1–21 | Tate 2008, US, 15–24 weeks of age | Tate 2008, 6–14 weeks |
| HPV (2006–2024) | Guillain-Barré syndrome | 1–42 | Black 2021, ≤17 | Black 2021, 18–39 |
| Meningococcal (2006–2024) | Guillain-Barré syndrome | 1–42 | Black 2021, ≤17 | Black 2021, 18–39 |
MedDRA PTs per event are listed in analysis/vaers_analyses.py (AESI dictionary) and printed in data/science/vaers_aesi_counts.json. Anaphylaxis is analysed separately as a reporting-completeness check (VAERS reports with onset day 0–1 per million doses vs the VSD-confirmed rate of 1.31 per million, McNeil 2016).
4. Estimands and statistics
E = doses × window length / 365.25 × background rate. O = reports with NUMDAYS inside the window and vaccination year in the dose period. O/E with an exact Poisson 95% CI on O. Secondary: Oadj adding reports with missing onset in proportion to known onsets; O/E under the sensitivity background.
5. Decision rules (fixed in advance)
- A pair is described as "reported more often than expected" only if the lower 95% bound of O/E exceeds 1 under the primary background.
- O/E < 1 is reported as "fewer reports than background predicts — uninformative about safety because of under-reporting", never as evidence of no risk.
- No pair is added, dropped or re-windowed after seeing counts without a dated entry under Deviations.
6. Deviations
- 2026-10-09, after counts were computed:
analysis/vaers_analyses.pywas edited in its time-to-onset section only (the reference distribution is now fitted once per vaccine on a 5,000-report sample, for speed; on 2026-10-14 the true report count was recorded alongside the fitted sample size). The AESI definitions, risk windows and the counts code that produce the observed-vs-expected inputs are unchanged, and the O/E counts were not regenerated. New SHA-256 of the file:87d61c9f1177730dab093a2329dc5bff9d2da43354727e3529a77ec7e4ecca2d.analysis/observed_vs_expected.pyis unchanged (SHA-256 as above). The Brighton results were added to the results page by a separate script (analysis/add_brighton_section.py).