Other parts: ethical.html, ethical2.html.
ES made this plot where for some reason he gets about 68% excess deaths from natural causes in ages 0-5: [https://theethicalskeptic.com/2025/07/29/gen-v-the-vaccinials/]
I don't know what ICD codes he included in his plot. But when I simply looked at chapters A-Q, I got only about 3% excess ASMR in 2024 relative to a 2010-2019 linear trend (even though the ASMR in 2024 was still lower than any previous year except for 2020):
t=fread("https://sars2.net/f/wondernaturalsingle.csv") a=t[age%in%0:5,.(dead=sum(dead)),.(age,year=as.integer(substr(date,1,4)))][year%in%2000:2024] a=merge(a,fread("https://sars2.net/f/uspopdead.csv")[,.(age,year,pop,dead)]) a=fread("https://sars2.net/f/uspopdead.csv")[,.(age,year,pop,dead)][age%in%0:5&year%in%2000:2024] a=merge(a[year==2020,sum(pop),age][,.(age,std=V1/sum(V1))],a) p=a[,.(y=c(sum(dead),sum(pop),sum(dead)/sum(pop)*1e5,sum(dead/pop*std*1e5)),facet=1:4),.(x=year)] p=p[,cbind(.SD,predict(lm(y~x,.SD[x%in%2010:2019]),.SD,interval="prediction",level=.95)),facet] p[,facet:=factor(facet,,c("Deaths","Population","CMR per 100,000","ASMR per 100,000"))] lab=c("Actual","2010-2019 linear trend with 95% PI") lab=factor(lab,unique(lab)) xstart=2000;xend=2024;xbreak=seq(xstart,xend,5) ybreak=pretty(c(0,p[,c(y,lwr,upr)]));ystart=0;yend=max(ybreak) ylim=p[,.(max=max(y,upr)),facet] ggplot(p)+ facet_wrap(~facet,ncol=2,dir="v",scales="free_y")+ geom_rect(data=ylim,aes(ymax=max),ymin=0,xmin=xstart,xmax=xend,lineend="square",linejoin="mitre",fill=NA,color="gray75",linewidth=.4)+ geom_ribbon(aes(x,ymin=lwr,ymax=upr),fill="blue",color="blue",alpha=.2,linewidth=.2)+ geom_line(aes(x,y,color=lab[1]),linewidth=.6)+ geom_line(data=p[x%in%2010:2019],aes(x,fit,color=lab[2]),linewidth=.6)+ geom_line(aes(x,fit,color=lab[2]),linetype="11",linewidth=.6)+ geom_line(aes(x,y,color=lab[1]),linewidth=.6)+ geom_point(aes(x,y,color=lab[1]),stroke=0,size=1.4,show.legend=F)+ geom_label(data=ylim,aes(mean(c(xstart,xend)),max/2,label=facet),size=3.87,label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=.4,fill="white",color="gray75")+ geom_label(data=ylim,aes(mean(c(xstart,xend)),max/2,label=facet),size=3.87,label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=0,fill=NA,)+ labs(title="CDC WONDER, ages 0-5: Deaths with underlying cause A-Q\n(natural causes without COVID or R or X codes)",x=NULL,y=NULL)+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=xbreak)+ scale_y_continuous(limits=\(x)c(0,max(x)),breaks=\(x)pretty(c(0,x)),labels=\(x)ifelse(x==0,"",ifelse(x>=1e3,paste0(x/1e3,"k"),x)))+ scale_color_manual(labels=lab,values=c("black","blue"))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray40"), 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(11,"pt"), legend.key.width=unit(23,"pt"), legend.margin=margin(,,6), 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.title=element_text(size=11,hjust=.5,face="bold",margin=margin(,,4)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5,height=3.8,dpi=300*4)
Next I tried using WebPlotDigitizer to digitize the excess deaths in his plot, so that I was able to closely approximate the weekly number of excess deaths: https://automeris.io/wpd/. Then I reverse engineered his baseline by subtracting the approximated excess deaths from the actual weekly deaths for UCD A-Q. The yellow lines here show that Ethical Skeptic's baseline roughly overlapped with my three baselines in 2019, but the slope of his baseline changed dramatically after 2019:
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/wondervaccinial.csv") t[,dead:=ma(dead,3,2)] t=na.omit(t) t[,date:=MMWRweek::MMWRweek2Date(year,week,4)] t=merge(t,t[year<2020,.(base=mean(dead),base2=mean(dead)),week]) slope=t[year<2020,mean(dead),year][,predict(lm(V1~year),.(year=2018:2025))] slope2=t[year<2020&week%in%15:35,mean(dead),year][,predict(lm(V1~year),.(year=2018:2025))] t[,base:=base*(slope/mean(slope[1:2]))[factor(t$year)]] t[,base2:=base2*(slope2/mean(slope2[1:2]))[factor(t$year)]] t$base3=t[year<2020,predict(lm(dead~date),t)] t$base3=t$base3+t[year<2020,mean(dead-base3),week]$V1[t$week] lab=c("Actual deaths","Baseline with slope determined by total on all weeks","Baseline with slope determined by total on weeks 15 to 35","Linear regression of weekly data with week number residuals added","Reverse engineered baseline of Ethical Skeptic") p=t[,.(x=date,y=c(dead,base,base2,base3,dead-excess),z=factor(rep(lab,each=.N),lab))] p$facet="Deaths" p=rbind(p,merge(p[z!=z[1]],p[z==z[1],.(x,actual=y)])[,.(x,y=(actual/y-1)*100,z,facet="Excess percentage of deaths")]) p[,facet:=factor(facet,unique(facet))] xstart=as.Date("2018-1-1");xend=as.Date("2025-5-1") xbreak=seq(xstart,xend,"6 month");xlab=ifelse(month(xbreak)==7,year(xbreak),"") ylim=p[,{x=extendrange(y,,.03);.(ymin=x[1],ymax=x[2])},facet] ggplot(p)+ facet_wrap(~facet,dir="v",scales="free")+ geom_vline(xintercept=seq(xstart,xend,"year"),color="gray90",linewidth=.4)+ geom_segment(data=p[.N],x=xstart,xend=xend,y=0,yend=0,linewidth=.4,color="gray75")+ geom_rect(data=ylim,aes(ymin=ymin,ymax=ymax),xmin=xstart,xmax=xend,lineend="square",linejoin="mitre",fill=NA,color="gray72",linewidth=.4)+ geom_line(aes(x,y,color=z),linewidth=.5)+ geom_label(data=ylim,aes(xstart+50,(ymin+ymax)/2,label=facet),hjust=0,label.r=unit(0,"pt"),label.padding=unit(5,"pt"),label.size=.4,color="gray75",size=3.8)+ geom_label(data=ylim,aes(xstart+50,(ymin+ymax)/2,label=facet),hjust=0,label.r=unit(0,"pt"),label.padding=unit(5,"pt"),label.size=0,size=3.8,fill=NA)+ labs(x=NULL,y=NULL,title="CDC WONDER, ages 0-5: Deaths with underlying cause A-Q\n(natural causes excluding COVID and R and X codes)")+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=xlab)+ scale_y_continuous(breaks=\(x)pretty(x,7))+ scale_color_manual(values=c("black","blue","#8888ff","#ff6666","#aaaa00"))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray40"), axis.ticks=element_line(linewidth=.4,color="gray75"), axis.ticks.length.x=unit(0,"pt"), axis.ticks.length.y=unit(4,"pt"), legend.background=element_blank(), legend.box.spacing=unit(0,"pt"), legend.direction="vertical", legend.key=element_blank(), legend.key.height=unit(11,"pt"), legend.key.width=unit(23,"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,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.border=element_rect(color="gray75",fill=NA,linewidth=.4), panel.spacing=unit(2,"pt"), plot.title=element_text(size=11,face=2,hjust=.5,margin=margin(,,2)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5.7,height=4.8,dpi=300*4)
The plot by ES might have included R99 deaths where the cause has not yet been specified, because my yellow line has a massive increase in excess deaths in 2025. It might be because I didn't include R codes in my plot, because in July 2025 when I retrieved the data, the percentage of R99 deaths out of A-Q deaths in ages 0-5 was about 10% in January 2025, 12% in February, 19% in March, and 20% in April.
My red and blue baselines are attempts to replicate the methodology used by ES, but they are not accurate measures of the actual trend in mortality, because I also attempted to emulate the flaws of his methodology, so my baselines are fitted against deaths from 2018 and 2019 only, and they are not adjusted for the population size of each age. ES told me that in his plots that display weekly data from 2018 onwards, he fits the baseline using data for only 2018 and 2019. He presumably excludes winter months from the baseline fitting period, but as far as I can tell, he has not mentioned which specific week numbers he excludes from the fitting period, or if he excludes different weeks in different plots.
But in either case, none of my three baselines look anything like his yellow baseline I reverse engineered. My baselines have close to 0% excess deaths on average in 2024, but his baseline has about 50% excess deaths in 2024.
My yellow baseline has on average about 377 deaths per week in the MMWR year 2018 but about 232 deaths per week in the MMWR year 2024. So ES seems to have assumed that deaths in ages 0-5 would've dropped by about 40% between 2018 and 2024.
In the next plot in order to convert Ethical Skeptic's baseline to yearly deaths, I calculated the weekly average deaths for each MMWR year, divided it by 7, and multiplied it by the number of days in the year. It shows how his baseline followed a similar slope as the actual deaths between 2018 and 2019, but it took a sudden dive downwards after 2019:
eth=fread("https://sars2.net/f/wondervaccinial.csv") eth=na.omit(eth)[,.(eth=mean(dead-excess)/7*(365+(year%%4==0))),year][year<2025] t=fread("https://sars2.net/f/wondernaturalsingle.csv")[age<6] t=t[,.(dead=sum(dead)),.(year=as.integer(substr(date,1,4)),age)][year%in%2000:2024] a=t[,.(dead=sum(dead)),year] t=merge(t,fread("https://sars2.net/f/uspopdead.csv")[,.(pop,age,year)]) a=merge(t[,.(dead=sum(dead)),year],eth,all=T) a$base=a[year%in%2010:2019,predict(lm(dead~year),a)] a$base2=t[,.(year,base=predict(lm(dead/pop~year,.SD[year%in%2010:2019]),.SD)*pop),age][,tapply(base,year,sum)] p=a[,.(x=year,y=c(dead,base,base2,eth),z=rep(1:4,each=.N),facet=1)] p=rbind(p,p[,.(x,y=(y[z==1]/y-1)*100,z,facet=2)][z!=1]) p[,z:=factor(z,,c("Actual deaths","2010-2019 linear regression","2010-2019 liner trend for CMR by age times population","Reverse engineered baseline of Ethical Skeptic"))] p[,facet:=factor(facet,,c("Deaths","Excess percentage of deaths"))] xstart=min(p$x);xend=max(p$x) ylim=p[,{x=extendrange(y);.(ymin=x[1],ymax=x[2])},facet] ggplot(p)+ facet_wrap(~facet,dir="v",scales="free_y")+ geom_vline(xintercept=seq(xstart-.5,xend,5),color="gray90",linewidth=.4)+ geom_rect(data=ylim,aes(ymin=ymin,ymax=ymax),xmin=xstart-.5,xmax=xend+.5,lineend="square",linejoin="mitre",fill=NA,color="gray72",linewidth=.4)+ geom_segment(data=ylim[2],y=0,yend=0,x=xstart-.5,xend=xend+.5,linewidth=.4,color="gray70")+ 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,alpha=z,color=z),stroke=0,size=1.4)+ geom_label(data=ylim,aes(label=facet,y=ymax),x=(xstart+xend)/2,hjust=.5,vjust=1,fill="white",label.r=unit(0,"pt"),label.padding=unit(4,"pt"),label.size=.4,color="gray70",size=3.87,lineheight=.8)+ geom_label(data=ylim,aes(label=facet,y=ymax),x=(xstart+xend)/2,hjust=.5,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="CDC WONDER: Deaths with underlying cause A-Q in ages 0-5")+ scale_x_continuous(limits=c(xstart-.5,xend+.5),breaks=xstart:xend)+ scale_y_continuous(breaks=\(x)pretty(x,7),labels=\(x)if(max(x,na.rm=T)<1e3)paste0(x,"%")else paste0(x/1e3,"k"))+ scale_color_manual(values=c("black","blue",hsv(1/3,1,.7),"#aaaa00"))+ scale_alpha_manual(values=c(1,0,0,0,0,0))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray40",margin=margin(2,2,2,2)), axis.text.x=element_text(angle=90,vjust=.5,hjust=1.2), axis.ticks=element_line(linewidth=.4,color="gray70"), axis.ticks.length=unit(4,"pt"), axis.ticks.length.x=unit(0,"pt"), legend.background=element_blank(), legend.box.spacing=unit(0,"pt"), legend.direction="vertical", legend.key=element_blank(), legend.key.height=unit(12,"pt"), legend.key.width=unit(24,"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.border=element_rect(linewidth=.3,fill=NA,color="gray70"), panel.grid.major=element_blank(), panel.spacing=unit(3,"pt"), plot.title=element_text(size=11,face=2,margin=margin(1,,2),hjust=1), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=4.7,height=4.2,dpi=300*4)
Another plot by ES for non-COVID natural cause deaths has this text at the bottom, where R codes are missing from the list of excluded codes: [https://x.com/EthicalSkeptic/status/1950741383410512092/photo/4]
Excludes: U00-U99 (Codes for special purposes) V01-Y89 (External causes of morbidity and mortality) 999--999 (Data not shown due to 25 week lag to account for delays in death certificate completion for certain causes of death.)
But in the same plot the line under the title says "Does not include: CDC Redactions, 999 Hold Period (25 weeks)". So it doesn't mention "RXX" like the vaccinial plot, which says: "Does not include: Pull Forward Effect, CDC Redactions, RXX or 999 Hold". So I guess the vaccinial plot is meant to not include R codes (even though in that case I don't understand why my reverse engineered baseline had a huge drop in 2025).
ES posted this plot for deaths from natural causes in ages 0 to 5: [https://x.com/EthicalSkeptic/status/1950930555836436916]
His "legacy trend" is far too steep, because it appears to represent the trend in 2018-2020, but there was an unusually low number of deaths in 2020. ES says that if 2020 or later years are included in the baseline fitting period, it's a grave sin that he calls "paltering". But he now seems to have succumbed to the sin of paltering himself.
The next plot shows that baselines fitted against 2013-2019 or 2018-2019 are much less steep than Ethical Skeptic's legacy trend:
t=fread("https://sars2.net/f/wondervaccinialnotvtoy.csv") t=merge(t,fread("https://sars2.net/f/uspopdeadmonthly.csv")[,.(year,month,age,pop)])[year>=2013] t[,x:=as.Date(paste(year,month,15,sep="-"))] t[,dead:=dead/days_in_month(x)*7] t=merge(t[,.(x,base=predict(lm(dead/pop~x,.SD[year<2020]),.SD)),age],t) d=t[,.(dead=sum(dead),base=sum(base*pop)),x] d$base2=d[year(x)<2020,predict(lm(dead~x),d)] p=d[,.(x,y=c(dead,base2,base),z=rep(1:3,each=.N))] t=fread("https://sars2.net/f/wondervaccinial.csv")[,dead:=not_v_to_y] t[,x:=MMWRweek::MMWRweek2Date(year,week,4)] t$base=t[year<2020,predict(lm(dead~x),t)] t$base2=t[year<2020&week%in%10:40,predict(lm(dead~x),t)] p=rbind(p,t[,.(x,y=c(dead,base,base2),z=rep(4:6,each=.N))]) p[,z:=factor(z,,c("Monthly deaths / days in month * 7","2013-2019 linear regression of monthly data","2013-2019 trend in CMR by age times population","Weekly deaths","2018-2019 linear regression (all weeks)","2018-2019 linear regression (weeks 10-40)"))] xstart=as.Date("2013-1-1");xend=as.Date("2025-7-1");xbreak=seq(xstart,xend-1,"6 month") xlab=ifelse(month(xbreak)==7,year(xbreak),"") ystart=200;yend=550;ybreak=0:11*50 ggplot(p)+ geom_line(aes(x,y,color=z,linewidth=z))+ geom_point(aes(x,y,color=z,alpha=z),shape=1,stroke=.3,size=.7)+ labs(x=NULL,y=NULL)+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=xlab)+ scale_y_continuous(limits=c(ystart,yend),breaks=ybreak)+ scale_color_manual(values=c("gray50",hsv(12/36,c(1,.4),c(.6,1)),"#aaaa00",hsv(30/36,c(1,.3),c(.6,1))))+ scale_linewidth_manual(values=c(.6,.6,.6,0,.6,.6))+ scale_alpha_manual(values=c(0,0,0,1,0,0))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=10,color="gray50"), axis.ticks=element_line(color=alpha("gray50")), axis.ticks.length=unit(4,"pt"), axis.ticks.x=element_line(color=alpha("gray50",c(1,0))), legend.background=element_blank(), legend.box.spacing=unit(0,"pt"), legend.justification=c(0,0), legend.key=element_blank(), legend.key.height=unit(12,"pt"), legend.key.width=unit(23,"pt"), legend.margin=margin(3,5,3,3), legend.position=c(.017,.1), legend.spacing.x=unit(2,"pt"), legend.spacing.y=unit(0,"pt"), legend.text=element_text(size=10,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.grid=element_blank(), plot.background=element_rect(fill="transparent",color=NA)) ggsave("1.png",width=8,height=2.8,dpi=300*4)
In the plot above I also included R codes, U codes, and 999--999, because my deaths fell short of Ethical Skeptic's deaths when I only included A-Q codes.
The slope of Ethical Skeptic's "emergent trend" doesn't match the actual trend since 2021 either, which has been roughly flat. In fact the deaths went down between 2022 and 2023, and also between 2023 and 2024. The deaths increased by about 5% between 2021 and 2022, but it's partially because COVID deaths were not excluded, and there were more deaths with UCD COVID in 2022 than 2021:
t=fread("https://sars2.net/f/wondervaccinialnotvtoy.csv") o=t[year%in%2018:2024,.(dead=sum(dead)),year] o$coviddead=c(0,0,59,152,251,108,95) # UCD U07.1 in ages 0-5 print(o,r=F) # year dead coviddead # 2018 22365 0 # 2019 21713 0 # 2020 20271 59 # 2021 20579 152 # 2022 21572 251 # 2023 21220 108 # 2024 21021 95
About 80% of all deaths in ages 0-5 occur at age 0. Relative to the pre-COVID linear trend, there was a low number of births in 2020 but there has been a high number of births since 2022, which might partially explain why ages 0-5 had low deaths in 2020 but relatively high deaths since 2022:
t=fread("https://sars2.net/f/wondernatality.csv") t$date=as.Date(paste0(t$year,"-",t$month,"-16")) t$born=t$born/lubridate::days_in_month(t$date) xstart=as.Date("2016-1-1");xend=as.Date("2026-1-1") xbreak=seq(xstart,xend,"6 month") xlab=c(rbind(NA,2016:2025),NA) t=t[t$date>=xstart&t$date<xend,] ylim=extendrange(c(t$born,t$trend)) ybreak=pretty(t$born) t$trend=predict(lm(born~date,subset(t,date>=xstart&date<as.Date("2020-1-1"))),t) yearly=aggregate(t[,c("born","trend")],t[,1,drop=F],sum) yearly=sprintf("%.1f%%",(yearly$born/yearly$trend-1)*100) png("1.png",1825,1100,res=300) par(mar=c(4.2,3,2.1,.8),mgp=c(0,.6,0),adj=0,lend="square") tit="CDC WONDER: monthly births divided by number of days in month" sub="Source: wonder.cdc.gov/natality.html. The gray numbers show the yearly excess percent relative to the baseline." leg=c("Births","2016-2019 linear trend") plot(t$date,t$born,type="n",main=tit,xlab=NA,ylab=NA,xaxs="i",yaxs="i",yaxt="n",xaxt="n",ylim=ylim,xlim=c(xstart,xend),cex.main=1) axis(1,at=xbreak,labels=xlab,tck=0,padj=-.6) axis(2,at=ybreak,labels=paste0(ybreak/1e3,"k"),las=1,tck=-.03) abline(v=seq(xstart,xend,"year"),col="gray90") lines(t$date,t$born,lwd=1.5) points(t$date,t$born,pch=20,cex=.6) lines(t$date,t$trend,type="l",lty=2,lwd=1.5) text(xbreak[c(F,T)],ylim[1],yearly,col="gray60",offset=.4,pos=3,cex=.93) rect(xstart,ylim[1],xend,ylim[2]) mtext(text=sub,side=1,line=2.7,adj=0) legend("topright",legend=leg,lty=c(1,2),lwd=1.5) dev.off()
However ES said that the baseline in his vaccinial plot was fitted against 2018 and 2019 only, and it didn't include 2020: [https://x.com/EthicalSkeptic/status/1950916264928358512]
ES now posted a blog post about the vaccinial plot, and he changed the age range from 0-5 to 0-4: https://theethicalskeptic.com/2025/08/19/houston-we-have-another-problem/. His post included this image where he described his methodology:
He didn't actually describe how he calculated the baseline. But he wrote: "No adjustments are made to this data. It is exactly as extracted from the CDC Wonder Query." I'm still not sure if the change in the slope of his baseline between 2019 and 2020 is because of PFE adjustment, but ES hasn't mentioned doing any PFE adjustment.
ES included this plot from a CDC report in his blog post: [https://theethicalskeptic.com/2025/08/19/houston-we-have-another-problem/, https://www.cdc.gov/nchs/data/nvsr/nvsr74/nvsr74-07.pdf]
The plot was missing 2024, but the next plot shows that the ratio of infant deaths per thousand live births was slightly lower in 2024 than 2023. The decreasing trend in infant mortality in the 2010s seems to have flattened out in the 2020s, but it's not clear if it has anything to do with vaccines, and there was previously a similar flat period around the years 2000 to 2005: [https://wonder.cdc.gov/natality.html]
t=fread("https://sars2.net/f/wondernatality.csv") t=t[,.(born=sum(born)),year] t=rbind(t,list(1995:2002,c(3899589,3891494,3880894,3941553,3959417,4058814,4025933,4021726))) d=fread("https://sars2.net/f/uspopdead.csv")[age==0,.(year,dead)] d=rbind(d,list(1995:1998,c(29583,28487,28045,28371))) p=merge(t,d)[year<2025,.(x=year,y=c(dead,born,dead/born*1e3),z=rep(1:3,each=.N))] p[,z:=factor(z,,c("Infant deaths","Live births","Infant deaths per thousand live births"))] xstart=1995;xend=2024;xbreak=seq(xstart,xend,5) p=p[x%in%xstart:xend] ylim=p[,{x=extendrange(y);.(min=x[1],max=x[2])},z] ggplot(p)+ facet_wrap(~z,ncol=1,dir="v",scales="free")+ geom_rect(data=ylim,aes(ymin=min,ymax=max),xmin=xstart-.5,xmax=xend+.5,lineend="square",linejoin="mitre",fill=NA,color="gray75",linewidth=.4)+ geom_line(aes(x,y),linewidth=.6)+ geom_point(aes(x,y),stroke=0,size=1.5)+ geom_label(data=ylim,aes(xend+.5,max,label=z),vjust=1,hjust=1,label.r=unit(0,"pt"),label.padding=unit(5,"pt"),label.size=.4,size=3.87,fill="white",color="gray80")+ geom_label(data=ylim,aes(xend+.5,max,label=z),vjust=1,hjust=1,label.r=unit(0,"pt"),label.padding=unit(5,"pt"),label.size=0,size=3.87,fill=NA)+ labs(title="Infant mortality at CDC WONDER",x=NULL,y=NULL)+ scale_x_continuous(limits=c(xstart-.5,xend+.5),breaks=xbreak)+ scale_y_continuous(breaks=pretty,labels=kim)+ scale_alpha_manual(values=c(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=element_line(linewidth=.4,color="gray75"), axis.ticks.length.x=unit(0,"pt"), axis.ticks.length.y=unit(4,"pt"), panel.background=element_blank(), panel.grid=element_blank(), panel.spacing=unit(2,"pt"), plot.title=element_text(size=11,hjust=.5,face="bold",margin=margin(1,,4)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=4.6,height=4,dpi=300*4)
Clare Craig posted this thread (where she looked at deaths from all causes, so she didn't exclude external causes or COVID): [https://x.com/ClareCraigPath/status/1958564816877916348]
I can sort of replicate some of this based on CDC data.
@ethicalskeptic has factored in a pull forward effect for later part of graph.
This is the idea that there should be fewer deaths after a period of excess dying.
It is not unreasonable to include that.
![]()
Here is the raw data and trendline.
![]()
Using a baseline of the trend for all of 2018-2020 gets closer to his/hers.
![]()
I pointed out to her that there was an unusually low number of deaths in 2020, and that when I reverse engineered Ethical Skeptic's baseline, the slope of his baseline matched the actual deaths in 2018-2019, but it took a sudden dive downwards between 2019 and 2020, so ES seems to have rather fitted his baseline against 2018-2019 and not 2018-2020, but he applied some additional downwards adjustment to the baseline starting from 2020.
I also pointed out that in 2020-2024 in the United States, about 84% of all deaths in ages 0-4 were at age 0, so the plot by ES mostly shows infant mortality, and therefore it's not reasonable to apply extreme PFE adjustment to the baseline.
ES posted these replies to the thread, where he indicated he did not apply PFE adjustment, and he showed that he included 999–999 codes and he included other U codes except U07 (even though it doesn't make a difference if the other U codes are included or not, because they consist of codes for terrorism and SARS which all had zero deaths): [https://x.com/EthicalSkeptic/status/1958572434690338818]
Clare Craig also got negative excess deaths for ages 1-4: [https://x.com/ClareCraigPath/status/1958601433055391815]
In the next plot that shows a 12-month backwards moving average of monthly data, the deaths per live births starts to increase in mid-2021 and it peaks in mid-2023. The peak might feasibly be due to COVID or vaccines or both:
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/wondernatality.csv") d=fread("https://sars2.net/f/uspopdeadmonthly.csv")[age==0,.(year,month,dead)] t=merge(t,d)[,x:=as.Date(paste0(year,"-",month,"-16"))] t[,born:=ma(born,11)][,dead:=ma(dead,11)] p=t[year%in%2004:2024,.(x,y=c(dead,born,dead/born*1e3),z=rep(1:3,each=.N))] p[,z:=factor(z,,c("Infant deaths","Live births","Infant deaths per 1,000 live births"))] xstart=as.Date("2004-1-1");xend=as.Date("2025-1-1");xbreak=seq(xstart+182,xend,"year") ylim=p[,.(min=min(y),max=max(y)),z] rat=ylim[,max(max/min)] ylim=ylim[,{x=(rat*min-max)/(1+rat);.(min=min-x,max=max+x,z)}] ggplot(p)+ facet_wrap(~z,ncol=1,dir="v",scales="free_y")+ geom_vline(xintercept=seq(xstart,xend,"year"),color="gray90",linewidth=.4)+ geom_rect(data=ylim,aes(ymin=min,ymax=max),xmin=xstart,xmax=xend,lineend="square",linejoin="mitre",fill=NA,color="gray75",linewidth=.4)+ geom_line(aes(x,y),linewidth=.6)+ geom_label(data=ylim,aes(xend,max,label=z),vjust=1,hjust=1,label.r=unit(0,"pt"),label.padding=unit(5,"pt"),label.size=.4,size=3.87,fill="white",color="gray80")+ geom_label(data=ylim,aes(xend,max,label=z),vjust=1,hjust=1,label.r=unit(0,"pt"),label.padding=unit(5,"pt"),label.size=0,size=3.87,fill=NA)+ labs(title="Infant mortality at CDC WONDER (12-month moving average)",x=NULL,y=NULL)+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=year(xbreak))+ scale_y_continuous(breaks=\(x)pretty(x,4),labels=kim)+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray40",margin=margin(2,2,2,2)), axis.text.x=element_text(angle=90,vjust=.5,hjust=1), axis.ticks=element_line(linewidth=.4,color="gray75"), axis.ticks.length.x=unit(0,"pt"), axis.ticks.length.y=unit(4,"pt"), panel.background=element_blank(), panel.grid=element_blank(), panel.spacing=unit(3,"pt"), plot.title=element_text(size=11,hjust=.5,face="bold",margin=margin(1,,4)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5,height=3.6,dpi=300*4)
Younger age groups had a high number of COVID deaths in 2022 and 2021 relative to 2020, so women aged 15-44 had almost as many UCD COVID deaths in 2022 as 2020:
Jean Fisch posted this thread: [https://x.com/Jean__Fisch/status/1958613062971531527]
There is a theory circulating that the 0-4 in the US saw an increase of deaths as of 2021 and "it's the kids of the 1st vaccinated mothers"
If you look at trends, the change happened at the same time for the <1 and the 1-4 yrs old ... who were born in 2017-2020
Not only that ..
![]()
If you could find a way to explain the shift in the 1-4 year old and zoom in on the <1 yr old, you would then have to explain why the shift as of 2021 is most significant in the Census region south, well-known for having the highest vax uptake in the US (not) 😀
![]()
When I looked at deaths per live births relative to a 2010-2019 linear trend, I got the lowest excess infant mortality in the northeastern census region, which probably has the highest vaccination rate:
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/wondernatalityregion.csv")[order(region,year,month)] t=t[,.(born=ma(born,6,5),dead=ma(dead,6,5),year,month),region] t[,x:=as.Date(paste0(year,"-",month,"-16"))] p=t[year%in%2004:2024,.(x,y=dead/born*1e3,z=1,region)] p=rbind(p,p[,.(x,y=predict(lm(y~x,.SD[year(x)%in%2010:2019]),.SD),z=2),region]) p=rbind(p[,facet:=1],p[,.(y=(y[1]/y[2]-1)*100,z=1,facet=2),.(x,region)]) p[,z:=factor(z,,c("Mortality rate","2010-2019 linear trend"))] p[,facet:=factor(facet,,c("Infant deaths per 1,000 live births","Excess infant mortality percentage"))] p[,region:=factor(region,,c("Northeast","Midwest","South","West"))] xstart=as.Date("2004-1-1");xend=as.Date("2025-1-1");xbreak=seq(xstart+182,xend,"year") ylim=p[,{x=extendrange(y,,.07);.(min=x[1],max=x[2])},facet] ggplot(p)+ facet_wrap(~facet,ncol=1,dir="v",scales="free_y")+ geom_vline(xintercept=seq(xstart,xend,"year"),color="gray90",linewidth=.4)+ geom_vline(xintercept=as.Date(paste0(c(2010,2020),"-1-1")),color="gray75",linewidth=.4)+ geom_segment(data=ylim[2],x=xstart,xend=xend,y=0,yend=0,color="gray75",linewidth=.4)+ geom_rect(data=ylim,aes(ymin=min,ymax=max),xmin=xstart,xmax=xend,lineend="square",linejoin="mitre",fill=NA,color="gray75",linewidth=.4)+ geom_line(aes(x,y,color=region,alpha=z),linewidth=.6)+ geom_label(data=ylim,aes(xend,max,label=facet),hjust=1,vjust=1,label.r=unit(0,"pt"),label.padding=unit(4.5,"pt"),label.size=.4,size=3.87,fill="white",color="gray75")+ geom_label(data=ylim,aes(xend,max,label=facet),hjust=1,vjust=1,label.r=unit(0,"pt"),label.padding=unit(4.5,"pt"),label.size=0,size=3.87,fill=NA)+ labs(title="Infant mortality at CDC WONDER (12-month moving average)",x=NULL,y=NULL)+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=year(xbreak))+ scale_y_continuous(breaks=\(x)pretty(x,4),labels=\(x)if(min(x,na.rm=T)<0)paste0(x,"%")else x)+ scale_color_manual(values=c(hcl(225,100,50),hcl(55,70,50),"black",hcl(135,100,50)))+ scale_alpha_manual(values=c(1,.4))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray40"), axis.text.x=element_text(angle=90,vjust=.5,hjust=1), axis.text.y=element_text(margin=margin(,1)), axis.ticks=element_line(linewidth=.4,color="gray75"), axis.ticks.length.x=unit(0,"pt"), axis.ticks.length.y=unit(4,"pt"), legend.background=element_rect(color="gray75",linewidth=.4), legend.box="vertical", legend.box.margin=margin(,,3), legend.box.spacing=unit(0,"pt"), legend.direction="horizontal", legend.key=element_blank(), legend.key.height=unit(12,"pt"), legend.key.width=unit(24,"pt"), legend.margin=margin(3,5,3,3), 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.grid=element_blank(), panel.spacing=unit(3,"pt"), plot.title=element_text(size=11,hjust=.5,face="bold",margin=margin(1,,4)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5,height=4.6,dpi=300*4)
In EU the excess infant mortality rate relative to a 2012-2019 trend was about -2% in 2021, 3% in 2022, and 4% in 2023. But many of the countries with the highest excess infant mortality rate in 2021-2023 were Eastern European countries with a low vaccination rate:
download.file("https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/tps00027?format=TSV","tps00027.tsv") country=fread("code,name NO,Norway SE,Sweden FI,Finland DK,Denmark NL,Netherlands BE,Belgium IE,Ireland DE,Germany CH,Switzerland AT,Austria FR,France PT,Portugal ES,Spain IT,Italy LT,Lithuania PL,Poland CZ,Czechia SK,Slovakia HU,Hungary HR,Croatia RS,Serbia RO,Romania BG,Bulgaria EL,Greece EU27_2020,EU27") t=fread("tps00027.tsv",na=":",head=T) t=t[,.(z=sub(".*,","",t[[1]]),y=unlist(.SD[,-1]),x=rep(2012:2023,each=.N))] t[,y:=as.double(sub(" .*","",y))] t=na.omit(t) p=t[z%in%t[,.N,z][N==max(N),z]] p=p[z%in%country$code] p[,z:=factor(z,country$code,country$name)] p=p[,.(x,y,base=predict(lm(y~x,.SD[x%in%2012:2019]),.SD)),z] xstart=2012;xend=2023;xbreak=seq(xstart,xend,2) yend=p[,max(y,base,na.rm=T)];ybreak=1:5*2 ggplot(p)+ facet_wrap(~z,ncol=5,dir="v")+ geom_line(aes(x,base,linetype="2012-2019 linear trend"),linewidth=.5)+ geom_point(aes(x,y,color=pmax(pmin(y-base,1),-1),shape="Infant mortality rate"),stroke=.6,size=1.5)+ geom_text(data=p[rowid(z)==1],aes(label=z),vjust=1.4,hjust=1,color="black",x=xend,y=yend,size=3.7)+ labs(title="Eurostat: Infant mortality rate (deaths at age 0 per 1,000 live births)",caption="Source: Eurostat dataset tps00027. Countries with data missing\nfor any year or population size below 3 million were omitted.",x=NULL,y=NULL)+ scale_x_continuous(limits=c(xstart-.5,xend+.5),breaks=xbreak)+ scale_y_continuous(breaks=ybreak)+ scale_color_gradientn(colors=c("red","white","#00bb00"),breaks=c(-1,0,1),limits=c(-1,1),guide="none")+ scale_linetype_manual(values=1)+ scale_shape_manual(values=1)+ coord_cartesian(ylim=c(0,yend),clip="off",expand=F)+ guides(shape=guide_legend(order=1),keywidth=unit(10,"pt"))+ theme(axis.text=element_text(size=11,color="gray40",margin=margin(2,2,2,2)), axis.text.x=element_text(angle=90,vjust=.5,hjust=1), axis.text.y=element_text(margin=margin(,3)), axis.ticks=element_line(linewidth=.4), axis.ticks.length=unit(0,"pt"), axis.title=element_text(size=11,face=2), 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(24,"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,vjust=.5), legend.title=element_blank(), panel.background=element_rect(fill="gray75"), panel.grid=element_blank(), panel.grid.major=element_line(linewidth=.4,color="gray70"), panel.spacing=unit(1.5,"pt"), plot.margin=margin(5,5,5,5), plot.caption=element_text(size=11,hjust=.5,margin=margin(5),lineheight=.9), plot.title=element_text(size=11,hjust=.5,face="bold",margin=margin(1,,2)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5.1,height=5,dpi=300*4)
Here ES posted a plot by Clare Craig that used a 2018-2020 baseline, but Craig replied it may have been inaccurate because there was an unusually low number of deaths in 2020, and she posted a version of the same plot with a 2018-2019 baseline. But then when Jikkyleaks said that 2020 should be included in the baseline, ES agreed with him. So I guess it's fine to commit the sin of "paltering" as long as it supports your agenda: [https://x.com/EthicalSkeptic/status/1959031034642932175]
In order to extract the excess deaths in the vaccinial plot, go here: https://automeris.io/wpd/. Click on the first week of the blue line to set the X1 coordinate, and click on the last week of the blue line to set the X2 coordinate, and then click the line of the y-axis at points for -50 and 210, and click "Skip rotation correction". The under mask select the "Pen" tool and highlight the area of the blue line, and select the "Erase" tool and erase the area of other lines. Then change "Algorithm" to "X step", set "ΔX Step" to 0.00265252 which is 1/377
, and click "Run" (because there's 378 weeks from week 8 of 2018 to week 20 of 2025, which is the approximate range of weeks shown in the plot). Then click "View data" and check if you got 378 lines of output, and if not, change the "ΔX Step" parameter until you get exactly 378 lines. Then copy the y-axis values from the output, multiply them by 260 and subtract 50.
In many developing countries the decline in infant mortality rate has become less steep over time, and in some countries the infant mortality rate had already flattened out by the 2010s. So in the United States a 2010-2019 linear baseline might also be too steep by the 2020s relative to the long-term curved trend:
t=setDT(readxl::read_excel("infantmortalitywhocomplete.xlsx",sheet=2,guess_max=Inf)) s=t[Country%like%"^Republic of Korea|United States|Sweden|Japan|Australia|Zeala|Canada|United Kingdom"&Sex=="Both sexes"] p=s[,.(z=Country,y=`Value Numeric`,x=as.integer(Year))][x>=1990] p[z=="United States of America",z:="United States"] p[z=="Republic of Korea",z:="South Korea"] p[z%like%"United King",z:="United Kingdom"] p[,z:=factor(z,p[x==2023][order(-y),z])] xstart=1990;xend=2025;xbreak=seq(xstart,xend-1,5) ylim=c(0,max(p$y)*1.05);ybreak=pretty(ylim,7) ggplot(p)+ annotate("rect",xmin=xstart,xmax=xend,ymin=ylim[1],ymax=ylim[2],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="WHO estimates of infant deaths per 1,000 live births")+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak)+ scale_y_continuous(limits=ylim,breaks=ybreak,labels=kim)+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray45",margin=margin(5,5,5,5)), axis.ticks=element_line(linewidth=.4,color="black"), axis.ticks.length=unit(0,"pt"), legend.background=element_blank(), legend.box.spacing=unit(0,"pt"), legend.justification=c(0,.03), legend.key=element_blank(), legend.key.height=unit(13,"pt"), legend.key.width=unit(26,"pt"), legend.margin=margin(,,,3), legend.position="right", 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.grid.major=element_line(linewidth=.4,color="gray90"), plot.title=element_text(size=11,hjust=0,face=2,margin=margin(,,4))) ggsave("1.png",width=5.4,height=3.3,dpi=300*4)
In England and Wales the number of births in 2021-2023 was above the pre-COVID trend. [https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/deaths/datasets/childmortalitystatisticschildhoodinfantandperinatalchildhoodinfantandperinatalmortalityinenglandandwales] Also the infant mortality rate had already flattened out in the 2010s. In the US the flattening out in the 2020s might be part of a similar long-term curved trend:
download.file("https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/deaths/datasets/childmortalitystatisticschildhoodinfantandperinatalchildhoodinfantandperinatalmortalityinenglandandwales/2023/cim2023deathcohortworkbook.xlsx","cim2023deathcohortworkbook.xlsx") t=setDT(read_excel("cim2023deathcohortworkbook.xlsx",sheet=5,skip=9)) p=t[,.(x=Year,born=`Live births`,dead=`Infant under 1 year`)] p=p[,.(x,y=c(dead,born,dead/born*1e3),z=rep(1:3,each=.N))] p[,z:=factor(z,,c("Deaths at age zero","Live births","Deaths at age zero per 1,000 live births"))] xstart=1990;xend=2023;xbreak=seq(xstart,xend,5) p=p[x%in%xstart:xend] ylim=p[,.(min=min(y),max=max(y)),z] rat=ylim[,max(max/min)] ylim=ylim[,{x=(rat*min-max)/(1+rat);.(min=min-x,max=max+x,z)}] ggplot(p)+ facet_wrap(~z,ncol=1,dir="v",scales="free")+ geom_rect(data=ylim,aes(ymin=min,ymax=max),xmin=xstart-.5,xmax=xend+.5,lineend="square",linejoin="mitre",fill=NA,color="gray75",linewidth=.4)+ geom_line(aes(x,y),linewidth=.6)+ geom_point(aes(x,y),stroke=0,size=1.5)+ geom_label(data=ylim,aes(xend+.5,max,label=z),vjust=1,hjust=1,label.r=unit(0,"pt"),label.padding=unit(5,"pt"),label.size=.4,size=3.87,fill="white",color="gray80")+ geom_label(data=ylim,aes(xend+.5,max,label=z),vjust=1,hjust=1,label.r=unit(0,"pt"),label.padding=unit(5,"pt"),label.size=0,size=3.87,fill=NA)+ labs(title="Infant mortality in England and Wales",x=NULL,y=NULL)+ scale_x_continuous(limits=c(xstart-.5,xend+.5),breaks=xbreak)+ scale_y_continuous(breaks=pretty,labels=kim)+ scale_alpha_manual(values=c(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=element_line(linewidth=.4,color="gray75"), axis.ticks.length.x=unit(0,"pt"), axis.ticks.length.y=unit(4,"pt"), panel.background=element_blank(), panel.grid=element_blank(), panel.spacing=unit(2,"pt"), plot.subtitle=element_text(size=11,hjust=.5,margin=margin(,,4)), plot.title=element_text(size=11,hjust=.5,face="bold",margin=margin(,,4)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=4.6,height=4,dpi=300*4)
When I tried to reproduce the updated version of the vaccinial plot that included ages 0-4 instead of 0-5, I got about 40% excess deaths in 2024, because ES assumed that the baseline number of deaths would've dropped by about 33% between 2019 and 2024, but in reality the deaths dropped by only about 4%:
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/wondervaccinial0to4.csv") t[,dead:=ma(dead,3,2)] t=na.omit(t) t[,date:=MMWRweek2Date(year,week,4)] t=merge(t[year<2020,.(base=mean(dead),base2=mean(dead)),week],t) slope=t[year<2020,mean(dead),year][,predict(lm(V1~year),.(year=2018:2025))] slope2=t[year<2020&week%in%15:35,mean(dead),year][,predict(lm(V1~year),.(year=2018:2025))] t[,base:=base*(slope/mean(slope[1:2]))[factor(t$year)]] t[,base2:=base2*(slope2/mean(slope2[1:2]))[factor(t$year)]] t$base3=t[year<2020,predict(lm(dead~date),t)] t$base3=t$base3+t[year<2020,mean(dead-base3),week]$V1[t$week] t$ave=t[year<2020,mean(dead)] lab=c("Actual deaths","2018-2019 linear regression of deaths on weeks 15-35","Ethical Skeptic's baseline reverse engineered via WebPlotDigitizer","2018-2019 average deaths") p=t[,.(x=date,y=c(dead,base2,dead-excess,ave),z=factor(rep(lab,each=.N),lab))] p$facet="Deaths" p=rbind(p,merge(p[z!=z[1]],p[z==z[1],.(x,actual=y)])[,.(x,y=(actual/y-1)*100,z,facet="Excess percentage of deaths")]) p[,facet:=factor(facet,unique(facet))] xstart=as.Date("2018-1-1");xend=as.Date("2025-5-1") xbreak=seq(xstart,xend,"6 month");xlab=ifelse(month(xbreak)==7,year(xbreak),"") ylim=p[,{x=extendrange(y,,.03);.(ymin=x[1],ymax=x[2])},facet] ggplot(p)+ facet_wrap(~facet,dir="v",scales="free")+ geom_vline(xintercept=seq(xstart,xend,"year"),color="gray90",linewidth=.4)+ geom_segment(data=p[.N],x=xstart,xend=xend,y=0,yend=0,linewidth=.4,color="gray75")+ geom_rect(data=ylim,aes(ymin=ymin,ymax=ymax),xmin=xstart,xmax=xend,lineend="square",linejoin="mitre",fill=NA,color="gray72",linewidth=.4)+ geom_line(aes(x,y,color=z),linewidth=.5)+ geom_label(data=ylim,aes(xstart+50,(ymin+ymax)/2,label=facet),hjust=0,label.r=unit(0,"pt"),label.padding=unit(5,"pt"),label.size=.4,color="gray75",size=3.8)+ geom_label(data=ylim,aes(xstart+50,(ymin+ymax)/2,label=facet),hjust=0,label.r=unit(0,"pt"),label.padding=unit(5,"pt"),label.size=0,size=3.8,fill=NA)+ labs(x=NULL,y=NULL,title="CDC WONDER, ages 0-4: Deaths with underlying cause A-R or 999--999\n(natural causes and R, excluding COVID and external causes)")+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=xlab)+ scale_y_continuous(breaks=\(x)pretty(x,7),labels=\(x)if(max(x,na.rm=T)<100)paste0(x,"%")else x)+ scale_color_manual(values=c("black","#8888ff","#aaaa00",hsv(3/36,.7,.7)))+ coord_cartesian(clip="off",expand=F)+ theme(axis.text=element_text(size=11,color="gray40"), axis.ticks=element_line(linewidth=.4,color="gray75"), axis.ticks.length.x=unit(0,"pt"), axis.ticks.length.y=unit(4,"pt"), legend.background=element_blank(), legend.box.spacing=unit(0,"pt"), legend.direction="vertical", legend.key=element_blank(), legend.key.height=unit(11,"pt"), legend.key.width=unit(23,"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,vjust=.5), legend.title=element_blank(), panel.background=element_blank(), panel.border=element_rect(color="gray75",fill=NA,linewidth=.4), panel.spacing=unit(2,"pt"), plot.title=element_text(size=11,face=2,hjust=.5,margin=margin(,,2)), strip.background=element_blank(), strip.text=element_blank()) ggsave("1.png",width=5.6,height=4.8,dpi=300*4)
The updated version of the plot says that the current excess mortality is 191 deaths per week, which corresponds to 77.3% excess deaths:
By solving x+191=1.773*x
, you get a value of about 247 for the baseline number of deaths. It roughly matches the yellow baseline value on week 20 of 2025 in my previous plot.
In my previous plot I got about 79.6% excess deaths on week 20 of 2025, which roughly matches Ethical Skeptic's figure of 77.3% current excess mortality. He didn't specify which range of weeks his current excess mortality applied to. So it didn't necessarily correspond to the point for week 20, which was an average of weeks 17 to 22.
Jikkyleaks also said that Ethical Skeptic should document his methodology, and he got about 6% lower deaths in ages 0-4 in 2024 than 2018 (even though he looked at deaths from all causes): [https://x.com/Jikkyleaks/status/1958016656573362408]
And canceledmouse said that Ethical Skeptic's plot is "entirely contestable" and "nonsensical fear porn": [https://x.com/canceledmouse/status/1958015548685525389]
The next plot shows Ethical Skeptic's baby Holocaust in a long-term context. The flattening out in the 2020s is consistent with the long-term trend reaching an asymptote (even though the US still has a very high infant mortality compared to other developed countries, so further decline might be expected):
t=fread("https://sars2.net/f/wonderinfantdeadpop.csv") p1=t[,.(x=year,y=dead/pop*1e3,z=1,fit=T)] p2=copy(p1)[,z:=2][,fit:=x%in%2015:2019] p2$y=predict(lm(y~x,p2[fit==T]),p2) p3=copy(p1)[,z:=3][,fit:=x<2020] p3$y=p3[fit==T,predict(smooth.spline(x,y,spar=.8),p3$x)]$y p=rbind(p1,p2,p3) p[,z:=factor(z,,c("Deaths per population","2015-2019 linear trend","1968-2019 smoothed spline"))] xstart=1968-.5;xend=2024+.5;xbreak=seq(1970,xend,10) ylim=p[,{x=extendrange(y);.(min=x[1],max=x[2])}] ggplot(p)+ geom_rect(data=ylim,aes(ymin=min,ymax=max),xmin=xstart,xmax=xend,lineend="square",linejoin="mitre",fill=NA,color="gray72",linewidth=.4)+ geom_line(aes(x,y,color=z),linetype="11",linewidth=.6)+ geom_line(data=p[fit==T],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.2)+ labs(title="CDC WONDER: Deaths at age 0 per thousand children aged 0",x=NULL,y=NULL)+ scale_x_continuous(limits=c(xstart,xend),breaks=xbreak)+ scale_color_manual(values=c("black","blue","#ff88ff"))+ scale_alpha_manual(values=c(1,0,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_rect(color="gray70",linewidth=.4), legend.box.spacing=unit(0,"pt"), legend.direction="vertical", legend.justification=c(1,1), legend.key=element_blank(), legend.key.height=unit(12,"pt"), legend.key.width=unit(24,"pt"), legend.margin=margin(3,5,3,3), legend.position=c(1,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=element_blank(), panel.grid.major=element_line(linewidth=.4,color="gray90"), plot.subtitle=element_text(hjust=.5,margin=margin(,,4)), plot.title=element_text(size=11,hjust=.5,face="bold",margin=margin(,,4))) ggsave("1.png",width=5,height=3,dpi=300*4)
ES claimed that cancer ASMR values reported by SEER were incorrect because the Census Bureau's population estimates were not valid. He pointed out how the population size of ages 72-100 had increased faster in 2020-2024 than earlier years even though there was a high number of COVID deaths in 2020-2024. But after I pointed out it was because baby boomers turning 72, Grok agreed with me and said that SEER's ASMR values were valid: [https://x.com/grok/status/1953824913208619454]