F1-conf-01 — 12-month CPI inflation (CPIAUCSL, SA) from two data vintages
Question
For each month t from 2001-01 to 2026-09, compute g_t = 100 × (P_t / P_{t−12} − 1), where P is CPIAUCSL taken from the most recent vintage covering that month (2026-10-28 vintage for 2014-01 onward, 2016-07-15 vintage before), and summarise it: overall and sub-period means, five named months, and the max/min.
Data and exclusions
cpi_vintage_2016-07-15.csv(834 rows, 1947-01…2016-06) andcpi_vintage_2026-10-28.csv(153 rows, 2014-01…2026-09) are the only inputs used for estimation. Neither has duplicate dates or gaps in its date sequence.- 2025-10 has no value in the 2026-10-28 vintage (empty cell). The 2016 vintage doesn't cover that month. I did not impute it. As a result g_{2025-10} can't be computed. g_{2026-10} would also need it, but that month is outside the window. The analysis uses 308 of the 309 window months.
- The vintages overlap for 2014-01…2016-06 (30 months), and their levels differ by up to 0.455 index points because seasonal factors were revised. Following the rule, the 2026 vintage is used for those months.
- The hand-assembled file
cpi_assembled.csv(957 rows) has errors. I read it only to check it, never to estimate anything:- for 2014-01…2016-06 it uses the older 2016 vintage instead of the newer one;
- it has no 2016-07 row;
- from 2016-07 onward every 2026-vintage value is dated one month late, which creates a spurious 2026-10 row holding the 2026-09 value (336.298);
- as a result, 152 of the months it shares with the correct series have wrong values.
- Exclusion ledger (
out/exclusions.csv): 309 window months → step 1 (P_t missing: 2025-10) removes 1 → 308 → step 2 (P_{t−12} missing) removes 0 → 308 rows inout/analytic.csv.
Method
- Build the series by taking each month's level from the most recent vintage that has it.
- Compute g_t on a calendar-month index, so any gap gives a missing value rather than a shifted lag.
- Restrict to the window and drop months where g_t is missing.
- Compute the means with equal weight per available month.
No randomness is involved. out/analysis.py regenerates all outputs deterministically; I checked this by re-running it and comparing hashes.
Results
| quantity | value |
|---|---|
| months with g_t / missing | 308 / 1 (2025-10) |
| first growth month / last month with a level | 2001-01 / 2026-09 |
| mean g_t, 2001-01…2026-09 (308 months) | 2.574 % |
| mean g_t, 2001-01…2013-12 (156 months) | 2.361 % |
| mean g_t, 2014-01…2026-09 (152 months, 2025-10 missing) | 2.793 % |
| g 2014-06 | 2.098 % |
| g 2016-07 | 0.868 % |
| g 2020-05 | 0.198 % |
| g 2022-06 | 8.979 % (maximum) |
| g 2026-09 | 3.717 % |
| minimum | −1.959 % in 2009-07 |
Exact values are in out/results.json.
Uncertainty
These figures are deterministic transforms of published index levels, so there is no sampling uncertainty. The relevant uncertainty is data revision:
- Mixed vintages in 2014. For 2014-01…2014-12 the numerator comes from the 2026 vintage and the lag (2013) from the 2016 vintage. Compared with growth computed entirely within the 2016 vintage, the 12-month rates differ by 0.071 pp on average and at most 0.127 pp. For example, g_{2014-06} is 2.098 % spliced versus 2.005 % within the 2016 vintage.
- Revisions for 2015…2016-06. Over these months the two vintages give 12-month rates that differ by up to 0.126 pp.
- Effect on the 2014–2026 mean. Replacing the 2014 rates with same-vintage rates changes this mean only from 2.792628 % to 2.792604 % (difference about 0.00002 pp).
- Effect of the missing month. Dropping 2025-10 slightly changes the weighting of the 2014–2026 mean. No imputed value is included.
Limitations and open issues
- Feasibility is "partial": g_t for 2025-10 can't be computed because the source has no level for that month, and the rules forbid imputation. All summary statistics use the 308 available months.
- The 2014 growth rates combine two vintages, as the availability rule requires. Their seasonal adjustment is therefore not internally consistent; the size of this effect is quantified above.
- The 2001–2013 levels come from the 2016 vintage. Later vintages may have revised the seasonally adjusted values for those years, but they are not among the provided inputs.
- Do not use
cpi_assembled.csvwithout correcting it: it has both the wrong-vintage problem and the one-month date shift.