ABSTRACT (original article)​
​Background: COVID-19 booster vaccinations mitigate transmission and reduce the morbidity and mortality associated with infection. However, the optimal date for booster administration remains uncertain. Geographic variation in infection rates throughout the year makes it challenging to intuit the best yearly booster administration date to effectively prevent infection, and also challenging to provide best guidance on how to alter booster administration in response to a breakthrough infection.
​
​Methods: We leveraged longitudinal antibody and reinfection probabilities with spatiotemporal projections of COVID-19 incidence to develop a geographically informed approach to optimizing the timing of booster vaccination. We assessed the delay in booster vaccination that is warranted following breakthrough infections whenever they occur during the year, enabling a personalized assessment of optimal timing that acknowledges and respects diversity of COVID-19 immune status, addressing a substantial barrier to uptake.
​
​Results: Yearly booster vaccination on any date is beneficial to prevention of infection. However, each location exhibits as much as a 3–4-fold range in degree of protection by date of uptake. Optimal COVID-19 booster vaccination dates are location-specific, typically in early autumn in the Northern Hemisphere. Infection late in the interval between boosts substantially alters the optimal boosting date.
​
​Conclusions: Considerable benefit accrues from aptly timing COVID-19 booster vaccination campaigns, which can be tailored to specific locations. Individuals can acquire the greatest benefit from booster vaccination by timing it optimally, including delaying in cases of infection late in the interval between boosts. These results provide location-specific guidance for public health policy, healthcare provider recommendations, and individual decision-making. CITATION (original article): Jeffrey P Townsend, Hayley B Hassler, Alex Dornburg, Optimal Annual COVID-19 Vaccine Boosting Dates Following Previous Booster Vaccination or Breakthrough Infection, Clinical Infectious Diseases, 2024, ciae559, https://doi.org/10.1093/cid/ciae559

SARS-CoV-2 (Gudbjartsson)

Input Data: Average peak-normalized ELIZA ODs for SARS-CoV-2 S1 IgG antibodies from Gudbjartsson et al. 2020, “Humoral Immune Response to SARS-CoV-2 in Iceland”, New England Journal of Medicine. scaled to post-BNT162b2 (Pfizer-BioNTech) booster vaccination level using the average peak value from 110 naive individuals from Kontopoulou et al. 2022 “Significant Increase in Antibody Titers after the 3rd Booster Dose of the Pfizer–BioNTech mRNA COVID-19 Vaccine in Healthcare Workers in Greece”, Vaccines.
days : 34, 48, 70, 94, 109
OD : 1.6, 1.55, 1.43, 1.19, 1.22
In[]:=
sarscov2data={​​{1,34,SARSCoV2,1.6/1.6,TRUE,NA,NA},​​{2,48,SARSCoV2,1.55/1.6,FALSE,(48-34),(1.55/1.6-1.6/1.6)/(48-34)},​​{3,70,SARSCoV2,1.43/1.6,FALSE,(70-48),(1.43/1.6-1.55/1.6)/(70-48)},​​{4,94,SARSCoV2,1.19/1.6,FALSE,(94-70),(1.19/1.6-1.43/1.6)/(94-70)}​​}
Out[]=
{{1,34,SARSCoV2,1.,TRUE,NA,NA},{2,48,SARSCoV2,0.96875,FALSE,14,-0.00223214},{3,70,SARSCoV2,0.89375,FALSE,22,-0.00340909},{4,94,SARSCoV2,0.74375,FALSE,24,-0.00625}}

SARS-CoV-2 Waning of Antibody OD

