19 Comments

Try to redo your excess mortality calculation based on my buckets.gz file so that you don't adjust for seasonality but you simply calculate the expected number of deaths based on the number of person-days for each age. If you do the calculation right then your results will be completely different from your v5 spreadsheet. And it will be so much different that the difference can't be explained by the lack of adjustment for seasonality. So then either calculation has to be wrong.

The only thing you have to do is to calculate a sum of person-days for each age: `curl -Ls sars2.net/f/buckets.gz|gzip -dc>buckets;sed 1d buckets|awk '{age=$4;if(age>95)age=95;a[age]+=$5}END{for(i in a)print i,a[i]}'`.

Then take the yearly mortality rates for each age in the second sheet of your spreadsheet, divide them by 365, and calculate the sum of each mortality rate multiplied by the number of person-days for the age.

It gives you a baseline of 37896 deaths. But there's a total of 37315 deaths in the pay-per-dose data, so you get about -1.5% excess mortality.

Expand full comment

I did a simple test using a 94-year old ratio (1:223) in my setup (approx. 223 per 1000 per year die in this advanced age). The resulting projected mortality is 39% of the whole population, which considering the length of the range is correct.

What is your % of simulated population dead when you treat the mean population age as 94?

Expand full comment

If you don't want to try the method I described, you can also calculate total ASMR in the pay-per-dose cohort and compare it to historical ASMR in New Zealand.

When I used the 2013 European Standard Population, I got about 850 deaths per 100k person-years as the total ASMR:

> download.file("https://sars2.net/f/buckets.gz","buckets.gz")

> t=data.table::fread("buckets.gz")

> esp=c(10,40,55,55,55,60,60,65,70,70,70,70,65,60,55,50,40,25,15,8,2)*100

> espage=c(0,1,seq(5,95,5))

> t=t[,.(alive=sum(alive),dead=sum(dead)),by=.(age=cut(age,c(espage,Inf),espage,T,F))]

> sum(t$dead/t$alive*esp[match(t$age,espage)]*365)

[1] 850.2453

However if you pick ESP2013 as the standard population at Mortality Watch, the ASMR for New Zealand is about 870 in 2018, 873 in 2019, 811 in 2020, 841 in 2021, and 904 in 2022: https://next.mortality.watch/explorer/?c=NZL&ct=yearly&v=2.

Expand full comment

I wanna see what your sanity check gets when everyone is 94. My sanity check passed: the expected, easily verifiable-as-correct number of simulated persons don't make it through the filter.

All we need to establish is whether the algo is actually treating the age correctly. Did you run the R with all 94 y/os? Should be trivial to check.

Expand full comment

You're still calculating the baseline wrong, because the baseline shouldn't be that low in 2023. Your results are not consistent with the results of me, canceledmouse, or Uncle John Returns: https://openvaet.substack.com/p/yet-another-dive-in-the-new-zealand, https://twitter.com/UncleJo46902375/status/1732496623123517742, https://twitter.com/UncleJo46902375/status/1741423429641711929, https://twitter.com/UncleJo46902375/status/1751277431929909653.

If the PPD data includes almost half of the NZ population, how can people in the PPD data have 27% excess mortality in 2023 when the total NZ population had close to 0% excess mortality in 2023? Most deaths are in elderly age groups and the vast majority of elderly people are vaccinated, and actually the PPD data includes about 75-80% of the total NZ population in ages 75 and above. So in the scenario that the people in the PPD data are representative of vaccinated people and the average excess mortality among all vaccinated people would be 27%, then unvaccinated people would need to have below -100% excess mortality, which is not possible.

It's also a hack-ass fix that you're adding 1 year to all ages to account for the aging of the cohort. If you accounted for aging correctly then the baseline would be higher in 2023 and lower in 2021. You could do your analysis based on this file instead, which shows the number of person-days and deaths for each age and date so that the ages of people are recalculated on each day: sars2.net/f/buckets.gz. I generated the file with this R script, which is similar to buckets.‍py except it calculates the ages of people correctly: sars2.net/moar.html#Reimplementing_buckets_py_in_R. (In buckets.‍py the age of each person is the age at death for people who died, or the age on the day when the script was ran for people who didn't die.)

Expand full comment

1. Re age of cohort, I just tested: even if I artificially add +3 years to the daily average age of cohort (instead of +1 year as here), the total excess death for the entire chart drops from 8,659 to 7,179.... Meaning, age is not the game changer. Also, my daily avg. age hack is conservative (over-estimating on average) given the mrn count only hits 1.1m (half the mrn) on 21 Dec 2021, and all new mrn are current-age as of date of injection.

