I’ve recently updated German data to use more user-friendly 10-year age groups instead of the previous 5-year intervals. The difference was surprisingly large, so I decided to investigate—digging deep into the code for about three days to verify everything. Here’s what I found:
Overview of Mortality Watch Data Handling
Mortality Watch integrates multiple data sources and can handle different temporal resolutions (yearly, monthly, weekly). A few months ago, I refined the logic to select the best available data for each resolution—e.g., using yearly data for yearly resolutions.
For these recent updates, I also added 5-year resolution yearly data:
• Yearly Deaths: These match exactly with the underlying dataset from Destatis, which provides official yearly figures.
• Yearly Population: This is reported as of December 31st each year. The simplest approach would be to join the data by year, but that would be inaccurate. Since the beginning of Mortality Watch, I’ve always calculated daily population estimates—breaking down deaths and population into daily values and interpolating as needed. This ensures consistency, as summing up daily data correctly matches the totals.
When comparing Mortality Watch population data with the Destatis source, Mortality Watch reports the mean of daily interpolated data. This may seem counterintuitive at first, but it provides a more accurate representation.
Verifying the Accuracy of Mortality Watch
To ensure my calculations were correct, I conducted a deep dive and even discovered a small bug. The issue, which had only a minor impact, affected age-stratified CMR calculations:
github.com/MortalityWatch/ch…
To further validate the methodology, I created an example script demonstrating different approaches to calculating ASMR. The results vary significantly based on the method used:
1️⃣ Simple year joins (joins deaths of 2020 to population of 12/31/2020), using
Mortality.org age groups (0–14, 15–64, 65–74, 75–84, 85+)
2️⃣ Simple year joins, using 10-year age groups (0–10, …, 80+) – Currently used on Mortality Watch
3️⃣ Daily year joins (interpolated daily population joined on daily death data (evenly split)), using 10-year age groups (0–10, …, 80+)
4️⃣ Simple year joins, using single-year age groups (0–85)
5️⃣ Daily year joins, using single-year age groups
As you can see, the red values match MortalityWatch figures identically, (besides 2023 🥴).
It’s good news that there aren’t any bugs in the calculations. It’s also important to be aware of the sensitivity of the methodology used, and that we should always use the highest resolution possible. This analysis demonstrates how different age groupings and interpolation methods can have a significant impact on ASMR calculations.