SPB Git

spb/wp29_uqo

Public

# 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.csv has 834 rows (1947-01…2016-06). cpi_vintage_2026-10-28.csv has 153 rows (2014-01…2026-09). cpi_assembled.csv has 957 rows. I read the assembled file only to audit it. No estimate uses it. SHA-256 hashes and the full audit are in out/state/data_audit.md.
  • Every data problem I found, and how I handled it, is listed in data_issues:
    1. 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.
    2. 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.
    3. Growth for 2014-01…2014-12 divides a 2026-vintage level by a 2016-vintage level. The rule requires this.
    4. 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), with n_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.py regenerates 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).
  • 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_used in analytic.csv gives 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.json has three extra keys beyond the required ones: n_months_window, n_months_growth_2001_2013 and n_months_growth_2014_2026.
Files · main
Menu

Theme