Comments to Ethical Skeptic (part 4) - sars2.net

Other parts: ethical.html, ethical2.html, ethical3.html (deaths in ages 0-4).

Contents

Cancer diagnoses in England per population aged 65 and above

ES made this plot of cancer incidence in England: [https://x.com/EthicalSkeptic/status/1966911244859842912/photo/3]

Based on the next plot, there wasn't any clear increase in the age-standardized cancer rate incidence above the pre-COVID trend in 2022, and the age-standardized incidence rate remained roughly flat in 2015-2019, so there wasn't a big drop between 2018 and 2019 like in the plot by ES: [https://researchbriefings.files.parliament.uk/documents/SN06887/SN06887.pdf]

ES used a dataset of rapid cancer registration data published by the National Disease Registration Service of England (NDRS), which only goes back to 2018. [https://nhsd-ndrs.shinyapps.io/rcrd/] It includes one set of data adjusted for the number of working days per week and another set of unadjusted data. ES didn't specify which of them he used, but I used the unadjusted data below.

I believe ES got the proportion of population aged 65 and above from an interactive browser on the website of ONS. [https://www.ons.gov.uk/explore-local-statistics/indicators/percentage-of-the-population-aged-65-plus] It didn't have a category for England but only for the whole UK, and even UK was missing data for 2024 and 2025. However the same population estimate data can be queried from Nomis, where you can select the region as England only, and data for 2024 is not missing: [https://www.nomisweb.co.uk/query/asv2htm]

I used WebPlotDigitizer to digitize the data in Ethical Skeptic's plot. [https://automeris.io/wpd/] I then converted his rate of cases per population of ages 65+ to the number of new cases by multiplying his rate with the yearly population estimates of people aged 65+ and dividing the result by 100,000.

The dark blue line in the next plot show that in the raw data from the rapid registration dashboard, the slope of the trend in 2018-2019 is similar to the trend in 2021-2024. But ES seems to have somehow manually altered the data so that he exaggerated the decrease between 2018 and 2019, and he also exaggerated the increase between 2021 and 2024:

pop=CJ(year=2018:2024)
pop$o65=c(10082761,10243221,10332210,10469044,10630852,10787479,10981092)

rapid=CJ(year=2018:2025,month=1:12)[!(year==2025&month>5)]
rapid$cases=c(25420,22367,24346,24756,27661,26373,27063,26412,23765,26877,25734,22828,26367,23661,24873,25042,26401,24756,27422,25043,24770,27640,24966,24232,26324,24401,25990,16105,15604,19236,21692,20787,24272,24738,24274,24592,22733,22413,26691,25237,25099,27013,26909,25425,26707,25801,27161,25658,24526,25063,28286,24763,28176,26068,26549,27780,26984,26615,28584,24932,26944,25628,29243,24129,27882,28516,26845,27921,26579,27733,29447,25191,29054,27699,27453,28654,29560,27537,30900,27783,27948,30455,27565,26942,29190,26915,27960,27074,26432)
p1=rapid[,.(x=as.Date(paste(year,month,16,sep="-")),y=cases)]
p1$z="Raw data"

p2=copy(p1)
p2[,y:=y/pop$o65[match(pmin(2024,year(x)),pop$year)]*pop[year==2020,o65]]
p2$z="Raw data / 65+ pop of year * 65+ pop of 2020"

es=CJ(year=2018:2025,month=1:12)[!(year==2025&month>4)]
es$rate=c(238.5,235.1,236.3,240.7,246.2,248.9,251.3,253.7,255.6,255.1,252.0,248.4,244.5,236.8,229.8,222.1,217.8,212.4,206.9,205.4,205.9,205.0,203.5,202.1,202.6,206.3,211.0,213.2,205.4,198.7,191.9,185.7,178.9,176.0,182.1,191.9,201.1,210.5,213.7,215.1,219.2,223.8,226.2,228.4,231.0,232.9,233.4,231.2,230.1,230.1,231.0,231.7,233.7,236.6,239.2,241.1,242.1,242.6,243.6,242.3,241.1,239.7,241.6,243.6,245.5,249.8,253.0,254.4,254.2,254.2,253.2,250.8,249.3,250.3,252.5,254.7,259.2,266.7,270.1,272.0,272.5,272.5,271.1,269.1,266.2,267.2,269.6,270.8)

p3=es[,.(x=as.Date(paste(year,month,16,sep="-")),y=rate*pop$o65[match(pmin(year,2024),pop$year)]/1e5)]
p3$z="Ethical Skeptic's plot reverse engineered with WebPlotDigitizer"

p=rbind(p1,p2,p3)[,z:=factor(z,unique(z))]

xstart=as.Date("2018-1-1");xend=as.Date("2025-7-1");xbreak=seq(xstart+182,as.Date("2025-1-1"),"year")
ybreak=pretty(c(0,p$y));ystart=0;yend=max(ybreak)

ggplot(p)+
geom_vline(xintercept=seq(xstart,xend,"year"),color="gray90",linewidth=.4)+
annotate("rect",xmin=xstart,xmax=xend,ymin=ystart,ymax=yend,linewidth=.4,lineend="square",linejoin="mitre",fill=NA,color="gray75")+
geom_line(aes(x,y,color=z),linewidth=.6)+
labs(x=NULL,y=NULL,title="Monthly cancer diagnoses in England rapid registration data")+
scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=year(xbreak))+
scale_y_continuous(limits=c(ystart,yend),breaks=ybreak,labels=\(x)ifelse(x>=1e3,paste0(x/1e3,"k"),x))+
scale_color_manual(values=c(hsv(22/36,c(1,.6),c(.6,1)),"#aaaa00"))+
coord_cartesian(clip="off",expand=F)+
guides(color=guide_legend(ncol=1,byrow=F))+
theme(axis.text=element_text(size=11,color="gray40"),
  axis.text.y=element_text(margin=margin(,1.5)),
  axis.ticks=element_line(linewidth=.4,color="gray75"),
  axis.ticks.length=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(12,"pt"),
  legend.key.width=unit(24,"pt"),
  legend.margin=margin(-2,,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(),
  plot.title=element_text(size=11,hjust=.5,face=2,margin=margin(,,4)))
ggsave("1.png",width=5.1,height=3.2,dpi=300*4)

When I calculated yearly sums of the monthly data shown in the plot above, the incidence increased by about 0.5% between 2018 and 2019 in the dark blue line, decreased by about 1.0% in the light blue line, and decreased by about 11% in the yellow line.

In the original data that I digitized from Ethical Skeptic's plot, the rate of new cases per 100,000 people aged 65 and above dropped by about 12% between 2018 and 2019:

es=CJ(year=2018:2025,month=1:12)[1:88]
es$rate=c(238.5,235.1,236.3,240.7,246.2,248.9,251.3,253.7,255.6,255.1,252.0,248.4,244.5,236.8,229.8,222.1,217.8,212.4,206.9,205.4,205.9,205.0,203.5,202.1,202.6,206.3,211.0,213.2,205.4,198.7,191.9,185.7,178.9,176.0,182.1,191.9,201.1,210.5,213.7,215.1,219.2,223.8,226.2,228.4,231.0,232.9,233.4,231.2,230.1,230.1,231.0,231.7,233.7,236.6,239.2,241.1,242.1,242.6,243.6,242.3,241.1,239.7,241.6,243.6,245.5,249.8,253.0,254.4,254.2,254.2,253.2,250.8,249.3,250.3,252.5,254.7,259.2,266.7,270.1,272.0,272.5,272.5,271.1,269.1,266.2,267.2,269.6,270.8)
round(es[,.(rate=mean(rate)),year][,pctchange:=(rate/shift(rate)-1)*100])
# year rate pctchange
# 2018  247        NA
# 2019  216       -12
# 2020  195       -10
# 2021  222        14
# 2022  237         7
# 2023  248         5
# 2024  263         6
# 2025  268         2

A drop of 11% or 12% between 2018 and 2019 seems completely unrealistic, and it's inconsistent with the real data. However it is consistent with Ethical Skeptic's history of falsifying data. I have previously busted him outright falsifying data in the SV40 cancer wave plot, vaccinial plot, plot for cancer deaths in ages 0-54, and plot for MCD to UCD cancer ratio.

The next plot also shows how the difference between the pre-2020 and post-2020 slopes is greatly exaggerated by Ethical Skeptic's fake data:

pop=CJ(year=2018:2024)
pop$o65=c(10082761,10243221,10332210,10469044,10630852,10787479,10981092)

rapid=CJ(year=2018:2025,month=1:12)[!(year==2025&month>5)]
rapid$cases=c(25420,22367,24346,24756,27661,26373,27063,26412,23765,26877,25734,22828,26367,23661,24873,25042,26401,24756,27422,25043,24770,27640,24966,24232,26324,24401,25990,16105,15604,19236,21692,20787,24272,24738,24274,24592,22733,22413,26691,25237,25099,27013,26909,25425,26707,25801,27161,25658,24526,25063,28286,24763,28176,26068,26549,27780,26984,26615,28584,24932,26944,25628,29243,24129,27882,28516,26845,27921,26579,27733,29447,25191,29054,27699,27453,28654,29560,27537,30900,27783,27948,30455,27565,26942,29190,26915,27960,27074,26432)
p1=rapid[,.(x=as.Date(paste(year,month,16,sep="-")),y=cases)]
p1$z="Raw data"

es=CJ(year=2018:2025,month=1:12)[1:88]
es$rate=c(238.5,235.1,236.3,240.7,246.2,248.9,251.3,253.7,255.6,255.1,252.0,248.4,244.5,236.8,229.8,222.1,217.8,212.4,206.9,205.4,205.9,205.0,203.5,202.1,202.6,206.3,211.0,213.2,205.4,198.7,191.9,185.7,178.9,176.0,182.1,191.9,201.1,210.5,213.7,215.1,219.2,223.8,226.2,228.4,231.0,232.9,233.4,231.2,230.1,230.1,231.0,231.7,233.7,236.6,239.2,241.1,242.1,242.6,243.6,242.3,241.1,239.7,241.6,243.6,245.5,249.8,253.0,254.4,254.2,254.2,253.2,250.8,249.3,250.3,252.5,254.7,259.2,266.7,270.1,272.0,272.5,272.5,271.1,269.1,266.2,267.2,269.6,270.8)
p3=es[,.(x=as.Date(paste(year,month,16,sep="-")),y=rate*pop$o65[match(pmin(year,2024),pop$year)]/1e5)]
p3$z="Ethical Skeptic's plot reverse engineered with WebPlotDigitizer"

p=rbind(p1,p3)[,z:=factor(z,unique(z))]

lm=rbind(cbind(p,type=2)[,fit:=year(x)%in%2018:2019],cbind(p,type=3)[,fit:=year(x)%in%2021:2024])
lm=lm[,.(x,y=predict(lm(y~x,.SD[fit==T]),.SD),fit),.(z,type)]
p=rbind(p[,fit:=T][,type:=1],lm)

p[,type:=factor(type,,c("Actual","2018-2019 trend","2021-2024 trend"))]

xstart=as.Date("2018-1-1");xend=as.Date("2025-7-1");xbreak=seq(xstart+182,as.Date("2025-1-1"),"year")
ybreak=pretty(c(0,p$y));ystart=0;yend=max(ybreak)

ggplot(p)+
facet_wrap(~z,ncol=1,dir="v",scales="free_x")+
geom_vline(xintercept=seq(xstart,xend,"year"),color="gray90",linewidth=.4)+
annotate("rect",xmin=xstart,xmax=xend,ymin=ystart,ymax=yend,linewidth=.4,lineend="square",linejoin="mitre",fill=NA,color="gray75")+
geom_line(aes(x,y,color=type),linewidth=.6,linetype="11")+
geom_line(data=p[fit==T],aes(x,y,color=type),linewidth=.6)+
labs(x=NULL,y=NULL,title="Monthly cancer diagnoses in England rapid registration data")+
scale_x_continuous(limits=c(xstart,xend),breaks=xbreak,labels=year(xbreak))+
scale_y_continuous(limits=c(ystart,yend),breaks=ybreak,labels=\(x)ifelse(x>=1e3,paste0(x/1e3,"k"),x))+
scale_color_manual(values=c("black",hsv(1/3,1,.7),hsv(0,.7,1)))+
scale_alpha_manual(values=c(1,.4,.4))+
coord_cartesian(clip="off",expand=F)+
guides(alpha="none")+
theme(axis.text=element_text(size=11,color="gray40"),
  axis.text.y=element_text(margin=margin(,1.5)),
  axis.ticks=element_line(linewidth=.4,color="gray75"),
  axis.ticks.length=unit(0,"pt"),
  axis.ticks.length.y=unit(4,"pt"),
  legend.background=element_blank(),
  legend.box.spacing=unit(0,"pt"),
  legend.key=element_blank(),
  legend.key.height=unit(12,"pt"),
  legend.key.width=unit(24,"pt"),
  legend.margin=margin(-2,,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.spacing.y=unit(3,"pt"),
  plot.title=element_text(size=11,hjust=.5,face=2,margin=margin(,,4)),
  strip.background=element_rect(fill="gray90",color="gray75",linewidth=.4),
  strip.text=element_text(size=11,margin=margin(3,,3)))
ggsave("1.png",width=5,height=4,dpi=300*4)

Yearly cancer incidence data is available from the NHS publication "Cancer Registration Statistics, England, 2022": https://digital.nhs.uk/data-and-information/publications/statistical/cancer-registration-statistics/england-2022#resources (file "Cancer Registration Statistics, updated to use 2021 census population estimates").

Without any kind of adjustment for population size or age, the yearly number of cases increased by only about 3% between 2019 and 2022. In Ethical Skeptic's plot the rate of new cases per population aged 65 and above increased by about 10% between 2019 and 2022, even though the adjustment for population size should make the percentage smaller and not bigger:

t=fread("https://sars2.net/f/Table_1_machine_readable_updated_June2025.csv.gz")
t=t[stage_at_diagnosis=="All stages"&imd_quintile=="All quintiles"&gender=="Persons"]
t=t[hormone_receptor%in%c("","All")&hormone_receptor_status%in%c("","All")] # `All` is for breast cancer, empty is for other cancers
t=t[ndrs_detailed_group%like%"^All|ALL"]
print(t[,.(cases=sum(count)),.(year=diagnosisyear)],r=F)
# year  cases
# 2013 491633
# 2014 506390
# 2015 521302
# 2016 532723
# 2017 536826
# 2018 554847
# 2019 565363
# 2020 486232
# 2021 551173
# 2022 582160 # about 3% higher than 2019

Here I overlaid the data from the NHS report over the rapid registration data, where you can see that the rapid registration data is missing almost half of all cases:

y=fread("https://sars2.net/f/Table_1_machine_readable_updated_June2025.csv.gz")
y=y[stage_at_diagnosis=="All stages"&imd_quintile=="All quintiles"&gender=="Persons"]
y=y[hormone_receptor%in%c("","All")&hormone_receptor_status%in%c("","All")] # `All` is for breast cancer, empty is for other cancers
y=y[ndrs_detailed_group%like%"^All|ALL"]
p1=y[,.(y=sum(count)),.(x=diagnosisyear)][,.(x=as.Date(paste0(x,"-7-1")),y=y/(365+(x%%4==0)))]
p1$z="Cancer Registration Statistics, England, 2022"

rapid=CJ(year=2018:2025,month=1:12)[!(year==2025&month>5)]
rapid$cases=c(25420,22367,24346,24756,27661,26373,27063,26412,23765,26877,25734,22828,26367,23661,24873,25042,26401,24756,27422,25043,24770,27640,24966,24232,26324,24401,25990,16105,15604,19236,21692,20787,24272,24738,24274,24592,22733,22413,26691,25237,25099,27013,26909,25425,26707,25801,27161,25658,24526,25063,28286,24763,28176,26068,26549,27780,26984,26615,28584,24932,26944,25628,29243,24129,27882,28516,26845,27921,26579,27733,29447,25191,29054,27699,27453,28654,29560,27537,30900,27783,27948,30455,27565,26942,29190,26915,27960,27074,26432)
p2=rapid[,.(x=as.Date(paste(year,month,16,sep="-")),y=cases)][,y:=y/days_in_month(x)]
p2$z="Rapid registration data"

p3=copy(p2)
p3[,y:=y/pop$o65[match(pmin(2024,year(x)),pop$year)]*pop[year==2020,o65]]
p3$z="Rapid registration data / 65+ pop of year * 65+ pop of 2020"

pop=CJ(year=2018:2024)
pop$o65=c(10082761,10243221,10332210,10469044,10630852,10787479,10981092)
es=CJ(year=2018:2025,month=1:12)[1:88]
es$rate=c(238.5,235.1,236.3,240.7,246.2,248.9,251.3,253.7,255.6,255.1,252.0,248.4,244.5,236.8,229.8,222.1,217.8,212.4,206.9,205.4,205.9,205.0,203.5,202.1,202.6,206.3,211.0,213.2,205.4,198.7,191.9,185.7,178.9,176.0,182.1,191.9,201.1,210.5,213.7,215.1,219.2,223.8,226.2,228.4,231.0,232.9,233.4,231.2,230.1,230.1,231.0,231.7,233.7,236.6,239.2,241.1,242.1,242.6,243.6,242.3,241.1,239.7,241.6,243.6,245.5,249.8,253.0,254.4,254.2,254.2,253.2,250.8,249.3,250.3,252.5,254.7,259.2,266.7,270.1,272.0,272.5,272.5,271.1,269.1,266.2,267.2,269.6,270.8)
p4=es[,.(x=as.Date(paste(year,month,16,sep="-")),y=rate*pop$o65[match(pmin(year,2024),pop$year)]/1e5)]
p4[,y:=y/days_in_month(x)]
p4$z="Ethical Skeptic's plot reverse engineered with WebPlotDigitizer"

p=rbind(p1,p2,p3,p4)[,z:=factor(z,unique(z))]

xstart=as.Date("2013-1-1");xend=as.Date("2025-7-1");xbreak=seq(xstart+182,as.Date("2025-1-1"),"year")
ybreak=pretty(c(0,p$y),7);ystart=0;yend=max(ybreak)

ggplot(p)+
geom_vline(xintercept=seq(xstart,xend,"year"),color="gray90",linewidth=.4)+
annotate("rect",xmin=xstart,xmax=xend,ymin=ystart,ymax=yend,linewidth=.4,lineend="square",linejoin="mitre",fill=NA,color="gray75")+
geom_point(aes(x,y,color=z,alpha=z),size=1.4,stroke=0)+
geom_line(aes(x,y,color=z),linewidth=.6)+
labs(x=NULL,y=NULL,title="New cancer diagnoses in England (divided by number of\ndays in year or month)")+
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(hsv(1/3,1,.6),hsv(22/36,c(1,.6),c(.6,1)),"#aaaa00"))+
scale_alpha_manual(values=c(1,0,0,0))+
coord_cartesian(clip="off",expand=F)+
guides(color=guide_legend(ncol=1,byrow=F))+
theme(axis.text=element_text(size=11,color="gray40"),
  axis.text.y=element_text(margin=margin(,1.5)),
  axis.ticks=element_line(linewidth=.4,color="gray75"),
  axis.ticks.length=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(12,"pt"),
  legend.key.width=unit(24,"pt"),
  legend.margin=margin(-2,,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(),
  plot.subtitle=element_text(size=11,hjust=.5,margin=margin(,,4)),
  plot.title=element_text(size=11,hjust=.5,face=2,margin=margin(,,4)))
ggsave("1.png",width=5.3,height=3.6,dpi=300*4)

The website of the NHS says: "The Rapid Cancer Registration Data contains proxy tumour registrations and some associated events on the cancer patient pathway (e.g. surgery, radiotherapy and systemic anti-cancer therapy data) from January 2018 to the most recently available data on cancer diagnoses. RCRD provides a quicker, indicative source of cancer data compared to the National Cancer Registration Data (NCRD), which is the 'gold-standard' registration data set and which relies on additional data sources, enhanced follow-up with trusts and expert processing by cancer registration officers. Due to the lower quality of RCRD, the data will not match the eventual National Statistics published on the full NCRD." [https://digital.nhs.uk/ndrs/data/data-sets/rcrd]

A document titled "Rapid Cancer Registration Dataset - Data Quality - August 2025" says: [https://digital.nhs.uk/ndrs/data/data-sets/rcrd]

This document outlines the main features of the data to be aware of when interpreting the Rapid Cancer Registration Dataset:

Many types of non-malignant neoplasms are also excluded: "Covers all malignant cancers (excl. NMSC) and selected non-malignant cancers: Breast, Bladder & Brain (ICD-10 C00-C97 excl. C44, plus D05, D09, D32, D33, D35, D41, D42-D44)". [https://www.ndrs.nhs.uk/wp-content/uploads/2020/10/NDRS-Webinar-Rapid-Registrations-Cancer-Dataset-21.10.2020.pdf]