F1-conf-01 — 12-month CPI inflation from two data vintages
Question
For every month t from 2001-01 to 2026-09, compute the 12-month growth of U.S. CPIAUCSL (seasonally adjusted), g_t = 100·(P_t/P_{t−12} − 1). P_t comes from the most recent vintage that covers the month: 2026-10-28 for 2014-01…2026-09, and 2016-07-15 otherwise. Then summarise g_t.
Data and exclusions
- Inputs (
n_input_rows):cpi_vintage_2016-07-15.csvhas 834 rows (1947-01…2016-06).cpi_vintage_2026-10-28.csvhas 153 rows (2014-01…2026-09).cpi_assembled.csvhas 957 rows. I read the assembled file only to audit it. No estimate uses it. SHA-256 hashes and the full audit are inout/state/data_audit.md. - Every data problem I found, and how I handled it, is listed in
data_issues:- The 2026-10-28 vintage has an empty value for 2025-10 (the source publishes no value). I did not impute it, so g for 2025-10 is missing.
- The two vintages overlap for 30 months (2014-01…2016-06), and the newer vintage revises the values. I used the 2026-10-28 values for these months.
- Growth for 2014-01…2014-12 divides a 2026-vintage level by a 2016-vintage level. The rule requires this.
- The assembled file has errors. It uses the older vintage for the 30 overlap months. It also omits 2016-07, which shifts all 123 later values one month late. As a result the series ends at a spurious 2026-10 and the missing value appears under 2025-11. I therefore ignored it.
- Exclusion ledger (
out/exclusions.csv):- Merging the vintages gives 957 months.
- Restricting to the window leaves 309 months (
n_months_window). - Dropping months with no P_t removes 1 month (2025-10).
- Dropping months with no P_{t−12} removes 0 months.
- That leaves 308 analysed months (
n_analysed=n_months_growth), withn_months_missing_growth= 1.
Method
- I merged the two vintages month by month and let the newer vintage take precedence wherever it covers a month. A month the newer vintage covers but leaves empty stays missing; I did not fill it from the older vintage, which does not cover 2025-10 anyway.
- The months before 2001 are used only as 12-month lags.
- I computed g_t directly from the levels. Means are simple arithmetic means over the months where g_t exists. Maximum and minimum are taken over the same months.
- The baseline is the 2001–2013 sub-period mean (
mean_growth_12m_2001_2013). - No randomness is involved (
random_seed= null). out/analysis.pyregenerates every output.
Results
- First month with a growth rate:
first_growth_month= 2001-01. Last month with an index level:last_month= 2026-09. - Mean of g_t over the 308 computable months: 2.574% (
mean_growth_12m).- 2001-01…2013-12, the baseline (156 months,
n_months_growth_2001_2013): 2.361% (mean_growth_12m_2001_2013). - 2014-01…2026-09 (152 of 153 months,
n_months_growth_2014_2026): 2.793% (mean_growth_12m_2014_2026).
- 2001-01…2013-12, the baseline (156 months,
- Named months:
| month | g_t (%) | key |
|---|---|---|
| 2014-06 | 2.098 | growth_2014_06 |
| 2016-07 | 0.868 | growth_2016_07 |
| 2020-05 | 0.198 | growth_2020_05 |
| 2022-06 | 8.979 | growth_2022_06 |
| 2026-09 | 3.717 | growth_2026_09 |
- Maximum: 8.979% in 2022-06 (
max_growth_12m,max_growth_month). Minimum: −1.959% in 2009-07 (min_growth_12m,min_growth_month). feasibility= "partial". One window month (2025-10) has no computable g_t (feasibility_reason). Every other required quantity was computed.
Uncertainty
- Each estimand is a fixed calculation on published data, so there is no sampling uncertainty and no confidence interval applies.
- The real uncertainty is revision uncertainty. Values in the overlap months were revised by up to 0.455 index points between the two vintages (
data_issues), and the 2001–2013 values come from a 2016 vintage that may since have been revised. - The 2001–2013 mean also partly reflects the data vintage, not just the period.
Limitations and open issues
- g for 2025-10 is missing because the source has no index level for that month. The overall mean and the 2014–2026 mean therefore exclude that month. I did not impute it, as the task forbids imputation.
- Growth rates for 2014 combine two vintages with different revision and seasonal-adjustment states.
- I labelled
feasibility"partial" rather than "complete" because one window month is missing. The task asks for missing months to be counted, so this is a judgement call. vintage_usedinanalytic.csvgives the vintage of P_t. The lag P_{t−12} comes from 2016-07-15 for dates up to 2014-12 and from 2026-10-28 after that.results.jsonhas three extra keys beyond the required ones:n_months_window,n_months_growth_2001_2013andn_months_growth_2014_2026.