2. The 27% summary figure in 2023 is likely over-estimated since the 2023 data did not cover Q4, which is spring months in the southern hemisphere (which is why I emphasize the 2022 figure in the headline instead). Further, when you say "close to 0% excess mortality in 2023", I assume you mean relative to 2022? My metrics are relative to the pre-vaccine baseline (average rates for 2016-20). In 2023, mortality effectively stayed elevated and went sideways.

3. Regarding disagreement with the models of others, I am aware of that, but that is not an argument in and of itself. In my case, you need to find a flaw, and the age of cohort isn't it.

4. You and the other modelers need to square the official average for 2016-20 (32,923) with the 2022 headline-making total (38,577, +17%). If my rates were wrong, it would be unlikely to predict the 2022 official number within <1%. The 2023 official total will likely also be in the 38K range.

Mortality is officially acknowledged as being *and remaining* extremely high in N.Z. This model explains the majority of that phenomenon.

Expand full comment

1. No, age is a game changer, but you're using an incorrect method to calculate your baseline which doesn't give sufficient weight to age. I showed it in my experiment where I removed all people of age 70 and above from your spreadsheet, but it had little effect on the baseline even though the baseline should've dropped by about 70 to 80%: https://twitter.com/mongol_fi/status/1751076833469030546.

I calculated an average CMR in 2021-2022 for each age among the total NZ population. Then I calculated excess mortality by taking a weighted average of the CMR values where the weight was the number of person-days for each age in the pay-per-dose cohort. At first I got about -4% excess mortality, but when I incremented the ages of all people by 3 years, I got about -31% excess mortality:

> download.file("https://sars2.net/f/buckets.gz","buckets.gz")

> t=data.table::fread("buckets.gz")

> t=t[,.(alive=sum(alive),dead=sum(dead)),by=age]

> pop=tail(read.csv("https://sars2.net/f/nz_infoshare_population.csv"),2)[,2:96]|>colMeans()

> dead=tail(read.csv("https://sars2.net/f/nz_infoshare_deaths.csv"),2)[,2:96]|>colMeans()

> cmr=data.frame(x=0:94,y=dead/pop*1e5)

> cmr=c(cmr$y,predict(lm(y~poly(x),tail(cmr,10)),list(x=95:120)))

> t$expected=cmr[t$age+1]*t$alive/1e5/365

> (sum(t$dead)/sum(t$expected)-1)*100

[1] -4.228223

> t$expected2=cmr[t$age+1+3]*t$alive/1e5/365

> (sum(t$dead)/sum(t$expected2)-1)*100

[1] -31.0554

2. I meant that there's close to 0% excess mortality in 2023 relative to the prepandemic linear trend: sars2.net/moar.html#Tweet_by_Kirsch_about_excess_mortality_in_2021_2023. It doesn't make sense to use the prepandemic average as a baseline, and it makes even less sense to include 2020 in your baseline.

4. New Zealand has an increasing trend in deaths per year. When I calculated the baseline by doing a linear regression for the number of deaths in 2015-2019, I got about 6% excess deaths in 2022 and about 2% excess deaths in 2023 (but the linear trend is actually too low in 2023 as Thoughtfulnz will tell you, and when I used a second-degree polynomial trend in 2011-2019 as the baseline, I got about 2% excess deaths in 2022 and about -3% excess deaths in 2023):

> d=data.frame(year=2011:2023,deaths=c(30165,30157,29439,30995,31709,31314,33566,33190,34175,32666,34937,38484,37745))

> d$trend=predict(lm(deaths~year,subset(d,year%in%(2015:2019))),d)

> # d$trend=predict(lm(deaths~poly(year,2),subset(d,year%in%(2011:2019))),d) # use a second-degree polynomial trend instead of a linear trend

> d$excess=d$deaths-d$trend

> d$excesspct=d$excess/d$trend*100

> print.data.frame(round(d),row.names=F)

year deaths trend excess excesspct

2011 30165 28706 1459 5

2012 30157 29387 770 3

2013 29439 30068 -629 -2

2014 30995 30748 247 1

2015 31709 31429 280 1

2016 31314 32110 -796 -2

2017 33566 32791 775 2

2018 33190 33472 -282 -1

2019 34175 34152 23 0

2020 32666 34833 -2167 -6

2021 34937 35514 -577 -2

2022 38484 36195 2289 6

2023 37745 36876 869 2

I got the weekly number of deaths from here: https://www.stats.govt.nz/experimental/covid-19-data-portal?tab=Health&category=Weekly%20deaths. And I used the tempdisag R package to disaggregate the weekly data to daily data and I took yearly totals of the daily data.

Expand full comment