In[]:=
sarscov2datalength=Length[sarscov2data]
Out[]=
4
In[]:=
Table[​​{aod,​​Table[​​If[​​Or[​​sarscov2data[[index-1,4]]≥aod≥sarscov2data[[index,4]],​​sarscov2data[[index-1,4]]≤aod≤sarscov2data[[index,4]]],​​sarscov2data[[index,7]],​​Nothing],​​{index,2,sarscov2datalength}​​]​​}​​,{aod,0.75,1,0.05}]
Out[]=
{{0.75,{-0.00625}},{0.8,{-0.00625}},{0.85,{-0.00625}},{0.9,{-0.00340909}},{0.95,{-0.00340909}},{1.,{-0.00223214}}}
In[]:=
sarscov2paddedmeanwaning=Table[​​{aod,​​Table[​​If[​​Or[​​sarscov2data[[index-1,4]]≥aod≥sarscov2data[[index,4]],​​sarscov2data[[index-1,4]]≤aod≤sarscov2data[[index,4]]],​​sarscov2data[[index,7]],​​Nothing],​​{index,2,sarscov2datalength}​​]​​}​​,{aod,0.75,1.25,0.05}]
{{0.75,{-0.00625}},{0.8,{-0.00625}},{0.85,{-0.00625}},{0.9,{-0.00340909}},​​{0.95,{-0.00340909}},{1.,{-0.00223214}},​​{1.05,{}},{1.1,{}},{1.15,{}},{1.2,{}},{1.25,{}}}
Mean waning extended to BNT162b2-scaled peak (1.500037185).
sarscov2meanwaningTLM={{0.75`,{-0.00625`}},{0.8`,{-0.00625`}},{0.85`,{-0.00625`}},​​{0.9`,{-0.0034090909090909124`}},{0.95`,{-0.0034090909090909124`}},​​{1.`,{-0.002232142857142857`}}}
Out[]=
{{0.75,{-0.00625}},{0.8,{-0.00625}},{0.85,{-0.00625}},{0.9,{-0.00340909}},{0.95,{-0.00340909}},{1.,{-0.00223214}}}
In[]:=
TableForm[sarscov2meanwaningTLM]
Out[]//TableForm=
0.75
-0.00625
0.8
-0.00625
0.85
-0.00625
0.9
-0.00340909
0.95
-0.00340909
1.
-0.00223214
In[]:=
sarscov2antibodywaningTLM=Interpolation[sarscov2meanwaningTLM]
Out[]=
InterpolatingFunction
Domain: {{0.75,1.}}
Output dimensions: {1}

