Other parts: rootclaim.html, rootclaim2.html, rootclaim3.html, rootclaim4.html.
Kirsch published his sixth round of arguments in the Rootclaim debate in June 2025: https://www.skirsch.com/covid/KIRSCH_COVID_shot_analysis.pdf, https://kirschsubstack.com/p/the-czech-data-reveals-the-truth.
He repeated many arguments I had already debunked earlier:
Kirsch wrote:
The people getting Dose 2 are drawn from the Dose 1 recipients. If there is a 1%/day HVE effect, we'd see it because the Dose 1 cohort would have decreasing deaths over time to mirror the increasing deaths in Dose 2 because HVE is a zero sum game.
Check it out: flat line for Dose 1 (orange curve). And since Dose 1 cohort is small, leaving those people behind would create a massive effect, much larger than the impacts on Dose 2 because it's a transfer of an absolute number of people because HVE is a zero sum game on absolute counts.
![]()
I tried to reproduce his plot here:
t=fread("Otevrena-data-NR-26-30-COVID-19-prehled-populace-2024-01.csv.gz") t[Umrti!=""&DatumUmrtiLPZ=="",DatumUmrtiLPZ:=Umrti] t=t[DatumUmrtiLPZ!=""] t=t[DatumUmrtiLPZ>=pmax(Datum_Prvni_davka,Datum_Druha_davka,Datum_Treti_davka)] t[,dose:=0] t[Datum_Prvni_davka!=""&Datum_Prvni_davka<="2021-24",dose:=1] t[Datum_Druha_davka!=""&Datum_Druha_davka<="2021-24",dose:=2] t2=t[Infekce%in%c(NA,1)] a=t[,.(coviddead=.N),.(dose,week=Umrti)] a=merge(t2[,.(dead=.N),.(dose,week=DatumUmrtiLPZ)],a,all=T) a[is.na(a)]=0 weeks=data.table(date=as.Date("2019-1-1")+(0:3e3))[,week:=format(date,"%G-%V")][rowid(week)==4,setNames(date,week)] p=a[week!="",.(x=weeks[week],y=c(dead,pmax(0,dead-coviddead)),z=rep(1:2,each=.N),dose)] p[,z:=factor(z,,c("All causes","Not COVID"))] p[,dose:=factor(dose,,c("Unvaccinated","Dose 1","Dose 2"))] p[y==0,y:=NA] xstart=as.Date("2020-1-1");xend=as.Date("2025-1-1");xbreak=seq(xstart+182,xend,"year");xlab=year(xbreak) ystart=0;yend=max(p$y,na.rm=T);ybreak=pretty(p$y,6) ggplot(p)+ geom_hline(yintercept=c(ybreak[ybreak<yend],yend),color="gray87",linewidth=.4,lineend="square")+ geom_vline(xintercept=seq(xstart,xend,"year"),color="gray87",linewidth=.4,lineend="square")+ geom_vline(xintercept=weeks["2021-24"],linewidth=.4,linetype="22")+ geom_line(aes(x,y,color=dose,alpha=z),linewidth=.6)+ labs(x=NULL,y=NULL,title="Weekly deaths in Czech Republic")+ annotate(geom="text",x=weeks["2021-27"],label="Week 24 of 2021 (vaccine doses\nadministered on later weeks are ignored)",y=yend*.9,hjust=0,vjust=1,size=3.87,lineheight=.85)+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=xlab)+ scale_y_continuous(limits=c(ystart,yend),breaks=ybreak,labels=\(x)ifelse(x==0,0,paste0(x/1e3,"k")))+ scale_color_manual(values=c("#EB3727","#DA7842","#67A442","#499CCF"))+ scale_alpha_manual(values=c(1,.4))+ coord_cartesian(clip="off",expand=F)+ guides(color=guide_legend(order=1),alpha=guide_legend(order=2))+ theme(axis.text=element_text(size=11,color="gray50"), axis.text.x=element_text(margin=margin(3)), axis.text.y=element_text(margin=margin(,3)), axis.ticks.length=unit(0,"pt"), legend.box="vertical", legend.box.background=element_blank(), legend.box.just="center", legend.box.margin=margin(), legend.box.spacing=unit(0,"pt"), legend.direction="horizontal", legend.justification="center", legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(23,"pt"), legend.background=element_rect(color="gray87",linewidth=.4), legend.margin=margin(2,5,2,2), legend.position="top", legend.spacing.x=unit(2,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.grid=element_blank(), panel.spacing=unit(4,"pt"), plot.margin=margin(5,4,5,5), plot.title=element_text(size=11,face=2,hjust=.5,margin=margin(1,,3)), plot.subtitle=element_text(hjust=.5,margin=margin(,,3))) ggsave("1.png",width=4.9,height=3.3,dpi=300*4)
In order to get fixed cohorts of people by dose number, Kirsch determined the vaccination status at the end of week 24 of 2021. Therefore he didn't have to adjust the deaths for population size since the population sizes remained roughly constant from week 25 of 2021 onwards, apart from depletion due to deaths and change due to migration.
However the period when people with only one had the lowest mortality due to HVE was before week 25 of 2021. In Kirsch's plot the number of deaths in people with only one dose remained around the same level between weeks 11 and 24 of 2021. But if you look at ages 60 and above which accounted for about 90% of total deaths in the Czech Republic in 2021, the population size of people with only one dose tripled from about 400,000 on week 11 to about 1,200,000 on week 20, and by week 25 it had falled back down to about 400,000 after people had moved under the second dose. By week 25 of 2021, ages 60 and above had about 4 times as many people with two or more doses as people with only one dose:
t=fread("https://sars2.net/f/czbucketsdaily.csv.gz") ages=c(0,seq(20,95,5)) t[,age:=ages[findInterval(age,ages)]] a=t[,.(dead=sum(dead),pop=sum(alive)),.(dose=pmin(dose,2),age,week=format(date,"%G-%V"))] a=merge(a,a[week=="2021-01",sum(pop),age][,.(age,std=V1/sum(V1))]) s=a[week>="2021-11"&week<="2021-25"&age>=60] s[,sum(pop)/7,.(dose=pmin(dose,2),week)][,tapply(V1,.(week,dose),round)] # 0 1 2 # 2 is dose 2 or more, 1 is 1 but not more # 2021-11 2153280 425891 196875 # 2021-12 2029098 496386 249594 # 2021-13 1938394 503531 332404 # 2021-14 1858580 489063 426141 # 2021-15 1697735 536745 539189 # 2021-16 1512918 649061 611730 # 2021-17 1281797 836837 655205 # 2021-18 1058002 1031280 684777 # 2021-19 906228 1156336 711777 # 2021-20 817649 1196510 760679 # week with highest population size for dose 1 # 2021-21 760705 1124535 890075 # 2021-22 716875 980964 1078046 # 2021-23 679385 776919 1320057 # 2021-24 653597 565627 1557744 # 2021-25 635445 415701 1726225 # about 4 times more people with dose 2+ than dose 1
The ASMR of people with 1 but not more doses was about 598 on week 18, but by week 25 it had more than doubled to about 1266, because many of the healthy vaccinees had moved under the second dose:
s[,sum(dead/pop*std*365e5),.(week,dose)][,tapply(V1,.(week,dose),round)] # 0 1 2 # 2 is dose 2 or more, 1 is 1 but not more # 2021-11 2346 781 1326 # 2021-12 2177 846 885 # 2021-13 2159 981 714 # 2021-14 1932 939 569 # 2021-15 1925 675 502 # 2021-16 1880 737 561 # 2021-17 2002 662 567 # 2021-18 1902 598 602 # dose 1 has low ASMR because of the healthy vaccinee effect # 2021-19 1955 659 591 # 2021-20 1926 603 572 # 2021-21 1805 703 527 # 2021-22 1828 812 573 # 2021-23 1759 822 518 # 2021-24 1809 950 538 # 2021-25 1685 1266 553 # dose 1 has high ASMR because of the straggler effect
In the next plot the ASMR of people with 1 but not more doses almost doubled between week 18 and week 24 of 2021. The results are slightly different from the previous code, because I used the November 2024 NZIP data instead of the March 2024 FOI data, and I also calculated the ASMR by year of birth and not by age:
t=fread("Otevrena-data-NR-26-30-COVID-19-prehled-populace-2024-01.csv.gz") t=t[Infekce%in%c(NA,1)][RokNarozeni!="-"] t[,born:=pmin(2000,pmax(1925,as.integer(substr(RokNarozeni,1,4))))] t[,dose1:=Datum_Prvni_davka][,dose2:=Datum_Druha_davka] t=t[!(DatumUmrtiLPZ!=""&pmax(dose1,dose2)>DatumUmrtiLPZ)] t=rbind(copy(t)[dose1>"2021-24",dose1:=""][dose2>"2021-24",dose2:=""][,facet:=1],t[,facet:=2]) t[,dose:=0][dose1!="",dose:=1][dose2!="",dose:=2] a=t[,.(week=c(rep("2020-10",.N),dose1,dose2),dose=rep(0:2,each=.N),born,facet)] a=a[,.(vax=.N),.(week,dose,born,facet)] a=merge(a,t[,.(dead=.N),.(week=DatumUmrtiLPZ,born,dose,facet)],all=T)[week!=""] a=merge(do.call(CJ,lapply(a[,1:4],unique)),a,all=T);a[is.na(a)]=0 a[,cumvax:=cumsum(vax),.(born,dose,facet)][,pop:=cumvax-cumsum(dead),.(born,dose,facet)] a[dose==0,pop:=pop-a[dose==1,cumvax]][dose==1,pop:=pop-a[dose==2,cumvax]] a=merge(a[week=="2022-01",sum(pop),born][,.(std=V1/sum(V1),born)],a) iso=as.Date(1+0:1e4*7);names(iso)=format(iso,"%G-%V") p=a[,.(y=ifelse(sum(pop)*7<365e3,NA_real_,sum(dead/pop/7*365e5*std,na.rm=T))),.(dose,x=iso[week],facet)] p[,dose:=factor(dose,,c("Unvaccinated","Dose 1","Dose 2 or more"))] p[,facet:=factor(facet,,paste("Doses admin-\nistered after cutoff\ndate",c("ignored","not ignored")))] xstart=as.Date("2021-1-1");xend=as.Date("2024-1-1");xbreak=seq(xstart+182,xend,"year") ystart=0;ybreak=pretty(p$y,6);yend=max(ybreak) ggplot(p)+ facet_wrap(~facet,ncol=1,scales="free")+ geom_hline(yintercept=c(ybreak[ybreak<yend],yend),color="gray90",linewidth=.4,lineend="square")+ geom_vline(xintercept=seq(xstart,xend,"year"),color="gray90",linewidth=.4,lineend="square")+ annotate("rect",xmin=xstart,xmax=xend,ymin=0,ymax=yend,color="gray75",linewidth=.4,lineend="square",linejoin="mitre",fill=NA)+ geom_line(aes(x,y,color=dose),linewidth=.6)+ geom_vline(xintercept=iso["2021-24"],linewidth=.4,linetype="22")+ geom_label(data=p[rowid(facet)==1],aes(label=facet),y=yend,x=xend,hjust=1,vjust=1,fill="white",label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=.4,color="gray75",size=3.87,lineheight=.8)+ geom_label(data=p[rowid(facet)==1],aes(label=facet),y=yend,x=xend,hjust=1,vjust=1,fill=NA,label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=0,size=3.87,lineheight=.8)+ labs(x=NULL,y=NULL,title="Weekly ASMR per 100,000 person-years in Czech Republic")+ annotate(geom="text",x=iso["2021-25"],label="Vaccination cutoff date (week 24)",y=4250,hjust=0,vjust=.5,size=3.87)+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=year(xbreak))+ scale_y_continuous(limits=c(ystart,yend),breaks=ybreak)+ scale_color_manual(values=c("#EB3727","#DA7842","#67A442"))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray50",margin=margin(2,2,2,2)), axis.ticks.length=unit(0,"pt"), legend.box.margin=margin(,,3), legend.box.spacing=unit(0,"pt"), legend.direction="horizontal", legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(26,"pt"), legend.background=element_rect(color="gray75",linewidth=.4), legend.margin=margin(2,5,2,2), legend.position="top", legend.spacing.x=unit(2,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.spacing=unit(2,"pt"), plot.margin=margin(4,5,4,5), plot.title=element_text(size=11,face=2,hjust=.5,margin=margin(1,,3)), plot.subtitle=element_text(hjust=.5,margin=margin(,,3)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5,height=4.7,dpi=300*4)
Kirsch's AI said:
This level of bias is enormous. For comparison:
- Real-world HVE estimates in high-quality studies (e.g., flu vaccine studies in seniors) are generally in the 1.1-1.2 range (10-20%).
- A 3.0 ratio would be unprecedented and easily visible in every time-series ACM dataset, including non-COVID vaccination campaigns.
2. Should Be Obvious in the Data
If this bias exists:
- We'd expect a dramatic dip in ACM for the vaccinated group immediately after rollout, across all countries, all age groups, and all vaccines. NOTE: This dip is sustained and would appear in calendar time, not just in the time series.
- It would also imply that the unvaccinated group had catastrophic mortality, which contradicts many population-level trends (e.g., Czech Under-80 cohort, US CDC mortality by vaccination status in early 2021).
Kirsch's AI seems to have copied his mistaken understanding of what a time series means. Kirsch says that a plot where the x-axis shows time since vaccination and the y-axis shows deaths is a "time series" plot, even though in reality a plot where the x-axis shows calendar time is also a time series plot. In his Substack Kirsch wrote: "But did you know that none of the papers in the peer reviewed scientific literature will show you a time series plot for the COVID vaccine? I couldn't find a single one!" [https://kirschsubstack.com/p/covid-time-series-graphs-show-clearly] So I guess under his definition of a time series plot, he didn't even count survival analysis plots where the x-axis shows days since since-vaccination and the y-axis shows probability of survival, because during the debate he has referred to several survival analysis plots that were published in peer-reviewed papers.
But anyway, the HVE does in fact appear in plots that show mortality by calendar date. In the English ONS data, Dutch CBS data, and Japanese FOI data released by Kenji Fujikawa, there ratio between unvaccinated and vaccinated ASMR reaches above 4 during the vaccine rollout: [rootclaim4.html#Comparison_to_other_datasets]
There are also many studies which have shown more than a 3-fold difference in all-cause mortality between unvaccinated and vacinated people. In the same PDF file Kirsch wrote about a Norwegian study which looked at all-cause mortality in people aged 70 and above during the first three weeks after vaccination. Even though the cohorts were matched for variables like 5-year age group and comorbidity index, the vaccinated group had a mortality HR of only about 0.28 relative to the unvaccinated group, with a 95% CI of about 0.24-0.31. [https://pmc.ncbi.nlm.nih.gov/articles/PMC9637531/]
Kirsch's AI also said this about Wilf's response:
- Claims short-term HVE explains the Czech divergence
- His theory that HVE starts at OR = 3 and drops to OR = 1.6 is never supported by empirical data or studies. It's pure hand-waving.
- Problem: As you noted, if HVE were that large and decaying over months, it would be visible in ONS, Czech, and U.S. data. It isn't.
But my previous plot shows that the monthly ratio between unvaccinated and vaccinated ASMR peaks at over 5 in the ONS data, and at over 3 in the Czech data.
And anyway if it's impossible for unvaccinated people to have 3 times higher mortality than vaccinated people because of the HVE, then why did Kirsch assume in his KCOR analysis that unvaccinated people would've continued to have about 3.2 times higher mortality rate than vaccinated people indefinitely? And then later when the ratio dropped to only about 2.6, why did Kirsch assume it meant that vaccines were killing 23% extra people?
Kirsch wrote: "The Levi result, which showed vaccine harm, shouldn't be very surprising as it matches what an expert group appointed by the Norwegian Medicines Agency found when it looked at the cause of death of 100 people who died after vaccination and found that 36% of the deaths may have been vaccine mediated ('likely' to 'possible'). After they found that result, they decided that further confirmation was unwise. Nor did they warn the people of Norway; they suppressed the result. They did not publish their findings in the peer-reviewed literature. They did not publicly report the findings through standard scientific channels. Sadly, this is how 'science' works today: if you find something that goes against the narrative, you bury it."
The paper Kirsch talked about was published in Norway's primary peer-reviewed medical journal. [https://tidsskriftet.no/en/2021/05/originalartikkel/nursing-home-deaths-after-covid-19-vaccination] The Wikipedia page about the journal says: "The Journal of the Norwegian Medical Association (Norwegian: Tidsskrift for Den norske legeforening) is a biweekly peer-reviewed medical journal published by the Norwegian Medical Association and established in 1881. It includes research and review articles, news stories, and debates about professional issues and education, as well as discussion of medical education. The journal has been indexed by Index Medicus, MEDLINE, and PubMed since 1965." [https://en.wikipedia.org/wiki/Journal_of_the_Norwegian_Medical_Association] Perhaps Kirsch was confused by the design of the journal's website, which looks more like an informal magazine site than a medical journal, or he was confused by how the website publishes both formal scholarly articles and more informal content.
The Norwegian paper said: "In the period 27 December 2020 to 15 February 2021, about 29 400 of Norway's roughly 35 000 nursing home patients were vaccinated with the mRNA vaccine BNT162b2. During the same period, the Norwegian Medicines Agency received 100 reports of suspected fatal adverse reactions to the vaccine." The paper also said: "The mean age of the patients was 87.7 years (range 61-103 years). Among 100 reported deaths, a causal link to the vaccine was considered probable in 10 cases, possible in 26 and unlikely in 59."
So among approximately the 29,400 first vaccinated people in nursing homes, a causal connection between vaccination and death was considered probable or possible in the case of 36 people, which is a rate of about 0.1% and not 36%. In the case of some reports, the vaccination may have only been a minor contribution to the death of someone who was about to die soon anyway. If it was possible to determine definitively how many of the 100 people died primarily due to vaccination, it would probably be less than 36 people, even though there might of course be additional vaccine-induced deaths with no adverse event report filed.
But anyway, the results of a study are not applicable to the general population, because the proportion of adverse event reports that involve death out of all adverse event reports is higher in older people than younger people. And elderly people who live in nursing homes have even higher mortality rates than age-matched elderly people who live on their own.
The discussion section of the Norwegian paper said:
The spontaneous reporting system for adverse drug reactions is primarily useful for generating hypotheses and is not particularly suitable as a basis for assessing causality. Many of the reports did not contain sufficient clinical information to form an impression of the patient's clinical course and a possible causal link between vaccination and death. Almost half of the reporting parties did not submit additional information. In particular, there was a lack of information about which phase of life the patients were in, and whether their health and general condition were already rapidly or slowly deteriorating before vaccination. All patients were in a complex clinical situation characterised by old age, frailty and multiple chronic diseases, which means that a variety of factors could have contributed to the deaths. It is therefore practically impossible to determine with any certainty how much of a role the vaccine played in the deaths.
The extremely high mortality rate in nursing homes means that random factors will lead to a certain number of deaths shortly after vaccination anyway. It cannot be ruled out that some of the deaths that were classified as probable are in fact due to such random factors. Nevertheless, we find it reasonable to assume that adverse effects from the vaccine in very frail patients can trigger a cascade of new complications which, in the worst case, end up expediting death.
The categories 'probable' and 'unlikely' were used in cases where the expert group considered there to be a clear likelihood one way or the other, and the category 'possible' was used where a causal link between vaccination and death was just as likely as unlikely. Many of the cases classified as 'possible' are therefore very uncertain, and some of them could perhaps also have been categorised as unclassifiable. The group considered far more cases to be either probable or unlikely than the Norwegian Institute of Public Health in its initial assessment. This is probably due to access to more information as well as knowledge of typical clinical courses in frail elderly people.
The adverse reaction reports were submitted within a period of approximately 50 days, during which it can be assumed that 2000-2500 nursing home patients died in Norway (7). Whether 10 or 36 of these deaths were accelerated by the vaccine, the proportion is still low. In the same period, almost 30 000 nursing home patients were vaccinated, which means that there will most likely have been far more than 100 deaths in nursing homes in a close temporal relationship to vaccination in the relevant time period. Our findings cannot therefore be used to estimate the incidence of vaccine-related deaths.
It is important to emphasise that the vast majority of long-term patients in nursing homes have a short remaining life expectancy. They are definitely in the final stage of life. This is reflected in the expert group's scoring of 48 out of 79 classifiable patients in CFS category 8 or 9, which indicates an expected lifespan of less than six months.
Kirsch wrote: "The effect was observed in the full cohort of over 9 million individuals, and after 1:1 matching on 7 key factors to create a 1.5 million person matched cohort, the NCACM odds ratio differed by less than 1%. This strongly suggests that the Pfizer-Moderna mortality gap was not due to confounding from unmatched variables, since such aggressive matching would have materially shifted the result if residual confounding were the primary cause."
By a difference of less than 1%, he probably referred to how the adjusted odds ratio for non-COVID mortality was about 1.356 in the matched cohorts and 1.361 in the unmatched cohorts: [https://www.medrxiv.org/content/10.1101/2025.04.25.25326460v1]
However the odds ratios were adjusted for a similar set of variables that was used to do the matching. The cohorts were matched by age, sex, race, ethnicity, vaccination site, month of second dose, and census tract. The adjusted odds ratios were adjusted for all the same variables except month of second dose, and the adjustment for census tract was done in a different way, and they were additionally adjusted for mortality at the ZIP code level.
So even though both methods produced an odds ratio of about 1.36, in both cases it might be due to confounders that were not adjusted for using either method.
Kirsch wrote: "Furthermore, there was no systematic nor systemic bias in the distribution of vaccines in Florida."
Howveer if you look at the full unmatched cohorts in Table 1 of Levi's study, the median age was 54 for Pfizer but 62 for Moderna. The median social vulnerability index score was about 47 for Pfizer but 41 for Moderna.
The unadjusted all-cause mortality odds ratio was about 0.853 between the unmatched cohorts but 1.374 between the matched cohorts.
Kirsch also wrote that there is no "evidence anywhere of a systematic bias that could cause a vaccine preference within a facility". Among Levi's full cohorts, the percentage of vaccine doses where the site type was doctor's clinic was about 21% for Pfizer and 11% for Moderna. But the percentage for hospital ER was about 0.7% for Pfizer and 1.9% for Moderna, and "other pharmacies" was about 2% for Pfizer and 11% for Moderna:
The Czech Ministry of Health has also published a CSV file which shows the number of vaccine doses administered by vaccinator name. When I calculated an age-normalized proportion of doses administered by senior homes, it was much higher for Moderna than Pfizer. [czech3.html#Vaccinator_types]
Kirsch wrote: "The time series plots for Pfizer and Moderna using the Czech data show that both vaccines increase mortality shortly after the shots were given." By the "time series plots", he meant his plots where the x-axis showed times since vaccination and the y-axis showed deaths. However just because there is a low number of deaths in the first few weeks after vaccination, it doesn't mean that
However glass half full perspective, you might just as well say that both vaccines reduce mortality more in the days after vaccination than later on.
Kirsch wrote the following:
His baseline period consisted of weeks 36 to 40 of 2021, and his COVID period consisted of week 40 of 2021 to week 13 of 2022. [https://github.com/skirsch/Czech/blob/b8403b86cccdcbee744a1e68500d63b4e9fb63f7/analysis/KCORv2.xlsx, sheet "PNC enroll"] So week 40 was included in both periods, but I don't know if it was by accitend.
But anyway the HVE was stronger in his baseline period than his COVID period. His COVID period was fairly long because it lasted for 26 weeks, and there wasn't even very high COVID mortality for the first 5 weeks of his COVID period:
library(data.table);library(ggplot2) ages=c(0,3:19*5) cul=\(x,y)y[cut(x,c(y,Inf),,T,F)] nzip=fread("Otevrena-data-NR-26-30-COVID-19-prehled-populace-2024-01.csv.gz") nzip=nzip[!(Umrti!=""&Datum_Prvni_davka>Umrti)] covid=nzip[Umrti!=""&RokNarozeni!="-",.N,.(Umrti,RokNarozeni,vax=Datum_Prvni_davka!=""&Datum_Prvni_davka<=Umrti)] covid=covid[,.(coviddead=sum(N)),.(dose=ifelse(vax,2,3),age=cul(2020-as.integer(substr(RokNarozeni,1,4)),ages),week=Umrti)] t=fread("https://sars2.net/f/czbucketsdaily.csv.gz") a=t[,.(dead=sum(dead),pop=sum(alive)),.(dose=ifelse(dose==0,3,2),week=format(date,"%G-%V"),age=cul(age,ages))] a=merge(a,covid,all=T)[week%like%"202[012]"] a[is.na(a)]=0 a=rbind(a,a[,.(dose=1,dead=sum(dead),pop=sum(pop),coviddead=sum(coviddead)),.(age,week)]) a=merge(fread("https://sars2.net/f/czcensus2021pop.csv")[,std:=pop/sum(pop)][,.(std=sum(std)),.(age=cul(age,ages))],a) p=a[,.(dead=sum(dead/pop*std*365e5),coviddead=sum(coviddead/pop*std*365e5)),.(week,dose)] iso=data.table(date=as.Date("2019-1-1")+(0:2e3))[,week:=format(date,"%G-%V")][rowid(week)==4,setNames(date,week)] p=p[,.(x=iso[week],dose,y=c(dead,dead-coviddead),type=rep(1:2,each=.N),facet=1)] p[,type:=factor(type,,c("All causes","Not COVID"))] p[,dose:=factor(dose,,c("All people","Vaccinated","Unvaccinated"))] p=rbind(p,dcast(p,x+type~dose,value.var="y")[,.(x,type,y=Unvaccinated/Vaccinated,dose="All people",facet=2)]) p[,facet:=factor(facet,,c("Age-standardized mortality rate per 100,000 person-years","Ratio between unvaccinated and vaccinated ASMR"))] p=p[x>="2021-1-7"] xstart=as.Date("2021-1-1");xend=as.Date("2023-1-1");xbreak=seq(xstart+182,xend,"year") p=p[x%in%xstart:xend] ybreak=pretty(c(0,p$y),7) hl=data.table(start=iso[c("2021-36","2021-40")]-3.5,end=iso[c("2021-40","2022-13")]+3.5) hl[,label:=factor(c(1,2),,c("Baseline period","COVID period"))] ggplot(p)+ facet_wrap(~facet,dir="v",scales="free")+ geom_vline(xintercept=seq(xstart,xend,"month"),color="gray92",linewidth=.4)+ geom_rect(data=hl,aes(xmin=start,xmax=end,fill=label),ymin=0,ymax=Inf,alpha=.3,linewidth=.15)+ geom_vline(xintercept=as.Date("2022-1-1"),color="gray70",linewidth=.4)+ geom_line(aes(x,y,color=dose,linetype=type),linewidth=.6)+ labs(x=NULL,y=NULL,title="Weekly ASMR in Czech Republic")+ scale_x_continuous(limits=c(xstart-.5,xend+.5),breaks=xbreak,labels=year(xbreak))+ scale_y_continuous(limits=\(x)range(pretty(x,4)),breaks=\(x)pretty(x,4),labels=\(x)ifelse(x<1e3,x,paste0(x/1e3,"k")))+ scale_color_manual(values=c("black","#f66","#66f"))+ scale_linetype_manual(values=c("solid","11"))+ scale_fill_manual(values=c("#7c7","#faa"))+ coord_cartesian(clip="off",expand=F)+ guides(fill=guide_legend(order=3),color=guide_legend(order=1),linetype=guide_legend(order=2))+ theme(axis.text=element_text(size=11,color="gray50",margin=margin(2,2,2,2)), axis.ticks.length=unit(0,"pt"), legend.box="vertical", legend.box.background=element_blank(), legend.box.just="center", legend.box.margin=margin(), legend.box.spacing=unit(0,"pt"), legend.direction="horizontal", legend.justification="center", legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(25,"pt"), legend.background=element_rect(color="gray70",linewidth=.4), legend.margin=margin(2,5,2,2), legend.position="top", legend.spacing.x=unit(2,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.border=element_rect(color="gray70",fill=NA,linewidth=.4), panel.grid.major=element_blank(), panel.grid.major.y=element_line(linewidth=.4,color="gray90"), panel.spacing=unit(0,"pt"), plot.margin=margin(5,4,5,5), plot.title=element_text(size=11,face=2,hjust=.5,margin=margin(1,,3)), plot.subtitle=element_text(hjust=.5,margin=margin(,,3)), strip.background=element_blank(), strip.text=element_text(size=11)) ggsave("1.png",width=4.8,height=4.2,dpi=300*4)
Kirsch calculated the ratio between unvaccinated and vaccinated people using the raw number of deaths, so that he treated people who were vaccinated after the end of week 41 of 2021 as unvaccinated. In his spreadsheet the ratio of deaths per week in the COVID period relative to the baseline period was about 1.362 in unvaccinated people and about 1.227 in vaccinated people, so by subtracting the two numbers Kirsch got a figure of about 0.135 for his mortality benefit in vaccinated people.
In the following code I did a similar calculation using ASMR so I didn't have to rely on Kirsch's hack of defining people vaccinated after a given date as unvaccinated. Now the ratio of ASMR in the COVID period divided by ASMR in the baseline period was about 1.478 in unvaccinated people had about 1.236 in vaccinated people, so by subtracting the two numbers I get a figure of about 0.242, which is almost twice as high as Kirsch's figure:
isoweek=\(year,week,weekday=7){d=as.Date(paste0(year,"-1-4"));d-(as.integer(format(d,"%w"))+6)%%7-1+7*(week-1)+weekday} t=fread("https://sars2.net/f/czbucketsdaily.csv.gz") t[date>=isoweek(2021,36,1)&date<=isoweek(2021,40,7),period:="baseline"] t[date>=isoweek(2021,40,1)&date<=isoweek(2022,13,7),period:="covid"] a=t[,.(dead=sum(dead),pop=sum(alive)),.(dose=pmin(dose,1),period,age=pmin(age,100)%/%5*5)] a=a[!is.na(period)] a=merge(fread("https://sars2.net/f/czcensus2021pop.csv")[,std:=pop/sum(pop)][,.(std=sum(std)),.(age=age%/%5*5)],a) o=a[,sum(dead/pop*std*365e5),.(period,dose)][,tapply(V1,.(dose,period),c)] round(o) # baseline covid # ASMR per 100,000 person-years (0 is unvaccinated and 1 is vaccinated) # 0 1794 2651 # 1 825 1019 o[1,2]/o[1,1] # 1.477837 (unvaccinated increase) o[2,2]/o[2,1] # 1.235593 (vaccinated increase) o[1,2]/o[1,1]-o[2,2]/o[2,1] # 0.2422439 (difference between unvaccinated and vaccinated increase)
However it would've been more appropriate to calculate the mortality benefit as 1-vax/unvax
, and not as unvax-vax
like Kirsch. So if the ratio of mortality in the COVID period relative to the baseline period would've been 5 in unvaccinated people and 3 in vaccinated people, then vaccinated people would've had a 40% mortality benefit, and not a 200% mortality benefit.
Kirsch wrote this about an analysis of Japanese FOI data published by Kenji Fujikawa: [https://medicalfacts.info/vdeath.rb]
He sent me his posts and his website where you can validate this information. Below is the most interesting graph on his page:
![]()
What is undeniable is that the average mortality rate doubles in just ONE year (from 5,000 to over 10,000) in a fixed age group (80+) where the average mortality rate for the entire group should be relatively constant over time (it's a zero sum game; all the cohorts should average to the same number each period). In one year, at the start of 2022, 90% are in Dose 2, hardly anyone is left in Dose 1, and the rest are unvaccinated. The bars for Dose 0 and Dose 2 are the same height (at 10,000). So the total mortality of the entire group is nearly double what it was a year ago and it was NOT driven by the unvaccinated. The unvaccinated mortality went DOWN and the vaccinated mortality went up.
This is NOT HVE because HVE effects don't modify POPULATION means, HVE simply impacts cohorts.
There is no other way to explain this data other than the vaccinated (which is by far the largest group) significantly increased their mortality.
This is CLEARLY NOT "1% HVE" because HVE never changes total mortality... it just moves deaths between cohorts. Here you can see the total mortality of the ENTIRE COHORT DOUBLED. That's a HUGE problem for "safe and effective." There is no other way to spin it.
However if you look at each semiannual group in Fujikawa's plot, the rightmost bar for the newest vaccine dose is always lower than the leftmost bar for unvaccinated people. Many of the doses in between have such a small population size that they don't have much impact on total vaccinated mortality.
After a large number of people has moved under the nth dose, the mortality rate of dose n-1 shoots up because of the straggler effect. But in the bottom panel here if you compare the gray line here against the black line, you can see that the mortality rate of all vaccinated people combined always remains lower than the mortality rate of unvaccinated people: [statistic2.html#Deaths_by_days_since_vaccination_in_Japan]
In the next plot shows the data but presented in a different way, where I'm plotting excess deaths each month relative to the mortality rate among all people included in the dataset the same month. The row for dose 1+ shows that vaccinated people have negative excess mortality each month, apart from April 2021 when only a very small number of people had been vaccinated. As the healthy vaccinee effect wears off, the excess mortality of vaccinated people gradually drops from about -55% in June 2021 to about -9% in November 2021:
kimi=\(x){na=is.na(x);x[na]=0;e=floor(log10(ifelse(x==0,1,abs(x))));e2=pmax(e,0)%/%3+1;x[]=ifelse(abs(x)<1e3,round(x),paste0(sprintf(paste0("%.",ifelse(e%%3==0,1,0),"f"),x/1e3^(e2-1)),c("","k","M","B","T")[e2]));x[na]="NA";x} t=fread("https://sars2.net/f/japanfoihudikaha.csv") t=t[location==location[1]&age=="80over",-(1:2)] t[,dose:=factor(paste("Dose",dose))] t=rbind(t,t[dose!="Dose 0",.(dead=sum(dead),pop=sum(pop),dose="Dose 1+"),month]) t=merge(t,t[dose!="Dose 1+",.(base=sum(dead)/sum(pop)),month])[,base:=base*pop] t=rbind(t,t[,.(dead=sum(dead),pop=sum(pop),base=sum(base),month="Total"),dose]) m=t[,tapply((dead-base)/ifelse(dead>base,base,dead),.(dose,month),c)] disp=t[,tapply((dead/base-1)*100,.(dose,month),round)] m2=t[,xtabs(pop/365~dose+month)] max1=5;max2=max(m2[,-ncol(m2)]);exp1=.6;exp2=.85;exp2=.7 m[m==-Inf]=-max1 pal1=hsv(rep(c(21/36,0),4:5),c(1,.8,.6,.3,0,.3,.6,.8,1),c(.3,.65,1,1,1,1,1,.65,.3)) pal2=sapply(seq(1,0,,256),\(i)rgb(i,i,i)) pheatmap::pheatmap(sign(m)*abs(m)^exp1,filename=paste0("i1.png"),display_numbers=disp, gaps_col=ncol(m)-1, cluster_rows=F,cluster_cols=F,legend=F,cellwidth=18,cellheight=18,fontsize=9,fontsize_number=8, border_color=NA,na_col="gray90",number_color=ifelse(abs(m)^exp1>max1^exp1*.53,"white","black"), breaks=seq(-max1^exp1,max1^exp1,,256),colorRampPalette(pal1)(256)) pheatmap::pheatmap(m2^exp2,filename=paste0("i2.png"),display_numbers=ifelse(m2<10,round(m2),kimi(m2)), gaps_col=ncol(m)-1, cluster_rows=F,cluster_cols=F,legend=F,cellwidth=18,cellheight=18,fontsize=9,fontsize_number=8, border_color=NA,na_col="gray90",number_color=ifelse(m2^exp2>max2^exp2*.42,"white","black"), breaks=seq(0,max2^exp2,,256),pal2)
The same FOI dataset also shows that unvaccinated people have bigger spikes in mortality during COVID waves than vaccinated people: [statistic2.html#Deaths_by_days_since_vaccination_in_Japan]
In the previous plot if you look at the black line which shows the mortality rate of both vaccinated and unvaccinated people added together, there's a large increase in the mortality rate between 2021 and 2024. It's because the age of each person was determined at the time the data was extracted, so some of the people who were 80 years old at the data was extracted may have been only 75 or 76 years old in early 2021. [https://x.com/donkey1399/status/1923593814704521298, https://x.com/hudikaha/status/1924666052409229765]
This plot of the Japanese FOI data also shows that it takes about 120 days after vaccination for the deaths to reach a peak, which conflicts with Kirsch's claim that the curve for HVE flattens out after 3 weeks: [https://stop-mrna.sakura.ne.jp/db/lot_totalization.php]
In the plot above the reason why the deaths start to fall after day 120 is because people start getting new booster doses so they cycle back to day 0, and also because people who got a booster dose in 2024 start to run out of follow-up time. If people were kept under all previous vaccine doses after a new dose and if people wouldn't run out of follow-up time, the deaths would continue to increase even past day 120.
Kirsch wrote:
2x dose → 2x mortality.
If the vaccines cause no harm, linear dose dependency is impossible to explain.
It happens in all ages.
Conclusion:
- The Czech data, using KCOR, 100% independently confirms the harm signal in Levi.
- The only difference between the lines is how many shots these people got.
- You can't argue "it was the sicker people" who opted for Shot #2 because:
- Nearly everyone got 2 shots
- It's always the healthiest people who opt for the next shot. We know that from the data thanks to the Henjin plot at the end of this section (Henjin collaborates with SW).
Here are the graphs. All ages
![]()
His screenshot is from the "jun enroll" sheet of this spreadsheet: https://github.com/skirsch/Czech/blob/main/analysis/KCORv2.xlsx.
Kirsch included only vaccine doses administered up to week 24 of 2021, so that he determined the vaccination status at the end of week 24, or equivalently at the start of week 25. The baseline period consisted of weeks 27 to 34 of 2021. The observation period started on week 27 of 2021 and ended on week 52 of 2022. The ratio of vaccinated to unvaccinated deaths during the whole period relative to the baseline period was about 1.10 for dose 1 and 1.21 for dose 2. I reproduced his analysis exactly here, so that I even reproduced Kirsch's error of double counting deaths in people with two COVID cases, and I didn't exclude anomalous rows like rows where a date of vaccination was after a date of death:
t=fread("Otevrena-data-NR-26-30-COVID-19-prehled-populace-2024-01.csv.gz") s=t[DatumUmrtiLPZ!=""] s[,dose:=0] s[Datum_Prvni_davka!=""&Datum_Prvni_davka<="2021-24",dose:=1] s[Datum_Druha_davka!=""&Datum_Druha_davka<="2021-24",dose:=2] a=s[,.(dead=.N),.(dose,week=DatumUmrtiLPZ)] a=a[week>="2021-27"&week<="2022-52"] o=a[,.(baseline=sum(dead[week<="2021-34"]),total=sum(dead)),dose] print(o,r=F) # dose baseline total # 0 6906 72979 # 1 2297 26638 # 2 6808 87263 vs0=o[,.(dose,baseline=baseline/baseline[1],total=total/total[1])][-1] print(round(vs0[,totalvsbaseline:=total/baseline][],2),r=F) # ratio relative to unvaccinated # dose baseline total totalvsbaseline # 1 0.33 0.37 1.10 # 2 0.99 1.20 1.21
Kirsch also showed this plot I made: [rootclaim4.html#Comparison_to_people_with_and_without_a_third_dose]
The Henjin plot below that shows that the data shows that the healthiest people opt for the subsequent shots:
![]()
My plot should've been a clue to Kirsch why he got lower mortality relative to the baseline period for dose 1 than dose 2. His baseline period was July 5th 2021 to August 29th 2021. My plot above shows that people with 1 but not more doses have high ASMR in July and August 2021, because by then many of the healthy vaccinees have moved under the second dose. So during the baseline period the HVE caused dose 1 to have elevated mortality and dose 2 to have reduced mortality, but over time after the HVE became weaker, the ratio of mortality between dose 1 and dose 2 also got lower.
In Kirsch's analysis the effect was not quite as dramatic as in my plot above, because he ignored vaccine doses administered on week 25 of 2021 or later, so he classified a large part of people with two doses under the first dose. It considerably reduced the mortality rate of people with 1 dose, as is shown by the top panel of the next plot. But in the bottom panel where I didn't ignore vaccine doses administered after week 24, the mortality rate of people with only 1 dose has a large increase after week 24:
t=fread("Otevrena-data-NR-26-30-COVID-19-prehled-populace-2024-01.csv.gz") t=t[Infekce%in%c(NA,1)][RokNarozeni!="-"] t[,born:=pmin(2000,pmax(1925,as.integer(substr(RokNarozeni,1,4))))] t[,dose1:=Datum_Prvni_davka][,dose2:=Datum_Druha_davka] t=t[!(DatumUmrtiLPZ!=""&pmax(dose1,dose2)>DatumUmrtiLPZ)] t=rbind(copy(t)[dose1>"2021-24",dose1:=""][dose2>"2021-24",dose2:=""][,facet:=1],t[,facet:=2]) t[,dose:=0][dose1!="",dose:=1][dose2!="",dose:=2] a=t[,.(week=c(rep("2020-10",.N),dose1,dose2),dose=rep(0:2,each=.N),born,facet)] a=a[,.(vax=.N),.(week,dose,born,facet)] a=merge(a,t[,.(dead=.N),.(week=DatumUmrtiLPZ,born,dose,facet)],all=T)[week!=""] a=merge(do.call(CJ,lapply(a[,1:4],unique)),a,all=T);a[is.na(a)]=0 a[,cumvax:=cumsum(vax),.(born,dose,facet)][,pop:=cumvax-cumsum(dead),.(born,dose,facet)] a[dose==0,pop:=pop-a[dose==1,cumvax]][dose==1,pop:=pop-a[dose==2,cumvax]] a=merge(a[week=="2022-01",sum(pop),born][,.(std=V1/sum(V1),born)],a) iso=as.Date(1)+0:1e4*7;names(iso)=format(iso,"%G-%V") p=a[,.(y=ifelse(sum(pop)*7<365e3,NA_real_,sum(dead/pop/7*365e5*std,na.rm=T))),.(dose,x=iso[week],facet)] p[,dose:=factor(dose,,c("Unvaccinated","Dose 1","Dose 2 or more"))] p[,facet:=factor(facet,,paste("Doses admin-\nistered after\ncutoff",c("ignored","not ignored")))] xstart=as.Date("2021-1-1");xend=as.Date("2024-1-1");xbreak=seq(xstart+182,xend,"year") ystart=0;ybreak=pretty(p$y,6);yend=max(ybreak) ggplot(p)+ facet_wrap(~facet,ncol=1,scales="free")+ geom_hline(yintercept=c(ybreak[ybreak<yend],yend),color="gray90",linewidth=.4,lineend="square")+ geom_vline(xintercept=seq(xstart,xend,"year"),color="gray90",linewidth=.4,lineend="square")+ annotate("rect",xmin=iso["2021-27"]-3.5,xmax=iso["2021-34"]+3.5,ymin=0,ymax=Inf,fill="green",alpha=.25)+ annotate("rect",xmin=xstart,xmax=xend,ymin=0,ymax=yend,color="gray75",linewidth=.4,lineend="square",linejoin="mitre",fill=NA)+ geom_line(aes(x,y,color=dose),linewidth=.6)+ geom_vline(xintercept=iso["2021-24"],linewidth=.4,linetype="22")+ geom_label(data=p[rowid(facet)==1],aes(label=facet),y=yend,x=xend,hjust=1,vjust=1,fill="white",label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=.4,color="gray75",size=3.87,lineheight=.8)+ geom_label(data=p[rowid(facet)==1],aes(label=facet),y=yend,x=xend,hjust=1,vjust=1,fill=NA,label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=0,size=3.87,lineheight=.8)+ labs(x=NULL,y=NULL,title="Weekly ASMR per 100,000 person-years in Czech Republic")+ annotate(geom="text",x=iso["2021-30"],label="Baseline (weeks 27 to 34)",color="#00aa00",y=yend*.86,hjust=0,vjust=1,size=3.87,lineheight=.8)+ annotate(geom="text",x=iso["2021-25"],label="Vaccination cutoff date (week 24)",y=yend*.96,hjust=0,vjust=1,size=3.87,lineheight=.8)+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=year(xbreak))+ scale_y_continuous(limits=c(ystart,yend),breaks=ybreak)+ scale_color_manual(values=c("#EB3727","#DA7842","#67A442"))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray50",margin=margin(2,2,2,2)), axis.ticks.length=unit(0,"pt"), legend.box.margin=margin(,,3), legend.box.spacing=unit(0,"pt"), legend.direction="horizontal", legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(26,"pt"), legend.background=element_rect(color="gray90",linewidth=.4), legend.margin=margin(2,5,2,2), legend.position="top", legend.spacing.x=unit(2,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.spacing=unit(2,"pt"), plot.margin=margin(4,5,4,5), plot.title=element_text(size=11,face=2,hjust=.5,margin=margin(1,,3)), plot.subtitle=element_text(hjust=.5,margin=margin(,,3)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5,height=4.7,dpi=300*4)
In the top panel of the plot above, if you imagine dividing the line for the first dose with the line for the second dose, the ratio between the lines is higher in the baseline period than later on. So that's also why Kirsch got a higher KCOR ratio for the second dose than the first dose.
Kirsch wrote:
Below, cumulative CFR all ages. It ONLY drops on Delta and then on Omicron variants. Not before. If the shots reduced the CFR, we'd see a drop. If the shots reduced cases of the vaccinated, we'd only be seeing deaths of the younger unvaccinated and that would drop this population CFR as well. No drop.
![]()
However if you look at non-cumulative CFR, there is in fact a clear reduction in CFR in 2021 when people got vaccinated:
t=fread("Otevrena-data-NR-26-30-COVID-19-prehled-populace-2024-01.csv.gz")[!is.na(Infekce)] a=t[,.(case=.N,dead=sum(Umrti!="")),,.(week=DatumPozitivity)] p=a[,.(x=week,y=c(dead/case,cumsum(dead)/cumsum(case))*100,z=rep(1:2,each=.N))] p[,z:=factor(z,,c("Not cumulative","Cumulative"))] weeks=data.table(date=as.Date("2019-1-1")+0:3e3)[,week:=format(date,"%G-%V")][rowid(week)==4,setNames(date,week)] p[,x:=weeks[x]] xstart=as.Date("2020-1-1");xend=as.Date("2025-1-1");xbreak=seq(xstart+182,xend,"year") ybreak=pretty(p$y);ystart=0;yend=max(ybreak) ggplot(p)+ geom_vline(xintercept=seq(xstart,xend,"3 month"),color="gray90",linewidth=.4)+ geom_hline(yintercept=ybreak,color="gray90",linewidth=.4)+ geom_vline(xintercept=seq(xstart,xend,"year"),color="gray70",linewidth=.4)+ annotate("rect",xmin=xstart,xmax=xend,ymin=ystart,ymax=yend,linewidth=.4,lineend="square",fill=NA,color="gray70")+ geom_line(aes(x,y,color=z),linewidth=.6)+ geom_point(aes(x,y,color=z),size=1.1)+ labs(x=NULL,y=NULL,title="Weekly ercentage of cases that led to a death in Czech Republic",subtitle="Source: nzip.cz/data/2135-covid-19-prehled-populace")+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=year(xbreak))+ scale_y_continuous(limits=c(ystart,yend),breaks=ybreak,labels=\(x)paste0(x,"%"))+ scale_color_manual(values=c("black","#ff8888"))+ coord_cartesian(clip="off",expand=F)+ guides(color=guide_legend(ncol=1,byrow=F))+ theme(axis.text=element_text(size=11,color="gray50",margin=margin(2,2,2,2)), axis.ticks.length=unit(0,"pt"), legend.background=element_rect(color="gray70",linewidth=.4), legend.box.spacing=unit(0,"pt"), legend.direction="vertical", legend.justification=c(.5,1), legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(26,"pt"), legend.margin=margin(3,5,3,3), legend.position=c(.5,1), legend.spacing.x=unit(2,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.grid.major.x=element_blank(), panel.grid.major.y=element_blank(), plot.margin=margin(5,5,5,5), plot.subtitle=element_text(hjust=.5,margin=margin(,,4)), plot.title=element_text(size=11,hjust=.5,face=2,margin=margin(2,,4))) ggsave("1.png",width=5,height=3,dpi=300*4)
Kirsch wrote:
These graphs are from the official US data from UCOD (underlying cause of death). I use these spreadsheets: ACM by month and ACM by year [broken links to Kirsch's GitHub repository]. These charts speak for themselves.
If the vaccine was saving lives, we should have seen a return to baseline mortality in older ages. We didn't. We saw a mortality rate gap that persisted.
SW's claims just don't match up with the actual US data.
Are we supposed to trust his models and ignore reality?
![]()
But anyway there's an increasing trend in the number of deaths per year because of the aging population, so it doesn't make sense to use the number of deaths in 2018 as the baseline. When I calculated the baseline by doing a Poisson regression in 2010-2019, I got negative excess deaths in 2023:
t=fread("https://sars2.net/f/uspopdead.csv")[,.(dead=sum(dead),pop=sum(pop)),.(year,age)] t=t[year%in%2010:2024] t$poi=predict(glm(dead~factor(age),poisson,t[year<2020],offset=log(pop)),t,type="response") t=merge(t,t[year<2020,.(year=2010:2024,base=predict(lm(dead/pop~year),.(year=2010:2024))),age]) a=t[,.(dead=sum(dead),base=sum(base*pop),poi=sum(poi)),year] a$base2=a[year%in%2010:2019,predict(lm(dead~year),a)] a$ave=a[year==2018,mean(dead)] p=a[,.(x=year,y=unlist(.SD[,-1]),z=rep(1:(ncol(.SD)-1),each=.N))] p[,z:=factor(z,,c("Actual deaths","2010-2019 linear CMR by age","2010-2019 Poisson regression","2010-2019 linear regression","Deaths in 2018"))] xstart=2010;xend=2024;ybreak=pretty(p$y);ystart=ybreak[1];yend=max(ybreak) ggplot(p)+ annotate("rect",xmin=xstart-.5,xmax=xend+.5,ymin=ystart,ymax=yend,linewidth=.4,lineend="square",fill=NA,color="gray50")+ geom_line(aes(x,y,color=z),linewidth=.6)+ geom_line(data=p[z==z[1]],aes(x,y,color=z),linewidth=.6)+ geom_point(aes(x,y,color=z,alpha=z),stroke=0,size=1.5)+ labs(title="Yearly deaths in the United States",x=NULL,y=NULL)+ scale_x_continuous(limits=c(xstart-.5,xend+.5),breaks=seq(xstart,xend,2))+ scale_y_continuous(limits=c(ystart,yend),breaks=ybreak,labels=kim)+ scale_color_manual(values=c("black","#00aa00","#ff44ff","blue",hsv(3/36,.9,.6)))+ scale_alpha_manual(values=c(1,0,0,0,0))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray50",margin=margin(0,0,0,0)), axis.ticks=element_line(linewidth=.4,color="gray50"), axis.ticks.length=unit(4,"pt"), legend.background=element_blank(), legend.box.background=element_rect(color="gray50",linewidth=.4), legend.box.spacing=unit(0,"pt"), legend.justification=c(0,1), legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(26,"pt"), legend.margin=margin(3,5,3,3), legend.position=c(0,1), legend.spacing.x=unit(1,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11), legend.title=element_blank(), panel.background=element_blank(), plot.margin=margin(4,5,4,5), plot.subtitle=element_text(size=11,margin=margin(,,4)), plot.title=element_text(size=11.3,face=2,hjust=.5,margin=margin(1,,4))) ggsave("1.png",width=5,height=2.9,dpi=300*4)
Kirsch wrote:
From the official UK data, but with my ratio between u/v ASMR rates.
Note: I'm not a big fan of the UK data because the ONS admitted that it was so problematic, it was unfit for purpose.
So with that caveat in mind, here's what the Death by vaccination status reveals:
![]()
Note that if the vaccine worked, the unvaxxed/vaxxed ASMR ratio should increase during COVID (e.g., Nov and Dec 2021.
It doesn't. It goes the other way. The ASMR for the unvaccinated falls while the ASMR of the vaccinated increases. So it's relatively better to be unvaccinated.
I don't place much weight in this data. Look at how the ASMR for the unvaccinated fluctuates in 30 days. It's not credible. So if anyone tries to use this data, you'd have to wonder why.
The reason why he used November and December as his high-COVID period seems to have been because the Czech Republic deaths during the Delta wave peaked in November to December 2021. But the UK already had a lot of Delta deaths in August, and there was a period with elevated COVID mortality from July 2021 until January 2022.
But the ratio between unvaccinated and vaccinated ASMR dropped in February 2022 after the COVID deaths went down. So Kirsch should've used the period from February 2022 onwards as his low-COVID baseline period, and not the period before November 2021 like in his analysis of the Czech data:
t=fread("https://sars2.net/f/ons.csv") t=rbind(t[ed==7&month<="2021-03"],t[ed==9]) s=t[status%like%"acci"&age=="Total"&cause!="Deaths involving COVID-19"] p=s[,.(x=as.Date(paste0(month,"-16")),y=asmr,z=status,cause,facet=1)] p[,cause:=factor(cause,,c("All causes","Not COVID"))] p[,z:=factor(z,unique(z),c("Unvaccinated","Vaccinated"))] p=rbind(p,dcast(p,x+cause~z,value.var="y")[,.(x,y=Unvaccinated/Vaccinated,cause,z="Ratio",facet=2)]) p[,facet:=factor(facet,,c("ASMR","Ratio"))] xstart=as.Date("2021-1-1");xend=as.Date("2023-6-1");xbreak=seq(xstart,xend,"year") ggplot(p)+ facet_wrap(~facet,ncol=1,scales="free_y")+ geom_line(aes(x,y,color=z,alpha=cause),linewidth=.6)+ geom_point(aes(x,y,color=z,alpha=cause,shape=cause),stroke=.6,size=1.5)+ geom_text(data=p[,max(pretty(c(0,y))),facet],aes(y=V1,label=facet),vjust=1.7,x=pmean(xstart,xend),hjust=.5,size=3.87,fontface=2)+ labs(x=NULL,y=NULL,title="Monthly ASMR per 100,000 person-years in English ONS data")+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=year(xbreak))+ scale_y_continuous(limits=\(x)range(pretty(c(0,x))),breaks=\(x)pretty(c(0,x)))+ scale_color_manual(values=c("#5555ff","#ff5555","gray50"))+ scale_alpha_manual(values=c(1,.5))+ scale_shape_manual(values=c(16,1))+ coord_cartesian(clip="off",expand=F)+ guides(color=guide_legend(order=1),alpha=guide_legend(order=2),shape=guide_legend(order=2))+ theme(axis.text=element_text(size=11,margin=margin(2,2,2,2),color="gray40"), axis.text.x=element_text(hjust=0), axis.ticks.length=unit(0,"pt"), legend.background=element_rect(color="gray70",linewidth=.4), legend.box="vertical", legend.box.just="center", legend.box.margin=margin(,,3), legend.box.spacing=unit(0,"pt"), legend.direction="horizontal", legend.justification="center", legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(26,"pt"), legend.margin=margin(2.5,5.5,2.5,2.5), legend.position="top", legend.spacing.x=unit(3,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.border=element_rect(fill=NA,linewidth=.4,color="gray70"), panel.grid.major=element_line(linewidth=.4,color="gray90"), panel.spacing=unit(10,"pt"), plot.margin=margin(5,5,4,5), plot.title=element_text(size=11.4,face=2,margin=margin(1,,5),hjust=.5), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5.2,height=4.1,dpi=300*4)
When Kirsch said that the "the ASMR for the unvaccinated fluctuates in 30 days", I don't know if he meant the change in ASMR during the first months of 2021 that was due to HVE, or the change in later months that was due to variability in COVID deaths.
But in case he meant the former, Kirsch should recognize by now that the HVE explains why unvaccinated people have high mortality when the first dose is rolled out, since he has identified a similar phenomenon in the Czech data. He linked to a Substack post about the ONS data by Norman Fenton and Martin Neil, who used to claim that the high mortality in unvaccinated people in early 2021 was somehow anomalous, and it was not explained by the HVE.
In 2022 Fenton and Neil also wrote a paper where they claimed that the ONS dataset was "corrupted" because there was a very low number of deaths during the first two weeks from vaccination. But since then several other datasets have been released which have a similarly low number of deaths in the first two weeks after vaccination, including the Medicare and New Zealand datasets that were released by Kirsch. Even Kirsch's own analysis of the various record-level datasets has shown why Fenton and Neil's old preprints about the ONS data were wrong.
Kirsch wrote: "Short term HVE is always around 21 days regardless of location or vaccine."
When I searched for studies that showed deaths by time after vaccination for non-COVID vaccines, I found a paper from 2009, which showed that deaths by weeks after influenza vaccination kept climbing long after 21 days from vaccination had passed (even though it might partially be because of seasonal variation in mortality, because influenza vaccines are often administered before the flu season when mortality peaks in the winter).
The paper featured the following plot with this caption: "Mortality (deaths per 100 person-years) by week after influenza vaccination among higher-risk vaccinees, lower-risk vaccinees, and all vaccinees (1.9 million flu shots), Kaiser Permanente, Northern California, 1996-2005. The flat reference line shows the average monthly mortality during all unvaccinated time in the study population. COPD, chronic obstructive pulmonary disease." [https://pmc.ncbi.nlm.nih.gov/articles/PMC2728831/]
A study from 2024 included the plot below that shows all-cause mortality risk by weeks after flu vaccination, where the mortality risk gradually increases from about 0.19 on weeks 5-8 to 1.05 on weeks 25-28: [https://onlinelibrary.wiley.com/doi/10.1002/jmv.29722]
Kirsch wrote: "Kaplan-Meier survival curves analysis using the Czechia data confirms that the vaccinated did uniformly worse than the unvaccinated."
The document he linked said:
This analysis uses a 'predicted' survival using a straight line derived from the tangent to the survival curve for each brand including the unvaccinated. The tangent is taken from early in the survival (April 12, 2021 to May 31, 2021) trajectory to consider evidence that late patterns of survival in each group differ from early. It is expected that mortality benefits or harms from the covid-19 vaccinations are difficult to compare within groups due to unmeasured confounding. This method assumes that the early survival trajectory represents the 'true' survival trajectory of the group and that latter deviation from the tangent reflects the effect of the treatment.
The average deviation between observed survival in the Kaplan-Meier plot compared to the groups corresponding tangent, summarises the effect of the treatment group (unvaccinated ["None"], "Pfizer", "Moderna" or "Astra-Zeneca") up until the end of 2022. Values greater than zero indicate poorer than expected survival, whereas negative values indicated better than expected survival. The straight line is considered a rough approximation to expected survival.
Then the document included plots like this for various age groups, where the "tangent" looks like a linear regression of the survival probability around days 10-60 of follow-up:
So even though unvaccinated people had a lower survival probability than vaccinated people, the survival probability was above the tangent for vaccinated people but below the tangent for unvaccinated people, which Kirsch interpreted to mean that vaccinated people somehow did worse than unvaccinated people.
The obvious flaw in his reasoning is that there were still many recently vaccinated people during the period that was used to fit the tangent, so the HVE was stronger in the period than later. But as the HVE got weaker over time, the vaccinated mortality fell below the tangent but the unvaccinated mortality rised above the tangent.
Kirsch wrote: "The Aarstad study (39 countries, 1B total population) showed an R2 =56.6%. Relating vaccination level and excess mortality. There is no study anywhere with a comparable population and R2 that shows a negative correlation."
Aarstad got an r-squared value of abotu 0.57 between excess mortality in 2022 and the percentage of vaccinated people across European countries. But that's because he used the average number of deaths in 2016-2019 as the baseline, which exaggerated excess mortality in Western European countries relative to Eastern European countries for two reasons. Western European countries had a more steeply increasing slope in yearly deaths even before COVID. And also Eastern European countries had a higher percentage of excess deaths in 2020-2022, so the baseline should've been lowered more in Eastern European countries to account for the reduction in population size: [rootclaim.html#Aarstads_correlation_between_excess_deaths_at_Eurostat_in_2022_and_percentage_of_vaccinated_people_4g]
When I used a more accurate 2013-2019 linear trend for ASMR instead, I got a negative correlation between the percentage of vaccinated people in 2022 and excess deaths in 2022: [ibid.]
In the first round of the Rootclaim debate, Kirsch wrote: [https://kirschsubstack.com/p/did-the-covid-vaccine-save-more-people]
The Czech Republic record-level data obtained under FOIA request from the Czech government showed that people who got the Moderna vaccine were 30% more likely to die within 1 year of the shot than people who got the Pfizer vaccine. The 30% difference appeared in all age groups where there was sufficient data and it happened during NON-COVID time periods. People tried to attack this claiming that it was due to distribution bias, but we showed that was false. The reason this is such an important study is because you cannot compare vaccinated with unvaccinated death rates due to selection bias. But in the Czech Republic, the vaccines were randomly assigned and nobody had any clue which one was safer. So there was no systematic or systemic bias. So how can the death rates be 30% higher in every age group with sufficient data? The only way that can happen is if the Moderna vaccine is more deadly. And in that document we show 8 different data points that are consistent with Moderna having a higher adverse event rate. We believe the higher death rate in Moderna vs. Pfizer is primarily due to the 100mcg dose vs. 30 mcg dose. The more poison, the more death. There have been very few brand comparison studies like this and what they do is adjust the numbers to make the death differences go away because their assumption going into it is that the vaccines should have equal mortality rates so they get rid of the differences statistically. This is raw data. You can't have a 30% higher death rate in nearly all 5 year age groups over 50. That's statistically unlikely to happen. And even if Pfizer was 100% safe, a 30% increase in ACM (over the first year from the shot) is a disaster.
However now in the PDF file for his sixth round of arguments, Kirsch wrote that he regrets not having appreciated the effect of confounders when he compared the mortality of Moderna against Pfizer in the Czech data: [https://www.skirsch.com/covid/KIRSCH_COVID_shot_analysis.pdf]
In previous analyses of the Czech data, I found that the Moderna shots were more deadly than the Pfizer shots. That calculation was using the raw, unadjusted data.
In fact, in the Levi study, in the unadjusted FULL cohort, they found the same thing (that in the raw, unadjusted full cohort, Moderna appears to be more deadly):
![]()
However, after basic adjustments were made to the FULL COHORT (9M), they found that Pfizer was in fact more deadly (see the second line of the figure above).
And after doing extremely tight matching, it changed the adjusted full cohort by less than 0.5%, a tiny amount.
My earlier Czech analysis didn't do any of these adjustments. This is why in observational studies they do adjustments like these because sometimes they can flip the result.
The fact that the Levi study FULL cohort with basic adjustments nearly exactly matched the nearly exactly matched MATCHED cohort is extremely powerful.
The reality of course is that both vaccines were quite deadly. If Moderna was 100% safe as we have assumed in this analysis (since we don't know the absolute level of NCACM harm), most all the VAERS death reports would be for only one brand of vaccine; that just isn't the case.
This is a perfect example of why, when looking at observational data, basic adjustments to the raw data are necessary. I regret that I did not fully appreciate that before.
In 2024 Kirsch kept insisting that Pfizer and Moderna vaccines were distributed randomly and without bias in the Czech Republic, so the difference in mortality between the vaccine brands could not have been due to confounders, even though me and Uncle John Returns and Jeffrey Morris kept telling him otherwise.
Kirsch also cherrypicked sources which showed that Moderna had higher mortality than Pfizer, but he ignored the other sources I showed him where Pfizer had higher mortality than Moderna.
I showed him that the average age of VAERS reports is much higher for Moderna than Pfizer, but he did not account for the difference in age distribution when he declared that Moderna was more deadly than Pfizer based on VAERS data. In the unadjusted model of Levi et al., I believe the main reason why Moderna had a higher mortality risk than Pfizer was that the median age was 62 for Moderna but 54 for Pfizer, so simply adjusting the analysis for age would've probably caused Pfizer to have a higher mortality risk than Moderna.
In his initial analysis of the Czech data, Kirsch even wrote that the Pfizer and Moderna vaccines were distributed so randomly that it "created a perfect real-world randomized clinical trial", so that he didn't have to adjust for any confounders when he compared the mortality of the vaccine brands: "Vaccines were randomly distributed for those wishing to get vaxxed. [...] People were not allowed to select which vaccines they got. [...] The randomization of which vaccine someone got created a perfect real-world randomized clinical trial where we could compute the mortality rates for 1 year after Dose 2 for the two most popular vaccines." [https://github.com/skirsch/Czech/blob/5725ac1b64ede7124e00b72af68892f31736b349/README.md] After I pointed out to Kirsch that the average age at first dose was much higher for Moderna than Pfizer, which showed that the vaccine brands were not distributed randomly, he seems to have toned down his initial claim about how the distribution of the vaccine brands was perfectly randomized, but it was still the original basis of his argument that the Czech data showed that Moderna was more deadly than Pfizer.
During the first round of the Rootclaim debate, Kirsch claimed that Moderna vaccines were more deadly than Pfizer vaccines based on his analysis of the Czech data, but in the sixth round of the argument he now seems to have dropped the claim, because in the Levi-Ladapo paper Pfizer now had higher mortality than Moderna.
But in the same way that in 2024 Kirsch was confident that the distribution of vaccines in the Czech Republic was so random that confounders couldn't have explained why Moderna had higher mortality than Pfizer, he is now confident that Levi's matching procedure was so perfect that confounders cannot explain why Pfizer has higher mortality than Moderna.
Kirsch referred to this Substack post, which includes various plots for deaths as a function of time since vaccination: https://kirschsubstack.com/p/covid-time-series-graphs-show-clearly. Most of them were based on Medicare data that Kirsch received from a source at the HHS in 2023.
Kirsch claims that the HVE only lasts for 3 weeks, because in this plot of deaths by weeks since the first dose in the Czech data, there is a sharp turning point in mortality around day 21:
But he pointed out that a similar turning point is more difficult to see for second and third doses:
However the sharp turning point around day day 21 for first doses is because many people got the first dose at the tail end of the period with high COVID deaths in early 2021, so there was a sharply decreasing trend in background mortality rate: [czech4.html#Plot_for_raw_deaths_by_weeks_after_vaccination]
Kirsch also posted these plots of Medicare data, where people who got the first COVID vaccine in the first quarter of 2021 have a turning point in deaths around the third week after vaccination, but the curve in deaths is more smooth in people who got the first dose in the second quarter of 2021, but it's because people vaccinated in the first quarter had a more sharply decreasing trend in the background mortality rate than people vaccinated in the second quarter:
Kirsch also published a spreadsheet that shows the number of deaths grouped by month of the first COVID vaccine dose. It only includes data for the first three months of 2021, but it still clearly shows how the effect of the COVID deaths during the first 100 days from vaccination was higher for people vaccinated in January than for people vaccinated in February or March. Even among people vaccinated in March, the increase in deaths between days 50 and 100 is more steep than in people vaccinated in February: [f/COVID_vax_jan_feb_mar_2021_plus_ALL_deaths_in_medicare_per_day.xlsx
ma=\(x,b=1,f=b){x[]=rowMeans(embed(c(rep(NA,b),x,rep(NA,f)),f+b+1),na.rm=T);x} t=fread("https://sars2.net/f/medicarecovidmonthly.csv") t[,vaxmonth:=factor(vaxmonth,,paste("Vaccinated",month.name[1:3],2021))] p=t[,.(x=day,y=ma(dead,3)),.(z=vaxmonth)] xstart=0;xend=1000;xbreak=0:10*100 p=p[x%in%xstart:xend] ybreak=p[,pretty(y)];ystart=0;yend=max(ybreak) ggplot(p)+ annotate("rect",ymin=ystart,ymax=yend,xmin=xstart,xmax=xend,lineend="square",fill=NA,color="gray70",linewidth=.4)+ geom_line(aes(x,y,color=z))+ labs(x=NULL,y=NULL,title="Deaths by days since first COVID vaccine dose in Medicare data")+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak)+ scale_y_continuous(limits=c(ystart,yend),breaks=ybreak)+ scale_color_manual(values=hsv(22/36,c(1,.8,.4),c(.7,1,1)))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="black",margin=margin(2,2,2,2)), axis.ticks=element_line(linewidth=.4,color="black"), axis.ticks.length=unit(0,"pt"), legend.background=element_rect(color="gray70",linewidth=.4), legend.box="vertical", legend.box.background=element_blank(), legend.box.spacing=unit(0,"pt"), legend.justification=c(.5,0), legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(26,"pt"), legend.margin=margin(3,5,3,3), legend.position=c(.5,.15), legend.spacing.x=unit(2,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.grid.major=element_line(linewidth=.4,color="gray87"), plot.margin=margin(5,18,5,5), plot.title=element_text(size=11.3,face=2,hjust=.5,margin=margin(2,,4))) ggsave("1.png",width=5.45,height=3.3,dpi=300*4)
Kirsch recognized the problem himself in the sheet "vaxxed in jan 2021" of his spreadsheet, where he included these comments:
what's happening is deaths are falling from COVID at the same time the deaths are rising from the vaccine so you never get a "low" baseline.... The two effects are keeping the baseline deaths elevated
So you can never "see" a true "baseline" because it is masked by the COVID deaths.
The COVID deaths are coming down at the same time the vaccine deaths rate from the vax is ramping up.
Kirsch also showed these plots of flu and pneumonia vaccines administered in the first quarter of 2021:
However his plots have the same problem as the plot for COVID vaccines administered in the first quarter of 2021. The United States had very high excess deaths in January 2021 due to COVID, but by March 2021 the excess deaths had returned close to zero. So in Kirsch's plots the background mortality rate is high at the start of the x-axis but afterwards it gradually drops as the proportion of observation time from January and February drops. So the increasing trend in mortality due to the HVE is counteracted by the decreasing trend in the background mortality rate, so it's difficult to evaluate from his plots how long the HVE lasts.
However if you don't cherrypick vaccine doses administered in the first quarter of 2021, then the period after vaccination when there is reduced mortality lasts much longer than 3 weeks. The next screenshot shows one of the spreadsheets that Kirsch published on his S3 server in December 2023. [https://kirschsubstack.com/p/data-from-us-medicare-and-the-new, f/Medicare-flu-pneu-covid_given_21_or_22.xlsx] It shows that for flu vaccines administered at any time in 2021 or 2022, the deaths take about 100 days to reach the peak. The peak is probably due to elevated mortality in the winter combined with the effect of COVID waves, because flu vaccines are often administered before the flu season. But anyway, now the increase in deaths over the first 100 days is more smooth than in the plot for vaccine doses administered in the first quarter of 2021, because the vaccine doses are distributed more evenly across time so there is not a sharp decrease in the background mortality rate at the start of the x-axis:
The plot above actually looks like what would expect from an unsafe vaccine, because there is a high number of deaths on day 0 which refers to the day of vaccination. Deaths caused by vaccines are likely to be heavily concentrated on the day of vaccination and the next few days. So if deaths as a function of time since vaccination go down during the first few days from vaccination, it's a sign that there might be some deaths caused by the vaccination. But Kirsch has developed a counterintuitive line of reasoning, where he claims that if deaths as a function of time since vaccination go up over time, it means that vaccines are killing more people over time.
This plot for shingles vaccines also shows that it takes much longer than 21 days for the HVE to wear off so that deaths reach a stable level:
In the next plot I combined data for deaths by days since vaccination from various spreadsheets on Kirsch's S3 server. I excluded the day of vaccination because it stretched the y-axis too much for pneumonia vaccines. You can see that COVID vaccine administered in 2021 look atypical because they have the notch around day 20-30. But across all vaccine types and all years of vaccination, a more typical curve looks more smooth so that it takes about 100 days to reach a somewhat stable level:
ma=\(x,b=1,f=b){x[]=rowMeans(embed(c(rep(NA,b),x,rep(NA,f)),f+b+1),na.rm=T);x} t=fread("https://sars2.net/f/medicarevaxtypes.csv") t[,type:=factor(type,unique(type))] sub=setDT(read_excel("https://sars2.net/f/Medicare-2-1-23_all_states_subset_plus_CT.xlsx")) sub=sub[,.(dead=.N),,.(year=year(`First Vaccination Date`),day=DTD)][year%in%2021:2022] t=rbind(t,sub[,type:="COVID (all states subset)"]) p=t[day>0,.(x=day,y=ma(dead,3)),.(facet=type,year)] xstart=0;xend=1000;xbreak=0:10*100 p=p[x%in%xstart:xend] ggplot(p)+ geom_rect(data=p[,max(as.integer(pretty(c(0,y)))),facet],aes(ymax=V1),ymin=0,xmin=xstart,xmax=xend,lineend="square",fill=NA,color="gray70",linewidth=.4)+ facet_wrap(~facet,ncol=1,scales="free_y")+ geom_line(aes(x,y,color=year))+ geom_label(data=p[,.(y=max(pretty(c(y,0)))),facet],aes(label=facet,y=y),x=xend,hjust=1,vjust=1,fill="white",label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=.4,color="gray70",size=3.87)+ geom_label(data=p[,.(y=max(pretty(c(y,0)))),facet],aes(label=facet,y=y),x=xend,hjust=1,vjust=1,fill=NA,label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=0,color="black",size=3.87)+ labs(x=NULL,y=NULL,title="Deaths by days since vaccination in Medicare data",subtitle="7-day moving average (±3-day window), day 0 excluded.\nThe color of lines shows the year of administration.")+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak)+ scale_y_continuous(limits=\(x)range(pretty(c(0,x))),breaks=\(x)pretty(c(0,x)),labels=\(x)ifelse(x==max(pretty(c(0,x))),"",x))+ scale_color_manual(values=c(hcl(c(0,6,12,21,27,32)*10+15,100,60),"black"))+ coord_cartesian(clip="off",expand=F)+ guides(color=guide_legend(nrow=1,byrow=F))+ theme(axis.text=element_text(size=11,color="black",margin=margin(2,2,2,2)), axis.ticks=element_line(linewidth=.4,color="black"), axis.ticks.length=unit(0,"pt"), legend.background=element_blank(), legend.box="vertical", legend.box.background=element_blank(), legend.box.spacing=unit(0,"pt"), legend.direction="horizontal", legend.justification="center", legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(16,"pt"), legend.margin=margin(,,4), legend.position="top", legend.spacing.x=unit(1,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.grid.major=element_line(linewidth=.4,color="gray87"), panel.spacing=unit(2,"pt"), plot.margin=margin(5,17,5,5), plot.subtitle=element_text(hjust=.5,margin=margin(,,2)), plot.title=element_text(size=11.3,face=2,hjust=.5,margin=margin(1,,4)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5,height=5,dpi=300*4)
Kirsch wrote: "Short term HVE was measured to be 21 days from the Czechia FOIA data which has per day time resolution (source) with a half life of around 5 days."
In the next plot I calculated excess mortality in the Czech dataset that was adjusted for age and the background mortality rate. For each combination of age group and observation month, I used the mortality rate of all people included in the dataset as the baseline. Then for each dose number and week after vaccination, I multiplied the person-days for each combination of age group and observation month with the baseline mortality rate to get the expected number of deaths, and I calculated the percentage of excess deaths by dividing the actual deaths by expected deaths and subtracting 1. It takes about 20 weeks for the excess mortality to stabilize around the level of -25% to -15%, even though it later keeps climbing even closer to 0% [czech2.html#Excess_mortality_by_weeks_after_vaccination]
I also came up with a method to compare vaccinated ASMR by weeks after vaccination against ASMR in a matched cohort of unvaccinated people. When I applied the method to the first 4 doses in the Czech FOI data, for each dose unvaccinated people got over 6 times higher ASMR than vaccinated people during week 0, even though by week 10 the ratio had dropped to about 2.8 for the first dose, 2.5 for the second dose, 3.3 for the third dose, and 2.0 for the fourth dose:
t=fread("https://sars2.net/f/czbucketskeep.csv.gz")[dose<=4] a=t[,.(dead=sum(dead),pop=sum(alive)),.(week,month,dose,age=pmin(age,95)%/%5*5)] std=fread("https://sars2.net/f/czcensus2021pop.csv")[,sum(pop),.(age=pmin(age,95)%/%5*5)][,.(age,std=V1/sum(V1))] vax=a[dose>0,.(dead=sum(dead),pop=sum(pop)),.(week,month,age,dose)] base=merge(vax,vax[,.(sum=sum(pop)),.(week,dose)]) base=base[,.(frac=pop/sum,month,age,week,dose)] unvax=a[dose==0,.(dead,pop,age,month)] unvax=merge(unvax,base)[,.(dead=sum(dead*frac),pop=sum(pop*frac)),.(age,week,dose)] vax=vax[,.(dead=sum(dead),pop=sum(pop)),.(week,age,dose)] p=rbind(vax[,z:=2],unvax[,z:=1]) p=merge(std,p)[,.(y=sum(dead/pop*std*365e5)),.(x=week,dose,z)] p=merge(vax[,sum(pop),.(week,dose)][V1>=365e2,.(x=week,dose)],p) xstart=0;xend=100;xbreak=0:10*10;ystart=0;yend=4000;ybreak=1:3*1e3 p[,z:=factor(z,,c("Unvaccinated","Vaccinated"))] p[,dose:=factor(paste("Dose",dose))] p=rbind(p,dcast(p,x+dose~z,value.var="y")[,.(x,dose,y=Unvaccinated/Vaccinated,z="Ratio (right axis)")]) yend2=8;secmult=yend/yend2 ggplot(p,aes(x,y))+ facet_wrap(~dose,ncol=1,scales="free_y")+ annotate("rect",xmin=xstart,xmax=xend,ymin=ystart,ymax=yend,linewidth=.4,lineend="square",fill=NA,color="gray70")+ geom_line(aes(color=z,y=ifelse(z==levels(z)[3],y*secmult,y)),linewidth=.6)+ geom_label(data=p[rowid(dose)==1],aes(label=dose),y=yend,x=pmean(xstart,xend),vjust=1,fill="white",label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=.4,color="gray70",size=3.87)+ geom_label(data=p[rowid(dose)==1],aes(label=dose),y=yend,x=pmean(xstart,xend),vjust=1,fill=NA,label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=0,size=3.87)+ labs(title="ASMR by weeks since vaccination in Czech Republic",x=NULL,y=NULL)+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak)+ scale_y_continuous(limits=c(ystart,yend),breaks=ybreak,sec.axis=sec_axis(trans=~./secmult,breaks=1:3*2))+ scale_color_manual(values=c("#5555ff","#ff5555","gray"))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray45"), axis.ticks.length=unit(0,"pt"), legend.background=element_blank(), legend.box="vertical", legend.box.just="right", legend.box.margin=margin(), legend.box.spacing=unit(0,"pt"), legend.direction="horizontal", legend.justification="center", legend.key.height=unit(13,"pt"), legend.key.width=unit(26,"pt"), legend.key=element_rect(fill="white"), legend.margin=margin(,,4), legend.position="top", legend.spacing.x=unit(2,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11), legend.title=element_blank(), panel.grid.major=element_line(linewidth=.4,color="gray90"), panel.background=element_blank(), panel.spacing=unit(0,"pt"), plot.margin=margin(4,14,4,4), plot.subtitle=element_text(size=11,hjust=.5,margin=margin(,,4)), plot.title=element_text(size=11,face="bold",hjust=.5,margin=margin(1,,3)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=4.6,height=4,dpi=300*4)
In the next plot I split people into three groups depending on the month when they got the first vaccine dose. Week 0 consists of the day of vaccination and the next 6 days. People vaccinated in January or February have a peak in deaths on week 2, and people vaccinated in March or April have a peak in deaths on week 3, but the early peak is missing in people vaccinated in May or June. However the baseline also has a much bigger drop during the first 10 weeks for the first two groups and a smaller drop for the third group. However once you plot the deaths as a proportion of the baseline, in all three groups the proportion reaches a plateau around week 20:
t=fread("https://sars2.net/f/czbucketskeep.csv.gz")[dose<=1] t[,age:=pmin(age,95)%/%5*5] a=t[dose==1,.(dead=sum(dead),pop=sum(alive)),.(week,month,age,vaxmonth)] a=merge(a,t[,.(base=sum(dead)/sum(alive)),.(age,month)]) a=a[vaxmonth%like%"2021-0[1-6]"] group=paste0("Vaccinated\n",apply(matrix(month.abb[1:6],2),2,paste,collapse="+")) a[,vaxmonth:=rep(group,each=2)[factor(vaxmonth)]] a=a[,.(dead=sum(dead),base=sum(base*pop)),.(week,vaxmonth)] p=a[,.(x=week,y=c(dead,base),z=factor(rep(1:2,each=.N),,c("Deaths","Baseline")),vaxmonth)] xstart=0;xend=50;xbreak=0:5*10 p=p[x%in%xstart:xend] p[,y:=y/p[z=="Baseline",tapply(y,vaxmonth,mean)][factor(vaxmonth)]*100] p=rbind(p[,facet:=1],a[,.(x=week,vaxmonth,y=dead/base*100,z="Ratio",facet=2)]) p[,facet:=factor(facet,,c("Deaths and baseline (100%\nis average baseline value)","Deaths as percentage of\nbaseline"))] ybreak=pretty(p$y,4);ystart=0;yend=max(ybreak) ggplot(p,aes(x,y))+ facet_grid(vaxmonth~facet)+ annotate("rect",xmin=xstart,xmax=xend,ymin=ystart,ymax=yend,linewidth=.4,lineend="square",fill=NA,color="gray80")+ geom_line(aes(color=z,linewidth=z))+ geom_point(aes(color=z,alpha=z),size=1.2,stroke=0)+ labs(x=NULL,y=NULL,title="Czech FOI data: Deaths by weeks after first dose")+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=ifelse(xbreak==max(xbreak),"",xbreak))+ scale_y_continuous(limits=c(ystart,yend),breaks=ybreak,labels=\(x)ifelse(x==max(ybreak),"",paste0(x,"%")))+ scale_color_manual(values=c("#dd0000","#ffaaaa","gray60"))+ scale_linewidth_manual(values=c(0,0,.5))+ scale_alpha_manual(values=c(1,1,0))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray40",margin=margin(2,2,2,2)), axis.ticks.length=unit(0,"pt"), legend.background=element_blank(), legend.box.spacing=unit(0,"pt"), legend.direction="horizontal", legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(20,"pt"), legend.margin=margin(,,0), legend.position="top", legend.spacing.x=unit(2,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.grid.major=element_line(linewidth=.4,color="gray90"), panel.spacing=unit(3,"pt"), plot.margin=margin(5,5,5,5), plot.subtitle=element_text(margin=margin(,,2),hjust=1), plot.title=element_text(size=11,face=2,hjust=.5,margin=margin(1,,3)), strip.background=element_blank(), strip.text=element_text(size=10.4,margin=margin(2,2,2,2))) ggsave("1.png",width=4.5,height=3.8,dpi=300*4)
When Kirsch first published his KCOR analysis of the Czech data, I told him he should've done the analysis based on mortality rates instead of the raw number of deaths, and he shouldn't have shown simply the ratio between the adjusted unvaccinated and vaccinated mortality, but he should've made a series of plots that first showed what the unvaccinated and vaccinated mortality rates were each week, then what their ratio was, and then what their ratio relative to the baseline period was.
For example among people born in 1950-1954 which Kirsch selected for his initial KCOR analysis, the ratio between unvaccinated and vaccinated mortality rate was about 3.2 in the baseline period but about 2.6 times higher during the whole observation period, so Kirsch said it meant that vaccines had killed about 23% extra people, because he assumed that the ratio between unvaccinated and vaccinated mortality should've remained at a level of about 3.2 indefinitely, but if the ratio later fell lower, it meant that vaccines were killing people. But his analysis was not very transparent because he didn't show the mortality rates anywhere but only the raw number of deaths, so most of his followers probably didn't realize what his claim that vaccines were killing people was based on.
Now he actually fulfilled my request and he did a similar analysis using crude mortality rates:
In a traditional mortality analysis, we simply look how many man weeks people spend in the vaccinated vs. unvaccinated bucket and tally how many people die.
We do this over the non-COVID baseline period to establish relative mortality rates of the two cohorts.
Then we measure the deaths and man-weeks as the cohorts dynamically change (unvaccinated get vaccinated). Then we compare the ratios at the end of 2022.
The calculations summarized below are detailed in this spreadsheet.
![]()
If you look at the row for people born in 1950-1954 in the table above, you can see that the ratio between unvaccinated and vaccinated mortality was about 3.30 in the baseline period but about 2.66 during the whole observation period. So by dividing 3.30 with 2.66, Kirsch go a ratio of 1.24, which he interpreted to mean that vaccines were killing 24% extra people.
His logic is similar to his earlier KCOR analysis, but this time the steps he took to calculate his supposed vaccine harm are more transparent, so it's easier to see how shaky the foundation of his reasoning is.
In the PDF file Kirsch also wrote that the so-called traditional method of using mortality rates is "much less accurate" than KCOR "because the cohorts change in composition over time". But the vaccinated and unvaccinated cohorts do change in reality as well as more people get vaccinated over time. So is it not inaccurate how with the KCOR method he has to misclassify a part of vaccinated people as unvaccinated? It actually results in a fairly large reduction in unvaccinated mortality during the Delta wave, since the vaccinated people who are misclassified as unvaccinated have lower mortality than real unvaccinated people. And another way in which his KCOR method is less accurate than using mortality rates is that KCOR is not adjusted for a higher rate of depletion in the unvaccinated cohort over time due to a higher mortality rate in unvaccinated people.
Kirsch wrote: "What's even worse is that the Arbel study showed the unvaccinated were 10 times more likely to die from COVID, but this was likely due to selection bias - not vaccine protection. In other words, the people who got vaccinated were already much healthier and less likely to die from COVID. So even if the vaccine were 100% effective at preventing COVID death, it was given to the population that was already 10x less likely to die. That means, even with a perfect vaccine, the vaccine could have reduced COVID deaths by just 10%. Since COVID deaths accounted for only about 12% of all-cause mortality (ACM), this implies that - even under perfect conditions - the vaccine could only have reduced the absolute ACM of those who got vaccinated by about 1.2%/yr. That is a negligible benefit."
The paper by Arbel et al. didn't compare vaccinated people against unvaccinated people, but people with 3 doses against people with 2 doses.
Relative to a baseline of people with 2 doses, the people with 3 doses got an odds ratio of about 0.10 for COVID mortality and 0.23 for non-COVID mortality. [https://www.nejm.org/doi/10.1056/NEJMoa2115624, https://www.nejm.org/doi/full/10.1056/NEJMc2306683]
Arbel's odds ratio was adjusted for medical comorbidities, but still Arbel got odds ratio of about 0.23 for non-COVID mortality, which suggests that the adjustment for medical comorbidities was not sufficient to eliminate confounding by HVE.
But did the HVE disproportionately affect risk of COVID deaths so that the odds ratio of 0.10 could be entirely attributed to the HVE? I don't think that's the case, but there is in fact a mechanism of how HVE could disproportionately affect the risk of death from COVID.
People who had a currently documented case of COVID or who were hospitalized with COVID usually did not get an additional vaccine dose until they had recovered. So a common reason why the subjects in Arbel's study remained under the second dose may have been that they were currently infected with COVID, which might partially explain why people with 2 doses had higher COVID mortality than people with 3 doses.
The study included only people aged 60 and above, and it lasted from August 6th 2021 until September 29th 2021, which was the period when the majority of people aged 60 and above got the first booster dose in Israel, but the period of the study also coincided with the weeks when Israel had the highest number of COVID deaths during the Delta wave:
$ wget covid.ourworldindata.org/data/owid-covid-data.csv $ sed '1n;/Israel/!d' owid-covid-data.csv|csvtk -T cut -f date,new_deaths,total_boosters_per_hundred|awk 'NR==1||($2>0&&$1~/2021-0[789]|2021-10/)'|column -t date new_deaths total_boosters_per_hundred 2021-07-11 5 0.0 2021-07-18 12 0.02 2021-07-25 14 0.04 2021-08-01 26 0.49 2021-08-08 75 5.35 # week when study started 2021-08-15 124 10.22 2021-08-22 163 15.77 2021-08-29 193 21.73 2021-09-05 208 28.26 2021-09-12 171 30.54 2021-09-19 146 32.82 2021-09-26 143 34.38 2021-10-03 129 37.73 # week when study ended 2021-10-10 101 39.94 2021-10-17 82 40.88 2021-10-24 45 41.51 2021-10-31 47 42.02
If a similar study would've been done in another country where the booster dose was rolled out in August to September and there was a COVID wave in October to November, and the study lasted from August to November so that most COVID deaths would've occurred after people already had the opportunity to choose whether they got a booster dose or not, it might have reduced a bias where the COVID mortality of people with 2 doses was elevated because people who were currently infected with COVID decided to not get a booster dose.
But anyway, another possible problem with Arbel's study was that the odds ratio was not adjusted for the proportion of observation time at different parts of the observation period. The number of COVID deaths peaked around the middle of the study, and it was higher at the end of the study than the beginning of the study. All subjects in the study started in the group with 2 dose, and people were only added to the 3-dose group after 7 days from the third dose. So people with 2 doses had more observation time in the first half of the study than the second half, and people with 3 doses had more observation time in the second half than the first half.
In the following code I used the English ONS data to calculate an odds ratio for COVID deaths, where I adjusted the ratio for age by including the age group as a categorical variable, and I adjusted the odds ratio for the amount of observation time from different months by including the age as a categorical variable. I included only people aged 50 and above to be consistent with Arbel's study, but I looked at the last 4 months of 2021 instead of only August and September of 2021, because England took longer than Israel to reach a high booster coverage. Now the odds ratio of people with 3 doses relative to people with 2 doses was about 0.08, which was even lower than the ratio of 0.10 in Arbel's study:
t=fread("https://sars2.net/f/ons.csv")[ed==9&age!="Total"&age>=50&month>="2021-09"] a=rbind(t[status%like%"Second"][,dose:=2],t[status%like%"Third|Fourth"][,dose:=3]) a=a[,.(dead=sum(dead),pop=sum(pop)),.(month,age,dose,cause)] a1=a[cause=="Deaths involving COVID-19"] lm=glm(dead~dose+age+month+offset(log(pop)),poisson,a1[month<="2021-12"]) exp(coef(lm))[2] # 0.07897923
When I looked at the odds ratios for each month individually, I noticed that the odds ratio for COVID mortality was very low during the booster rollout in October 2021 to December 2022, but it increased dramatically after January 2022. But I don't know if it's because the booster rollout was over or the COVID wave in the winter was over or both:
a2=a[cause=="All causes"] o1=a1[,.(covidor=exp(coef(glm(dead~dose+age+offset(log(pop)),poisson)))[2]),month] o2=a2[,.(acmor=exp(coef(glm(dead~dose+age+offset(log(pop)),poisson)))[2]),month] o=cbind(o1[,1],round(cbind(o1[,2],o2[,2]),2)) # percentage of people with 3 or more doses out of people with 2 or more doses in ages 50+ o$dose3pct=a1[,round(sum(pop[dose==3])/sum(pop)*100),month]$V1 # percentage of deaths involving COVID out of all deaths in ages 50+ o$covidpctofacm=round(a1[,tapply(dead,month,sum)]/a2[,tapply(dead,month,sum)]*100) print(o,r=F) # month covidor acmor dose3pct covidpctofacm # 2021-09 0.00 0.18 1 6 # 2021-10 0.14 0.27 17 6 # 2021-11 0.08 0.24 49 6 # 2021-12 0.06 0.19 83 5 # 2022-01 0.10 0.21 93 10 # 2022-02 0.19 0.30 93 7 # 2022-03 0.29 0.36 94 7 # 2022-04 0.41 0.42 94 9 # 2022-05 0.33 0.46 94 4 # 2022-06 0.42 0.51 94 3 # 2022-07 0.44 0.54 94 7 # 2022-08 0.40 0.59 94 5 # 2022-09 0.55 0.58 94 3 # 2022-10 0.54 0.62 94 6 # 2022-11 0.51 0.62 94 3 # 2022-12 0.48 0.59 94 4 # 2023-01 0.56 0.64 94 5 # 2023-02 0.67 0.67 94 4 # 2023-03 0.63 0.66 94 6 # 2023-04 0.64 0.66 94 4 # 2023-05 0.79 0.65 94 3 # month covidor acmor dose3pct covidpctofacm
I'll repeat what Kirsch wrote so I can address the error in his arithmetic: "What's even worse is that the Arbel study showed the unvaccinated were 10 times more likely to die from COVID, but this was likely due to selection bias - not vaccine protection. In other words, the people who got vaccinated were already much healthier and less likely to die from COVID. So even if the vaccine were 100% effective at preventing COVID death, it was given to the population that was already 10x less likely to die. That means, even with a perfect vaccine, the vaccine could have reduced COVID deaths by just 10%. Since COVID deaths accounted for only about 12% of all-cause mortality (ACM), this implies that - even under perfect conditions - the vaccine could only have reduced the absolute ACM of those who got vaccinated by about 1.2%/yr. That is a negligible benefit."
Let's suppose there is a country that consists of 9 million healthy people and 1 million unhealthy people. Relative to the healthy people, the unhealthy people have 10 times higher COVID mortality rate and 4 times higher mortality rate from other causes. COVID deaths account for 12% of all deaths in the country, and the country has 100,000 total deaths in a year, so there are 12,000 COVID deaths and 88,000 non-COVID deaths in a year.
By solving the equation x*9e6+10x*1e6=12000
where x
is the yearly COVID mortality rate in healthy people, x
is 12000/19e6
, which is about 0.063%. Similarly the non-COVID mortality rate in healthy people is 88000/13e6
, which is about 0.677%.
So therefore if vaccination was 100% effective in eliminating all COVID deaths, it would reduce all-cause mortality in healthy people by about 9%:
healthycovid=12000/19e6 healthynoncovid=88000/13e6 healthycovid/(healthycovid+healthynoncovid) # 0.08533917
And vaccination would reduce all-cause mortality in the whole population by about 6%:
(healthycovid+healthynoncovid)*9e6+(unhealthycovid+unhealthynoncovid)*1e6 # 100000 (healthynoncovid)*9e6+(unhealthycovid+unhealthynoncovid)*1e6 # 94315.79
The flaw in Kirsch's reasoning was that if healthy people have 10% the COVID mortality risk of unhealthy people, then healthy people would account for 10% of all COVID deaths. But actually the proportion of COVID deaths in healthy people depends on what fraction of the population is healthy.
Kirsch wrote:
The plot below of unvaccinated and vaccinated under 80 years old is from the original KCOR spreadsheet.
This is the most important chart in the entire debate. It cannot be falsified. Many have tried.
- It shows that when we neutralize the frailty differential using naturally matched vax-unvaxxed cohorts, the ENTIRE VACCINE BENEFIT JUST DISAPPEARS.
- It also shows the boosters increased NCACM because right after people in the vaccinated cohort got the booster, their mortality increases; a step discontinuity in slope.
There is no other way to explain this chart and I'll falsify all the possible "explanations" below.
SW's best option is to ignore it and hope you do too. It's devastating. Because the more he tries to explain it, the worse he will look.
So there are two things that are exposed on this one chart:
- The unvaccinated did better than vaccinated during COVID
- When the boosters were given, the vaccinated started dying more
I noticed that if I looked at everyone under 80 years old, I got lucky and the deaths/wk rates of the vaxxed and unvaxxed cohorts selected at the normal Jun 2021 enrollment date happened to match up nearly exactly. No baselines needed. This happens because the vaxxed are older and die more, the unvaxxed are younger and die less, but there are more of them and so the counts equalize.
So these are naturally balanced cohorts. No modeling. No assumptions. No cherry picking. No adjustments. No fitting an exponential curve. No sleight of hand. No tricks. Nothing. Just raw data.
See the chart below.
![]()
Figure. Cumulative mortality in vaxxed v. unvaxxed fixed cohorts under-80s. Cohorts are determined in June, 2021, right before a no-COVID period. Vaxxed and unvaxxed groups were naturally matched throughout the non-COVID and COVID periods. The curves show a sharp post-booster divergence. No model or normalization applied. Note how the unvaxxed died more before COVID, but less during COVID relative to the vaxxed group.
It shows two effects: 1) the unvaxxed died less during COVID, 2) the boosted diverged from the unvaccinated right after the boosters rolled out, 100% consistent with my hypothesis.
So no COVID benefit + significant vaccine harm. And I didn't even need KCOR!
So this is raw cumulative death counts. No baseline. No KCOR algorithm. No adjustments. No nothing.
We started the counters on 6/14/21 when we define the two cohorts based on their vaccination status on that date: you were either vaxxed (1 or more doses) or unvaxxed. It's as simple as it gets.
Here are the important things to note:
- The curves start off with the unvaxxed dying at a slightly higher rate than the vaxxed.
- When COVID starts, the unvaxxed die at a LOWER rate than the vaxxed. Let that sink in. This is the most important part of the whole debate. The unvaxxed did better during COVID than the vaxxed. No camera tricks. No cherry picking. No data errors. The unvaxxed cohort did better than the vaxxed during COVID.
- When the boosters are done rolling out, we observed the mortality of the vaxxed take off like a jet plane off a runway. Boom. That's not selection bias as Saar claims. That is legitimate vaccine harm.
So this is the only plot I really need to win the bet. This single chart alone falsifies the claim that the vaccines were uniformly beneficial. It shows that once baseline differences are neutralized, the unvaccinated fared better during COVID, and boosters triggered a clear mortality increase.
Kirsch wrote: "When COVID starts, the unvaxxed die at a LOWER rate than the vaxxed." But his plot showed raw deaths and not mortality rates, so it's confusing how he spoke of rates, unless he meant the rate of deaths per week.
Vaccinated people also happened to have a higher crude mortality rate than unvaccinated people, because the unvaccinated cohort was bigger than the vaccinated cohort, because Kirsch treated people who were vaccinated on week 25 or later as unvaccinated. But neither raw mortality rates or crude mortality rates are too meaningful if you're looking at cohorts with a vastly different age distribution.
The next plot shows that from the start of the observation period on week 24 of 2021 until the end of available data, the ratio of unvaccinated to vaccinated ASMR remains above 1 each week. The ratio is elevated in summer and fall of 2021 because the HVE is still strong because there are many recently vaccinated people, and the ratio is elevated in the winter of 2021-2022 because unvaccinated people have high COVID mortality. But once the COVID deaths go down and the HVE has become weaker, the ratio between unvaccinated and vaccinated ASMR also starts to fall:
t=fread("Otevrena-data-NR-26-30-COVID-19-prehled-populace-2024-01.csv.gz") t=t[RokNarozeni>="1940"] t[Umrti!=""&DatumUmrtiLPZ=="",DatumUmrtiLPZ:=Umrti] t[Umrti!=""&DatumUmrtiLPZ!=Umrti,Umrti:=DatumUmrtiLPZ] t=t[!(DatumUmrtiLPZ!=""&Datum_Prvni_davka>DatumUmrtiLPZ)] t[,vax:=Datum_Prvni_davka!=""&Datum_Prvni_davka<"2021-24"] t[,born:=ifelse(RokNarozeni>="2000","2000+",RokNarozeni)] t[Datum_Prvni_davka>="2021-24",Datum_Prvni_davka:=""] t2=t[Infekce%in%c(NA,1)] dead=t2[,.(unvaxdead=sum(!vax),vaxdead=sum(vax)),.(week=DatumUmrtiLPZ,born)] coviddead=t[,.(unvaxcoviddead=sum(!vax),vaxcoviddead=sum(vax)),.(week=Umrti,born)] vax=t2[,.(newvax=.N),.(week=Datum_Prvni_davka,born)] a=merge(dead,merge(coviddead,vax,all=T),all=T)[week!=""] a=rbind(a,cbind(do.call(CJ,lapply(a[,1:2],unique)),a[1,-(1:2)][,lapply(.SD,\(x)0)])) a=a[rowid(week,born)==1][order(born,week)] a[is.na(a)]=0 a=merge(t2[,.(startpop=.N),born],a) a[,unvaxpop:=startpop-cumsum(unvaxdead)-cumsum(newvax),born] a[,vaxpop:=cumsum(newvax)-cumsum(vaxdead),born] l=a[,.(week,dead=c(unvaxdead,vaxdead),covid=c(unvaxcoviddead,vaxcoviddead),pop=c(unvaxpop,vaxpop),dose=rep(1:2,each=.N),born)] l=rbind(l,l[,.(dead=sum(dead),pop=sum(pop),covid=sum(covid),dose=0),.(born,week)]) l=l[week>="2021-24"] l=merge(l,l[week=="2022-01",sum(pop),born][,.(std=V1/sum(V1),born)]) a2=l[,.(dead=sum(dead),covid=sum(covid),pop=sum(pop)),.(week,dose)] p1=a2[,.(y=c(dead,dead-covid),type=1:2,facet=1),.(week,dose)] p2=a2[,.(y=c(dead,dead-covid)/pop/7*365e5,type=1:2,facet=2),.(week,dose)] p3=l[,.(y=c(sum(dead/pop*std),sum((dead-covid)/pop*std))/7*365e5,type=1:2,facet=3),.(week,dose)] cum=l[,.(dead=cumsum(dead),covid=cumsum(covid),pop=cumsum(pop),week),.(born,dose,std)] c1=cum[,.(y=c(sum(dead),sum(dead-covid)),type=1:2,facet=1),.(week,dose)] c2=cum[,.(y=c(sum(dead),sum(dead-covid))/sum(pop)/7*365e5,type=1:2,facet=2),.(week,dose)] c3=cum[,.(y=c(sum(dead/pop*std/7*365e5),sum((dead-covid)/pop*std/7*365e5)),type=1:2,facet=3),.(week,dose)] p=rbind(rbind(c1,c2,c3)[,cum:=2],rbind(p1,p2,p3)[,cum:=1]) p[,dose:=factor(dose,,c("Total","Unvaccinated","Vaccinated"))] p[,type:=factor(type,,c("All causes","Not COVID"))] p[,facet:=factor(facet,,c("Deaths","CMR","ASMR"))] p[,cum:=factor(cum,,c("Not cumulative","Cumulative"))] weeks=data.table(date=as.Date("2019-1-1")+(0:3e3))[,week:=format(date,"%G-%V")][rowid(week)==4,setNames(date,week)] p[,x:=weeks[week]] xstart=as.Date("2021-1-1");xend=as.Date("2025-1-1");xbreak=seq(xstart+182,xend,"year");xlab=year(xbreak) ybreak=pretty(c(0,p$y),7);yend=max(ybreak) ggplot(p)+ facet_grid(facet~cum,scales="free")+ geom_vline(xintercept=seq(xstart,xend,"year"),color="gray87",linewidth=.4,lineend="square")+ geom_vline(xintercept=weeks["2021-24"]-3.5,color="gray87",linewidth=.4,linetype="22")+ geom_line(aes(x,y,color=dose,alpha=type),linewidth=.6)+ labs(x=NULL,y=NULL,title="Czech Republic, people born in 1940 or later")+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=xlab)+ scale_y_continuous(limits=\(x)range(pretty(c(0,x),4)),breaks=\(x)pretty(c(0,x),4),labels=\(x)ifelse(x==max(x),"",ifelse(x>=1e3,paste0(x/1e3,"k"),x)))+ scale_color_manual(values=c("black","#66f","#f66"))+ scale_alpha_manual(values=c(1,.4))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray50",margin=margin(3,3,3,3)), axis.ticks.length=unit(0,"pt"), legend.background=element_rect(color="gray87",linewidth=.4), legend.box="vertical", legend.box.just="center", legend.box.margin=margin(,,1), legend.box.spacing=unit(0,"pt"), legend.direction="horizontal", legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(26,"pt"), legend.margin=margin(2.5,5.5,2.5,2.5), legend.position="top", legend.spacing.x=unit(3,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11), legend.title=element_blank(), panel.background=element_blank(), panel.grid.major.x=element_blank(), panel.grid.major.y=element_line(linewidth=.4,color="gray87"), panel.spacing=unit(2,"pt"), plot.margin=margin(4,4,4,4), plot.title=element_text(size=11,face=2,hjust=.5,margin=margin(2,,4)), strip.background=element_blank(), strip.text=element_text(size=11,margin=margin(3,3,3,3))) ggsave("1.png",width=5,height=4,dpi=300*4) sub="The observation period starts on week 24 of 2021. People who received a first dose on week 24 of 2021 or later are counted as unvaccinated. The CMR and ASMR are deaths per 100,000 person-years. The ASMR was calculated by 5-year groups for other years of birth but people born in the 2000s were combined into a single group. The population included in the dataset on week 1 of 2022 was used as the standard population." system(paste0("mogrify -trim 1.png;magick 1.png \\( -size `identify -format %w 1.png`x -font Arial -interline-spacing -3 -pointsize $[44*4] caption:'",gsub("'","'\\\\''",sub),"' -splice x80 \\) -append -resize 25% -bordercolor white -border 24 -dither none -colors 256 1.png"))
Kirsch says that if the ratio between vaccinated and unvaccinated mortality is higher in 2022 than 2021, it means that unvaccinated people did worse than vaccinated people in 2022. But in reality it could also be that unvaccinated people did worse in both 2022 and 2021, but they did even more worse in 2021.
Kirsch wrote: "We started the counters on 6/14/21 when we define the two cohorts based on their vaccination status on that date". June 14th 2021 is the first day of week 24 2021. But Kirsch actually defined the vaccination status at the end of week 24, or on June 20th, because he included vaccine doses administered up to week 24 inclusive of week 24.
Kirsch said that his cohorts were "naturally matched", because they had a similar number of raw deaths during the early part of his observation period. But the cohorts were not matched by population size or age.
In the plot above I didn't reproduce Kirsch's analysis exactly, because I defined the vaccination status at the start of week 24 instead of the end of week 24, I didn't count people with multiple cases multiple times like Kirsch, I excluded people with a year of birth missing, I excluded people with a date of vaccination after a date of death, and I treated the week of COVID death as the week of death for a few people who had a date of death from all causes missing.
Kirsch included his analysis in the sheet "Matched slopes 80 and younger" of the file KCOR_czech.xlsx
. [https://github.com/skirsch/Czech/blob/2bbf02131796e8539a8eb821686452f4cec615a2/analysis/KCOR_czech.xlsx] His sheet has a total of 154,543 deaths in vaccinated people. I was able to reproduce the figure when I didn't exclude rows for duplicate cases, I didn't exclude people with a year of birth missing, and I counted vaccine doses administered up to week 24 of 2021 inclusive of week 24:
t=fread("Otevrena-data-NR-26-30-COVID-19-prehled-populace-2024-01.csv.gz") t[DatumUmrtiLPZ!=""][Datum_Prvni_davka!=""&Datum_Prvni_davka<="2021-24"][RokNarozeni>="1940"|RokNarozeni=="-",.N] # 154543
In the following code I reproduced Kirsch's analysis exactly so that I also reproduced his errors. I calculated the ASMR by the 5-year groups for year of birth so that I used the people included in the dataset on week 1 of 2022 as the standard population (or strictly speaking I counted people with two cases twice in the standard population, but it doesn't make much difference here). But anyway, on week 24 of 2021, unvaccinated people had about 3.8 times higher ASMR than vaccinated people:
t=fread("Otevrena-data-NR-26-30-COVID-19-prehled-populace-2024-01.csv.gz") # people with year of birth in 1940 or later or unknown year of birth t=t[RokNarozeni>="1940"|RokNarozeni=="-"] # treat people vaccinated on week 25 or later as unvaccinated t[,vax:=Datum_Prvni_davka][vax>="2021-25",vax:=""] # combine young age groups to avoid inflation of vaccinated ASMR by a small age group with nonzero deaths t[,born:=ifelse(RokNarozeni>="2000","2000+",RokNarozeni)] # aggregate total deaths and new vaccines by week and age group dead=t[,.(unvaxdead=sum(vax==""),vaxdead=sum(vax!="")),.(week=DatumUmrtiLPZ,born)] vax=t[,.(newvax=.N),.(week=vax,born)] a=merge(dead,vax,all=T)[week!=""] # add rows with 0 deaths and 0 population for missing combinations of age group and week a=merge(do.call(CJ,lapply(a[,1:2],unique)),a,all=T);a[is.na(a)]=0 # total people for each age group (people with two cases are counted twice) a=merge(t[,.(startpop=.N),born],a) # add population sizes a[,unvaxpop:=startpop-cumsum(unvaxdead)-cumsum(newvax),born] a[,vaxpop:=cumsum(newvax)-cumsum(vaxdead),born] # convert to long format l=a[,.(born,week,dead=c(unvaxdead,vaxdead),pop=c(unvaxpop,vaxpop),dose=rep(0:1,each=.N))] # use population on week 1 of 2022 as standard population l=merge(l,l[week=="2022-01",sum(pop),born][,.(born,std=V1/sum(V1))]) # ASMR per 100,000 person-years l[week=="2021-24",.(asmr=sum(dead/pop*std/7*365e5)),dose] # dose asmr # 1 1358.4202 # 2 354.4215
Across all ISO weeks of each year, the ratio between unvaccinated and vaccinated ASMR was about 2.7 in 2021, 2.0 in 2022, 1.6 in 2023, and 1.5 in 2024:
o=l[week>="2021-24",.(dead=sum(dead),pop=sum(pop)),.(year=substr(week,1,4),dose,born,std)] o=o[,.(asmr=sum(dead/pop*std/7*365e5)),.(year,dose)][year==2020&dose==1,asmr:=NA] o=o[,.(unvax=asmr[dose==0],vax=asmr[dose==1]),year] o[,.(year,unvax=round(unvax),vax=round(vax),ratio=round(unvax/vax,2))] # year unvax vax ratio # 2021 1374 502 2.74 # 2022 1178 589 2.00 # 2023 1011 645 1.57 # 2024 816 555 1.47
If the ratio is lower in 2022 than 2021, Kirsch interprets it to mean that vaccinated people are doing worse than unvaccinated people in 2022. But he could just as well use the ratio in 2023 as the baseline, and then because the ratio is higher in 2022 than 2023, he could say that unvaccinated people are doing worse than vaccinated people in 2022.
Kirsch posted this plot that shows deaths per 100,000 person-years by weeks since third dose in Barry Young's New Zealand dataset, and he claimed it showed that vaccines were killing people because the mortality rate was not flat over time:
His plot only included ages 60 and above. The reason why the mortality rate increased between week 0 and 30 was because the healthy vaccinee effect got weaker over time, and also because the rollout of the first booster to ages 60 and above peaked in January to February 2022, but New Zealand had the first big wave of COVID deaths in March 2022.
The reason why the mortality rate started going down after week 27 was because people were removed from the population size after they got a fourth dose, people at the lower end of ages 60 and above were less likely to get a second booster than older people, so the average age of people with only three doses went down after the second booster was rolled out.
The mortality rate of people with 3 doses remains above the baseline mortality rate from week 24 onwards, but it's because the healthy vaccinees moved under the 4th dose, so the people who remained under the 4th dose had elevated mortality because of the straggler effect:
ua=\(x,y,...){u=unique(x);y(u,...)[match(x,u)]} t=fread("https://sars2.net/f/buckets.gz")[dose==3&age>=60] a=t[,.(dead=sum(dead),pop=sum(alive)),.(week,age=pmin(age,95)%/%5*5,month=ua(date,substr,1,7))] nz=fread("https://sars2.net/f/nz_monthly_deaths_by_age.csv") nz[,date:=as.Date(paste0(year_reg,"-",month_reg,"-15"))] nz=nz[ethnicity=="Total",.(dead=sum(count)),.(date,age=as.integer(substr(age_group,1,2))%/%5*5)] nzpop=fread("https://sars2.net/f/nzpopquartermean.csv") nzpop=nzpop[,.(pop=sum(pop)),.(age=age%/%5*5,date=as.Date(paste(year,q*3-1,15,sep="-")))] nz=merge(nz,nzpop[,spline(date,pop,xout=unique(nz$date)),age][,.(age,date=x,pop=y)]) nz=nz[,.(month=substr(date,1,7),base=dead/pop/days_in_month(date),age)] a=merge(a,nz) p1=a[,.(y=`if`(sum(pop)<=365e2,NA_real_,sum(dead)/sum(pop)*365e5),z="Mortality rate per 100,000 person-years"),week] p2=a[,.(y=sum(base*pop)/sum(pop)*365e5,z="Baseline mortality rate"),week] p3=t[,.(y=weighted.mean(age,alive),z="Average age"),week] p4=a[,.(y=sum(pop)/365e2,z="Hundreds of person-years"),week] p=rbind(p1,p2,p3,p4)[,z:=factor(z,unique(z))] yend=5000;ybreak=0:5*1000;yend2=100;ybreak2=0:5*20;secmult=yend/yend2 xstart=0;xend=100;xbreak=0:10*10 leg=p[,.(label=levels(z),hjust=c(0,0,1,1),x=c(2,2,98,98),y=yend*c(.16,.07))] color=c("black","gray60","#bbbb00","#00bb00") p[,ymult:=ifelse(z%in%levels(z)[1:2],y,y*secmult)] ggplot(p)+ annotate("rect",xmin=xstart,xmax=xend,ymin=0,ymax=yend,color="gray70",linewidth=.4,lineend="square",linejoin="mitre",fill=NA)+ geom_line(aes(week,ymult,color=z),linewidth=.6)+ geom_point(aes(week,ymult,color=z),stroke=0,size=1.2)+ geom_label(data=leg,aes(x,y,hjust=hjust,label=label),size=3.87,color=color,label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=.3,fill=alpha("white",.8))+ labs(x=NULL,y=NULL,title="Mortality rate by weeks since third dose in New Zealand, ages 60+")+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak)+ scale_y_continuous(limits=c(ystart,yend),breaks=ybreak,sec.axis=sec_axis(trans=~./secmult,breaks=ybreak2))+ scale_color_manual(values=color)+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray40",margin=margin(2,2,2,2)), axis.ticks=element_line(linewidth=.4,color="gray70"), axis.ticks.length=unit(4,"pt"), legend.position="none", panel.background=element_blank(), plot.title=element_text(size=11.3,hjust=.5,face="bold",margin=margin(1,,6)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5.4,height=3.5,dpi=300*4)
Kirsch wrote:
I was fooled into thinking there was a vaccine benefit because the KCOR charts showed a period during COVID where the slope went negative.
It took me a while to figure that out. KCOR assumes proportional hazards. So it gave the vaccine the benefit of doubt. Contradiction finally resolved!
was COVID a proportional hazard? I don't think it was because I heard that old people had 1000x higher risk of COVID, but the mortality difference between a 20 year old and a 60 year old is only 10x. Is that right?
ChatGPT said:
You're absolutely right - COVID was not a proportional hazard across age groups, and your reasoning is solid.
Here's why:
1. Proportional hazards assumption:
In survival analysis, the proportional hazards assumption means that the hazard ratio between two groups stays constant over time and across covariates (like age). If a disease is a proportional hazard, the relative risk (e.g., hazard ratio) would be stable across groups - say, if everyone had a 3x higher risk due to some factor, regardless of baseline risk.
2. COVID clearly violated this:
- COVID-19 disproportionately impacted older individuals.
- Studies showed the infection fatality rate (IFR) was:
- ~0.001% for children
- ~0.01% for 20-year-olds
- ~1% for 60-year-olds
- ~10-20% for 85+ in some nursing home settings
This means:
- A 60-year-old has ~100x higher COVID death risk than a 20-year-old.
- Yet, for all-cause mortality, a 60-year-old only has about a 10x higher baseline risk than a 20-year-old.
- Implication: COVID was more than proportional
COVID amplified risk nonlinearly with age, far beyond what you'd expect if it were a proportional hazard based on background mortality.
However instead of relying on estimates of IFR, he could've looked up how COVID mortality by age group compares to all-cause mortality. In the United States in 2020-2023, the COVID mortality rate as a percentage of all-cause mortality rate was about 8-9% in all 10-year age groups between 40-49 and 80-89. In ages 30-39 it was only about 5%, and in ages 20-29 it was only about 2%. However younger age groups have a low percentage of deaths from natural causes in general and not only a low percentage of COVID deaths, so the percentage of deaths from natural causes was about 96% in ages 80-89 but only about 24% in ages 20-29:
t=fread("curl -Ls sars2.net/f/vital.csv.xz|xz -dc")[year>=2020] agecut=\(x,y)cut(x,c(y,Inf),paste0(y,c(paste0("-",y[-1]-1),"+")),T,F) t=t[age!=999][,age:=agecut(age,0:9*10)] a=t[,.(covid=sum(ucd[cause=="U071"]),all=sum(ucd),natural=sum(ucd[ua(cause,like,"[A-Q]|U071")])),age] popdead=fread("https://sars2.net/f/uspopdead.csv") a=merge(a,popdead[year%in%2020:2023,.(pop=sum(pop)),.(age=agecut(age,0:9*10))]) o=a[,.(age,all=all/pop*1e5,covid=covid/pop*1e5,natural=natural/pop*1e5)] o[,covidpct:=covid/all*100][,naturalpct:=natural/all*100] cbind(o[,1],round(o[,-1])) # age all covid natural covidpct naturalpct # 0-9 67 0 49 1 72 # 10-19 38 1 10 1 26 # 20-29 124 3 30 2 24 # 30-39 204 9 86 5 42 # 40-49 332 25 220 8 66 # 50-59 683 58 571 9 84 # 60-69 1412 119 1308 8 93 # 70-79 2996 252 2872 8 96 # 80-89 8135 620 7814 8 96 # 90+ 21995 1464 21033 7 96
(In the code above I defined deaths from natural causes as deaths with the underlying cause A-Q or COVID, even though there's also some deaths from natural causes that have an R or U code listed as the underlying cause.)
In the United States in 2020-2023, people aged 60 had only about 11 times higher mortality rate than people aged 20, which is close to Kirsch's estimate of a 10-fold difference, but it's because young people in the United States have a lot of deaths from drug overdoses and other external causes. But for example in the Czech Republic in 2020-2023, people aged 60 had about 21 times higher mortality rate than people aged 20:
cz=fread("https://sars2.net/f/eurostatpopdead.csv.gz")[location=="CZ"] cz[year%in%2020:2023,sum(dead)/sum(pop),age][,V1[age==60]/V1[age==20]] # 20.643
However even in the Czech Republic, COVID deaths accounted for only about 2% of all deaths in people in their 20s in 2020-2023:
um=fread("https://onemocneni-aktualne.mzcr.cz/api/v2/covid-19/umrti.csv") um=um[year(datum)<=2023,.(covid=.N),.(age=agecut(vek,0:9*10))] um=merge(um,cz[,.(dead=sum(dead),pop=sum(pop)),.(age=agecut(age,0:9*10))]) o=um[,.(age,all=dead/pop*1e5,covid=covid/pop*1e5)][,covidpct:=covid/dead*100] cbind(o[,1],round(o[,-1])) # age all covid covidpct # 0-9 30 0 1 # 10-19 18 0 1 # 20-29 48 1 2 # 30-39 88 3 3 # 40-49 195 8 4 # 50-59 538 30 6 # 60-69 1450 115 8 # 70-79 3582 360 10 # 80-89 9956 947 10 # 90+ 27677 2073 7
But again, it's expected for younger age groups to have a low mortality rate for deaths from natural causes relative to the overall mortality rate of the age group. That doesn't mean that within an age group the most frail people would have a disproportionately high risk of dying from COVID relative to dying from other causes. And it doesn't mean that the HVE would explain why unvaccinated people would have a 10 times higher COVID ASMR than vaccinated people but only 3 times higher all-cause ASMR.
Kirsch wrote:
Pfizer MUST increase the absolute NCACM of the recipient by 36% at a minimum because Moderna doesn't reduce absolute NCACM.
Since Pfizer was only 60% of the shots in the US, this means that the mRNA shot increased absolute NCACM by at least 22% (which is .6*.36). That increase lasted at least one year, but it showed little signs of waning after 1 year, declining by only 8.1% after a year.
He linked to a spreadsheet where he digitized a plot from Figure 2 of the Levi-Ladapo paper, so he could calculate the ratio between the cumulative Pfizer risk and Moderna risk. The ratio during the early days doesn't seem reliable because of error introduced by the digitization, because Moderna had negative deaths on days 0 to 7, and the ratio was about -12 on day 7 but about 26 on day 8, so Kirsch omitted the first 15 days from his plot. However later on you can see that the ratio remains at a stable level of about 1.4 (even though the ratio of non-cumulative mortality would of course be less stable):
From the original plot it's not clear if the non-COVID mortality ratio between Pfizer and Moderna is elevated during the early weeks or not: [https://www.medrxiv.org/content/10.1101/2025.04.25.25326460v1]
Levi et al. should've extended their analysis further than 1 year. If the ratio between Pfizer and Moderna mortality risk would've continued to be elevated even in 2023 or 2024, it is not compatible with Kirsch's calculation that Pfizer vaccines increased mortality among the entire US population by 22%, because the United States had close to 0% excess mortality in 2023 and 2024:
t=fread("https://sars2.net/f/uspopdeadmonthly.csv") t=t[year%in%2011:2025][!(year==2025&month>=4)] lm=glm(dead~year+factor(age)+factor(month),poisson,t[year%in%2011:2019],offset=log(persondays)) t$base=predict(lm,t,type="response") a=t[,.(dead=sum(dead),base=sum(base)),date] a=merge(a,dcast(fread("https://sars2.net/f/wondercovidmonthly.csv"),date~type),all=T) a[,date:=as.Date(paste0(date,"-16"))] p=a[,.(x=date,y=c(dead,dead-ucd,dead-mcd,base)/days_in_month(date),z=rep(1:4,each=.N),facet=1)] p=rbind(p,a[,.(x=date,y=(c(dead,dead-ucd,dead-mcd)/base-1)*100,z=rep(1:3,each=.N),facet=2)]) p[,facet:=factor(facet,,c("Deaths divided by\ndays in month","Excess percen-\ntage of deaths"))] p[,z:=factor(z,,c("Deaths","Not UCD COVID","Not MCD COVID","2011-2019 Poisson regression"))] xstart=as.Date("2018-1-1");xend=as.Date("2025-1-1") xbreak=seq(xstart+182,xend,"year");xlab=year(xbreak) p=p[x>=xstart&x<=xend] pct=t[,.(pct=(sum(dead)/sum(base)-1)*100),.(x=as.Date(paste0(year,"-7-1")))] pct=cbind(pct,p[facet==levels(facet)[2],.(y=extendrange(y)[1]),facet]) ggplot(p)+ facet_wrap(~facet,ncol=1,scales="free_y")+ geom_vline(xintercept=seq(xstart,xend,"year"),color="gray92",linewidth=.4)+ geom_segment(data=p[,.(facet=levels(facet)[2])],x=xstart,xend=xend,y=0,yend=0,linewidth=.4,color="gray75")+ geom_point(aes(x,y,color=z,alpha=z),stroke=0,size=1.4)+ geom_line(aes(x,y,color=z),linewidth=.6)+ geom_label(data=p[,extendrange(y)[2],facet],aes(label=facet,y=V1),x=xend,hjust=1,vjust=1,fill="white",label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=.4,color="gray75",size=3.87,lineheight=.85)+ geom_label(data=p[,extendrange(y)[2],facet],aes(label=facet,y=V1),x=xend,hjust=1,vjust=1,fill=NA,label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=.0,size=3.87,lineheight=.85)+ geom_text(data=pct,aes(x,y,label=paste0(ifelse(pct>0,"+",""),sprintf("%.1f",pct),"%")),vjust=.2,size=3.7,color="gray50")+ labs(title="Monthly deaths in United States divided by days in month",x=NULL,y=NULL)+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=xlab)+ scale_y_continuous(limits=\(x)extendrange(x,,c(.05,0)),breaks=\(x)pretty(x),labels=\(x)ifelse(x<1e3,paste0(x,"%"),x))+ scale_color_manual(values=c("black","gray50","gray80","#3333ff"))+ scale_alpha_manual(values=c(1,1,1,0))+ coord_cartesian(clip="off",expand=F)+ guides(color=guide_legend(ncol=2,byrow=F))+ theme(axis.text=element_text(size=11,color="black",margin=margin(2,2,2,2)), axis.ticks=element_line(linewidth=.4,color="gray75"), axis.ticks.length=unit(0,"pt"), axis.title=element_text(size=8), legend.background=element_blank(), legend.box.spacing=unit(0,"pt"), legend.direction="horizontal", legend.justification="center", legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(26,"pt"), legend.margin=margin(,,4), legend.position="top", legend.spacing.x=unit(2,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=11), legend.title=element_blank(), panel.background=element_blank(), panel.border=element_rect(fill=NA,linewidth=.4,color="gray75"), panel.grid.major=element_blank(), panel.grid.major.y=element_line(linewidth=.4,color="gray92"), panel.spacing.y=unit(5,"pt"), plot.margin=margin(4,5,3,4), plot.title=element_text(size=11.3,face=2,margin=margin(1,,3),hjust=.5), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5.4,height=3.4,dpi=300*4)
Also in my plot above there was a total of only about 17% excess deaths in 2021 and 9% in 2022, and most of it was accounted by deaths with the underlying cause COVID, so there doesn't seem to be room for 22% excess deaths caused by Pfizer vaccines.
Kirsch even calculated the percentage of 22% wrong, because he multiplied 36% with the percentage of vaccinated people who got a Pfizer vaccine, even though he should've multiplied 36% with the percentage of total US population that got a Pfizer vaccine (or a percentage by age group weighted by deaths within each age group).