1. Removing 70+ from the current sheet will only affect the control population weighting, it won't change the seasonal mortality filter itself, as the mortality filter is based on the hard-coded average daily ages (+1) which come via the avg. age py script. So, try adjusting the average ages in column B, you will see massive shifts. As noted before, a +3 year change created a 17% difference.

2. The average mortality change in New Zealand for years 2000-2020 is +1.06%. 2021 was +7.1 (versus 2020), and 2022 was +10.4% (versus 2021). This Must Be Explained.

2000 26661 1

2001 27825 1.04365927759649

2002 28065 1.00862533692722

2003 28011 0.998075895243185

2004 28419 1.01456570632966

2005 27033 0.951229811041909

2006 28245 1.04483409166574

2007 28521 1.00977164099841

2008 29187 1.02335121489429

2009 28962 0.992291088498304

2010 28437 0.981872798839859

2011 30081 1.05781200548581

2012 30099 1.00059838436222

2013 29568 0.982358217880993

2014 31062 1.0505275974026

2015 31608 1.01757774773035

2016 31179 0.986427486712225

2017 33339 1.06927739824882

2018 33222 0.996490596598578

2019 34260 1.03124435614954

2020 32613 0.951926444833625

2021 34932 1.07110661392696

2022 38577 1.10434558570938

2023 is on track for 38,000+, like 2022

Expand full comment

1. If you're getting 17% from (1-7179/8659)*100, it's not even a difference of percentage points, and the excess mortality only decreased by about 4 percentage points from about 23% to about 19%: (8659+37315)/37315-(7179+37315)/37315. But when I incremented all ages by 3, my total excess mortality dropped from about -4.2% to about -31.1%, which is a difference of about 27 percentage points.

In your spreadsheet I had to increase the values in the average age column by 9 years until I even got the total excess mortality to be negative. But when I increased the ages of all people by 9 years in the R code in my previous comment, my total excess mortality dropped from about -4% to about -63%.

2. When I used the linear trend in 2015-2019 as the baseline, I got negative excess mortality in both 2020 and 2021. But the negative excess mortality was not as great in 2021 as in 2020, which explains the increase from 2020 to 2021.

Expand full comment

1. Consider the meaning of the age mortality ratios (starting at column AH99). For every 1000 people per year, that is the number who die. So age 40 is 1 per 1000 per year, and age 43 is 1.3 per 1000 per year.

This means on a per person basis, per day, the increase is 1.3 - 1 / (365*1000) = 0.000000822

So, the constant daily factor to add to the baseline seasonal mortality (to increase mean population age from 40 to 43), is 0.000000822..... This will result in 0.3 additional people dying per year for every 1000, which is the accurate increase from ages 40 to 43.

Try this in your setup: make the age 94. The ratio there is ~223 to 1. I'm guessing your algo will kill multiple times the entire simulated input population.

I did a test using that 223 ratio in mine (thank you), and the projected deaths is 39% of the whole population, which considering the length of the range is perfectly accurate.

2. Years 2015-2019 in NZ had +2% mortality on average. If we simply skip 2020 altogether, the mortality of 2021 was +2% versus 2019 (+7% versus 2020). And then 2022 was +10% versus 2021.... These are simple numbers. The question is not whether there is excess mortality, the only question is what is causing it (I'm amazed we're still debating the cause to be honest).

Expand full comment

1. My method of calculating the baseline is not based on the mean age but based on the number of people of each age. But if everyone in the cohort would be 94 years old, then the expected number of deaths per person-year would be the same as the yearly mortality rate for age 94, which is about 0.249 if you use the average mortality rate in 2021 and 2022.

2. If you calculate excess mortality relative to the prepandemic trend, you still get negative excess mortality in 2020 and probably also 2021. So the total excess mortality since the start of 2020 can be negative depending on which baseline you use, and it's up to debate whether there was excess mortality or not on the timescale of the whole pandemic. (But there was still of course excess mortality in 2022 when NZ got COVID.)

When I used the R code in my previous comment, I got about 414 excess deaths since the start of 2020 when I used the 2015-2019 linear baseline, but I got -4884 excess deaths since the start of 2020 when I used the 2011-2019 polynomial baseline.

And excess mortality doesn't have to be the excess number of deaths but it can also be excess ASMR or excess CMR.

At OWID the cumulative excess CMR since the start of 2020 is barely positive: https://ourworldindata.org/grapher/cumulative-excess-deaths-covid?country=~NZL. OWID uses seasonality-adjusted CMR where the baseline is derived from the linear trend in 2015-2019. But it results in excess mortality being overestimated in 2023 as Thoughtfulnz has shown.

Expand full comment