In[]:=
sarscov2antibodytimecourseTLM={1};​​day=1;​​While[sarscov2antibodytimecourseTLM[[day]]≥0.75,​​sarscov2antibodytimecourseTLM=Append[sarscov2antibodytimecourseTLM,sarscov2antibodytimecourseTLM[[day]]+sarscov2antibodywaningTLM[sarscov2antibodytimecourseTLM[[day]]]];​​sarscov2antibodytimecourseTLM=Flatten[sarscov2antibodytimecourseTLM];​​Increment[day];​​];​​sarscov2antibodytimecourseTLM
Out[]=
{1,0.997768,0.995402,0.992906,0.990284,0.987541,0.984687,0.981728,0.978675,0.97554,0.972332,0.969064,0.965746,0.962391,0.959008,0.955607,0.952197,0.948786,0.945379,0.941982,0.938598,0.935231,0.931879,0.928545,0.925226,0.921921,0.918624,0.915332,0.912039,0.908738,0.90542,0.902076,0.898696,0.895224,0.891577,0.887733,0.883672,0.879371,0.87481,0.869969,0.864831,0.859383,0.853621,0.84755,0.841257,0.834882,0.828462,0.82203,0.815612,0.809229,0.802894,0.796617,0.790399,0.784236,0.778121,0.772038,0.76597,0.759893,0.753779,0.747592}
sarscov2baseline=0.1641335;
This baseline peak-normalized S IgG antibody level for SARS-CoV-2 comes from the ancestral and descendent states analysis that used the baselines for the human “seasonal” coronaviruses to estimate the baselines for the zoonotic coronaviruses. See Townsend et al. 2021 “The durability of immunity against reinfection by SARS-CoV-2: a comparative evolutionary study”, The Lancet Microbe.
In[]:=
scalarsabove1=Table[(1.422592491177772`-0.422592491177772`*(index-1)/(Length[sarscov2antibodytimecourseTLM]-1))/1.422592491177772`,{index,Length[sarscov2antibodytimecourseTLM]}]
Out[]=
{1.,0.994965,0.98993,0.984895,0.97986,0.974826,0.969791,0.964756,0.959721,0.954686,0.949651,0.944616,0.939581,0.934547,0.929512,0.924477,0.919442,0.914407,0.909372,0.904337,0.899302,0.894267,0.889233,0.884198,0.879163,0.874128,0.869093,0.864058,0.859023,0.853988,0.848954,0.843919,0.838884,0.833849,0.828814,0.823779,0.818744,0.813709,0.808675,0.80364,0.798605,0.79357,0.788535,0.7835,0.778465,0.77343,0.768395,0.763361,0.758326,0.753291,0.748256,0.743221,0.738186,0.733151,0.728116,0.723082,0.718047,0.713012,0.707977,0.702942}
In[]:=
sarscov2antibodytimecourseBPtoExp=(sarscov2antibodytimecourseTLM+0.500037185)*scalarsabove1
Out[]=
{1.50004,1.49026,1.48038,1.47039,1.46031,1.45013,1.43987,1.42954,1.41915,1.40871,1.39824,1.38774,1.37722,1.36671,1.3562,1.34571,1.33525,1.32481,1.31442,1.30407,1.29377,1.28351,1.27331,1.26315,1.25304,1.24297,1.23295,1.22296,1.21301,1.20308,1.19317,1.18327,1.17337,1.16344,1.15339,1.14322,1.1329,1.12244,1.1118,1.10099,1.08999,1.07879,1.06741,1.05583,1.04415,1.03247,1.02081,1.00921,0.997691,0.986258,0.974926,0.963701,0.952582,0.941567,0.930648,0.919814,0.909052,0.898345,0.887673,0.877011}
In[]:=
Export["/Users/jt436/Downloads/alshukairi-gudbjartsson-SARS-CoV-2-Antibody-Time-Course_Pfizer_BoosterPeaktoExp.csv",sarscov2antibodytimecourseTLM]
Used natural infection lambda value imputed in Townsend et al. 2021 “The durability of immunity against reinfection by SARS-CoV-2: a comparative evolutionary study”, The Lancet Microbe.
In[]:=
sarscov2halflife=Log[2]/lambda/.lambda0.0044587480795691795`
Out[]=
155.458
In[]:=
Length[sarscov2antibodytimecourseBPtoExp]
Out[]=
60
In[]:=
sarscov2antibodytimecourseB=sarscov2antibodytimecourseBPtoExp;​​day=Length[sarscov2antibodytimecourseB];​​While[day<4393,​​Increment[day];​​AppendTo[sarscov2antibodytimecourseB,sarscov2baseline+(sarscov2antibodytimecourseB[[day-1]]-sarscov2baseline)*Exp[-lambda/.lambda0.0044587480795691795]]​​]
In[]:=
sarscov2antibodytimecourseB
In[]:=
sarscov2antibodytimecourseB[[150]]
Out[]=
0.641375
This panel is part of Figure 1.

SARS-CoV-2 Probability of No Reinfection Time Course

These are the 5% quantiles for the probability of no reinfection, in days, months, and years.
These are the 50% quantiles (medians) for the probability of no reinfection, in days, months, and years.
These are the 95% quantiles for the probability of no reinfection, in days, months, and years.
This panel is part of Figure 1.

Boostertime - New York

Seasonality for the year in New York
Divide by mean seasonality for the year
Add rising booster data from https://www.nejm.org/doi/full/10.1056/NEJMoa2119451
Interpolate between days
Append to beginning of booster data
Roll through days in the year, multiplying each day by booster probabilities, taking the inverse of those values, and then the product of those values

Heat Map

Boostertime - Stockholm

Seasonality for the year in Stockholm
Divide by mean seasonality for the year
Roll through days in the year, multiplying each day by booster probabilities, taking the inverse of those values, and then the product of those values
Plotting and exporting, streamlined for readability

Heat Map

Rotate stockholmheat if needed - omitted for simplicity as it depends on visualization needs

CITE THIS NOTEBOOK

Optimal annual COVID-19 vaccine boosting dates following scheduled boosters or acquired breakthrough infections​
by Jeffrey P. Townsend, Hayley B. Hassler, Alex Dornburg
Wolfram Community, STAFF PICKS, December 18, 2024
​https://community.wolfram.com/groups/-/m/t/3341399