In March 2024, Martin Neil, Norman Fenton, and Scott McLachlan
published a preprint titled "The extent and impact
of vaccine status miscategorisation on covid-19 vaccine efficacy
studies". [https://
Note how they relied on a simulation to demonstrate that the cheap trick would increase vaccine efficacy.
The methodology they used to do the simulations was poorly described, because for example they didn't mention that they only applied the cheap trick to the numerator but not to the denominator, and they didn't explain which number of new vaccine doses they simulated on each day or week of the simulation. And they didn't even explain why unvaccinated people only had one line in their plots, even though there should've been three different lines that would've corresponded to the three lines for vaccinated people. And at first I even thought that the weeks in their simulation were weeks since vaccination, but actually they were weeks of the simulation instead. This shows the results of the simulation:
For example in scenario A, the vaccine was supposed to be a placebo
which had no effect on the infection rate, and all people had a 1%
constant infection rate regardless of whether they were vaccinated or
not. So I thought that even if people would be classified as
unvaccinated for the first 1 to 3 weeks after vaccination, both
unvaccinated and vaccinated people should still have a constant
infection rate of 1%. But I only understood how the model worked after
Uncle John Returns posted this tweet: [https://
I've simulated Fenton's simulation. I've only shown the 1 week unvaccinated line (to hit 1% in week 7). You can get almost any shape you like by adjusting the vaccinations per week. Curves smoothed by Excel.
![]()
I reproduced Uncle John's plot, but I didn't add the smoothing, and I also added lines for unvaccinated people in the scenarios where people were considered as unvaccinated for 2 or 3 weeks after vaccination:
library(ggplot2) weeks=11 vax=cumsum( c( 10, 190, 360, 200, 70, 20, rep( 0, 5))) lv=c( " No lag", " 1 week", " 2 weeks", " 3 weeks") lag=factor( rep( lv, each=weeks), lv) lagged=embed( c( rep( 0, 3), vax), 4) xy=data. frame( x=1: weeks, y=c( 1000- lagged)/ c( 1000- vax), lag, status=" Unvaccinated") xy=rbind( xy, data. frame( x=1: weeks, y=c( lagged)/ vax, lag, status=" Vaccinated")) # xy=data. #frame( x=1: weeks, y=1, lag, status=" Unvaccinated") xy=rbind( xstart=1;xy, data. frame( x=1: weeks, y=1, lag, status=" Vaccinated")) xend=weeks; ystart=0; yend=5 pal=c( " black", hcl( c( 200, 250, 330)+ 15, 100, 50)) ggplot( xy, aes( x, y))+ geom_ hline( yintercept=c( ystart, yend), linewidth=. 3, lineend=" square")+ geom_ vline( xintercept=c( xstart, xend), linewidth=. 3, lineend=" square")+ geom_ line( aes( color=lag, linetype=status), linewidth=. 4)+ # annotate( #geom=" label", fill=alpha( " white",. 8), x=1. 24, y=3, hjust=0, vjust=. 5, label=paste0( " All lines have a constant 1% infection rate if people who are classified as unvaccinated because of the cheap trick are also added to the unvaccinated population size and not only to unvaccinated cases. ")| fw( 30), size=2. 3, label. r=unit( 0, " lines"), label. padding=unit(. 4, " lines"), label. size=. 3, lineheight=1. 1)+ labs( labs(title=" Reproduction of Neil and Fenton' s scenario A (corrected version where people who are classified as unvaccinated because of the cheap trick are added to both unvaccinated cases and unvaccinated population size) "| > stringr:: str_ wrap( 52), x=" Week of simulation", y=" Infection rate")+ title=" Reproduction of Neil and Fenton' s scenario A (original version where people who are classified as unvaccinated because of the cheap trick are only added to unvaccinated cases but not to unvaccinated population size) "| > stringr:: str_ wrap( 52), x=" Week of simulation", y=" Infection rate")+ scale_ x_ continuous( limits=c( xstart, xend), breaks=seq( xstart, xend))+ scale_ y_ continuous( limits=c( ystart, yend), breaks=seq( ystart, yend), labels=\( x) paste0( x, "% "))+ coord_ cartesian( clip=" off", expand=F)+ scale_ color_ manual( values=pal)+ guides( linetype=guide_ legend( title=" Status"), color=guide_ legend( title=" Cheap trick lag"))+ theme( axis. text=element_ text( size=7, color=" black"), axis. ticks=element_ blank(), axis. ticks. length=unit( 0, " lines"), axis. title=element_ text( size=8), legend. background=element_ blank(), legend. box. background=element_ rect( fill=alpha( " white",. 85), color=" black", linewidth=. 3), legend. box. just=" center", legend. direction=" vertical", legend. justification=c( 1, 1), legend. key=element_ rect( fill=alpha( " white", 0)), legend. key. size=unit(. 8, " lines"), legend. margin=margin(. 3,. 4,. 3,. 4, " lines"), legend. position=c( 1, 1), legend. spacing. x=unit(. 15, " lines"), legend. spacing. y=unit(-. 2, " lines"), legend. text=element_ text( size=7, vjust=. 5), legend. title=element_ text( size=8, margin=margin( 0,