CPI Lab

Item-level rebuilds of the US Consumer Price Index from published BLS files. Nine questions: what the basket looks like if you weight it by how often you buy things instead of how much you spend, how spread out item inflation actually is, how fast a shock fades out of an item's rate, how much a monthly print moves after it is published, where the fixed-weight basket and the chained one part company, which item prices move before which, what producer prices have already done that consumer prices have not yet, how the import-intensive part of the basket is moving against the domestic part, and how far apart cities are. Plus one about the survey itself: how much of the index is still being physically collected. Everything here is descriptive — it reports what the published series did, never why.

Loading…

SummaryThe latest month at a glance

Nine numbers for the most recent CPI month. The first three are whole-basket indexes built three different ways; the next three describe the spread of item rates behind the headline; the seventh is the spread across cities rather than across items; the last two are about the measurement itself, not about prices — how much of the index rests on imputation, and how often a printed monthly change survives revision.

P1 · Frequency weightingWhat you buy weekly vs the official basket

The published CPI weights every item by how much money households spend on it — owners' equivalent rent is about a quarter of the basket because shelter is about a quarter of spending. These indexes rebuild exactly the same calculation, weighting each item instead by how often households record buying it in the Consumer Expenditure Diary.

Five indexes, one construction

What this is: the same December-chained Laspeyres index over the same ~179 published items, re-weighted by purchase frequency instead of expenditure share. What it isn't: a measure of inflation "as experienced" or "as felt" — no survey of what households notice is used anywhere in this pipeline, and the frequency-weighted basket is not a truer CPI, just a much more concentrated one.

Show:

Shaded bands are ±1 balanced-repeated-replication standard error of each scheme's gap against the official replica. They are deliberately drawn to scale: at ±0.019 pp in the latest month the band is narrower than the line itself. Diary sampling is not the weak link here — the choice of Diary year is (see the method note). October 2025 is absent from every series — there was no CPI release that month — so the lines break rather than interpolate across it.

Method & exact definitions
Frequency measure
"Share of weighted CE Diary purchase entries per consumer-unit-week, mapped UCC → ELI → published item stratum." For Diary year y, with consumer-unit-weeks c, final weight FINLWT21, and nc,u the number of expd purchase entries CU-week c recorded for UCC u: entries_per_cuweek(u) = Σc nc,u Wc / Σc Wc.
Index construction
"December-chained Laspeyres over the same leaf universe as the P0 replica" — It = IDec(y) · Σi wi Pit/Pi,Dec(y) / Σi wi, chained through each December, built identically to the official replica so the two are comparable. Leaf universe = cpi_weight WHERE is_leaf=1 AND matched=1, ~179 items covering ~97% of the CPI; the missing ~3% is unsampled strata with no published index and is renormalised away.
The bill floor (bill_salience)
"max(diary frequency, 1/4.345 entries per CU-week) for the listed items only" — i.e. each of 17 documented recurring-bill items is treated as at least one purchase event per month (0.23015 entries per consumer-unit-week), unless the Diary already sees it more often. The Diary is a two-week purchase log: a household writes down the eggs but not its rent, so owners' equivalent rent scores 25.8% of spending and 0.00% of purchase entries. The floor binds for all 17 items, taking the group from 1.04% to 11.27% of the basket.
This is an assumption, not a measurement. "One bill a month" is a stipulation about what a bill is; the Diary cannot confirm or refute it. It also gives a rent payment and a garbage bill exactly the same weight, which is crude.
The 17 items: rent, owners' equivalent rent, tenants'/household insurance, motor vehicle insurance, health insurance, electricity, utility gas, water & sewerage, garbage & trash, wireless phone, residential phone, internet, cable/satellite/streaming, college tuition, elementary & high-school tuition, day care & preschool, and state motor-vehicle registration & licence fees. Deliberately excluded as not bills: hotels, video and music subscriptions (they mix subscriptions with one-off purchases), parking fees, and episodic medical services.
Multi-ELI split
"Expenditure-weight split of the 29 multi-ELI UCCs (see sensitivity variant split_equal)". ELI → published item is 'SE'+ELI[:4], walking up to [:3] and [:2] when the finer stratum is unpublished.
Aggregation level
"Published item (see sensitivity variant agg_class)".
Coverage gate
A month is priced only if leaves carrying ≥ 90% of the scheme's weight have both a December base and a current index. Only 11.3% of the official-replica weight had an October-2025 observation, so that month is dropped from every scheme, every sensitivity variant and every bootstrap replicate rather than being priced off a handful of items.
Sampling error
σ = √( Σr=1..44r − θ)² / 44 ) over the 44 CE PUMD balanced-repeated-replication weights, where θ is the gap (scheme YoY − official replica YoY) in percentage points. PUMD replicate weights are already doubled half-sample weights, so no Fay factor is applied; under the Fay k=0.5 convention every SE here would be exactly 2× larger.
How much do the arbitrary choices matter?
Eight specification variants are rebuilt as separate indexes.

Expenditure weight vs frequency weight — top 25 items

What this is: for the 25 largest items by either weight, the share of the basket each gets under expenditure weighting and under frequency weighting. What it isn't: a claim that either weighting is correct. The gaps are mostly an artefact of what the Diary can see: recurring bills collected by the CE Interview survey score near zero frequency by construction.

Method & exact definitions

Expenditure weight is the December relative importance of the item (the published CPI's own weight). Frequency weight is the item's share of weighted CE Diary purchase entries per consumer-unit-week, normalised to 100 over the same leaf universe. Both are percentages of the basket for the latest month.

Purchase-entry counts partly measure classification depth: an item BLS splits into several UCCs accumulates more entries than an equally common item recorded as one. The agg_class sensitivity variant measures this and finds it small in aggregate (0.0004 pp on the headline) — but that is an aggregate result and can still be large for an individual item.

About 5% of Diary entries have no concordance row and are dropped; 99.4% of the concordance-mapped entry mass lands on a published leaf.

Gap drivers — which items open the gap this month

What this is: per item, its contribution to the frequency-weighted rate minus its contribution to the expenditure-weighted rate, in percentage points, for the latest month. What it isn't: an attribution of cause. A large bar means the item is weighted very differently under the two schemes and its price moved — nothing more.

Method & exact definitions

contribution = weight × item YoY / 100, computed separately with the expenditure weight (contrib_exp) and the frequency weight (contrib_sal); the bar is gap_driver = contrib_sal − contrib_exp. Blue bars push the frequency-weighted index above the official replica, red bars pull it below. Bars sum across all ~175 items to approximately the total gap; the 12 largest in each direction are shown.

Does this explain why households say inflation feels higher? No. A separate research note (R1) tested exactly that and found the frequency-weighted index does not explain the gap between household inflation expectations and published CPI over 2022–26 — and to the extent the data says anything, it says the opposite of the hypothesis. Conditional on the published inflation rate itself, the frequency gap adds ΔR² = 0.002 (χ² = 0.25, p = 0.62) to explaining the Michigan expectations gap. The eye-catching univariate slope is negative (−0.69, t = −4.28): the frequency index ran hottest in 2022 exactly when households were most under-predicting inflation. Read these indexes as "inflation of what you buy every week" — a descriptive re-weighting — not as "what people feel".

P2 · Cross-sectionThe shape of inflation

Headline CPI is one number built from about 180 published items whose annual rates in the latest month ran from a steep fall to a steep rise. This section measures the shape of that cross-section every month, and asks which items actually move the aggregate around. Every statistic is weighted by how much of the household budget the item represents.

The distribution of item inflation, month by month

What this is: the spread of 12-month rates across published CPI items for each of the last 24 months, with each item's contribution scaled by its budget weight. What it isn't: a distribution over households or over prices paid — it is a distribution over items, so a 25% swing in eggs (0.13% of spending) barely registers next to a 3% move in rent.

One row per month, newest at the top. Height is budget weight falling in each bin, on a shared scale across all months, so a taller, narrower ridge means the basket is moving together and a flat wide one means it isn't. The axis spans the weighted 5th–95th percentile of every month shown; the roughly 5% of basket weight beyond each end — a handful of very small items running from about −26% to +39% — is clamped into the end bins rather than stretching the axis. Exact percentiles are in the data table.

Method & exact definitions

Universe: cpi_weight WHERE is_leaf=1 AND matched=1 for weight_year = calendar_year − 1 (the December relative importance of year Y applies to the months of Y+1), joined to cpi_item_month — 179 items covering ~97% of the CPI-U. Weights are renormalised each month over the items that actually have a value.

The yoy view shown here is NSA, 12-month, and covered 175 items / 96.5% of the basket in the latest month. It is the view to show a consumer; the SA-based 3-month-annualised and 1-month views describe a smaller basket (~86%) because seasonally adjusted indexes exist for fewer strata.

Median, trimmed mean and the 10th–90th percentile spread

What this is: four order statistics of the same weighted item cross-section, over time. What it isn't: alternative inflation forecasts. A widening p10–p90 gap means the average is describing fewer and fewer real prices; it does not say the average is wrong.

Universe:
Method & exact definitions
Median / percentiles
"The value of the first item at which the cumulative weight reaches p" — the step definition, no interpolation, the same convention the Cleveland Fed uses for its median CPI.
Trimmed mean (16%)
Each item keeps the overlap of its weight interval [Wiwi, Wi] with [α, 1−α], so boundary items are split and the estimator is continuous in α; then a weighted mean over the retained weight, with α = 0.16 per tail. This is the standard "underlying inflation" measure; the Cleveland Fed publishes a 16% version, against which ours runs −0.13 to +0.34 pp over the last 12 months (expected: they trim ~45 aggregated components, we trim 142–175 leaves).
Ex-shelter universe
Drops SEHA, SEHC01 and every leaf whose cu_item ancestry contains SAH1 — in practice rent, owners' equivalent rent, lodging away from home and tenants' insurance, about 34.4% of the 2025 weight.
Owners' equivalent rent dominates every weighted moment. At ~25% of the basket, OER alone spans the 41.7th to the 67.8th percentile of the July-2026 cross-section, so it is the weighted median in 46 of the 138 months since 2015 — including every month of 2026 — and the median and p75 can collapse onto the same item. This is why the ex-shelter toggle exists, and why the median should always be read next to the percentile spread.

Trimmed means are not monotone in α. In July 2026 the 8% trim gave 2.75 but the 16% trim gave 2.95, because 15.2% of the basket was falling and widening the trim removed most of the negative tail. That is correct behaviour, not a bug — the two trims are two different descriptions, not a robustness ladder.

Weights only exist from December 2017 in cpi_weight; months before 2021 reuse the oldest available vintage and are a genuinely fixed-weight historical cross-section, not the weights of the day. Treat pre-2021 history as indicative.

Who moves headline

What this is: each item's share of the variance of monthly headline SA inflation over the last 24 and 60 months (the shares add to exactly 100%), shown next to its contribution to the level of the latest month. What it isn't: causation. A large variance share means the item's contribution co-moved with the total over the window — it reflects the item's volatility, not any claim about what drives inflation.

Share of headline variance

Contribution to the level (pp)

Method & exact definitions

Let xit be item SA month-on-month change and wit its renormalised weight, and define the contribution cit = wit xit (percentage points). Then Xt = Σi cit is our replica of headline SA MoM, and exactly Var(X) = Σi Cov(ci, X), so sharei = Cov(ci, X) / Var(X) and Σi sharei = 1. A negative share means the item consistently moved against the total, damping it.

Windows are 24 and 60 calendar months ending at the latest month; months with no CPI are dropped, never shifted, and a window needs ≥90% of its months present. X is not the published series — it omits the strata without SA indexes (~86% of the basket) — so the decomposition describes X, not SA0 exactly. Validated: Σ sharei = 1.000000000 for both windows; replica SA MoM vs published SA0 MoM since 2000-01 has correlation 0.972 and mean absolute difference 0.053 pp over 317 months.

P3 · PersistenceHow fast shocks fade

Some items reprice constantly and forget last month immediately; others move in slow steps. This section measures, for every published item, how much of a month's deviation from its own average is still there the following month — and then asks whether today's inflation sits in the fast-fading part of the basket or the slow part. Everything here describes the rate of change of a published index in a sample. It is not a statement about price-setting behaviour, and not a forecast.

Every item, sized by weight, coloured by half-life

What this is: the latest month's cross-section of ~174 leaf items — area is the item's share of the basket, fill is how many months it takes for half of a deviation in its monthly rate to disappear. What it isn't: a claim that a low half-life item's prices are unstable, or that a high one's are fixed. A half-life of zero means this month's rate tells you nothing about next month's; it does not mean the price never moves. Levels are far more persistent than rates.

Universe:

Method & exact definitions
rho
OLS slope of the item's monthly rate on its own one-month lag, with a constant, over a rolling 120-month window ending at the latest month (equivalent to a demeaned AR(1)). An item enters a window only with at least 96 monthly rates inside it.
Half-life
ln(0.5) / ln(rho) months; 0 when rho ≤ 0 — the deviation is gone the following month — and capped at 60 when rho ≥ 1.
The monthly rate, and the two source groups
Each item is assigned one rate definition for its whole history. sa items use the published seasonally adjusted month-over-month change (146 items, 86.0% of CPI-U). Items whose SA series is too short use nsa12: 100 × (ln Pt − ln Pt−12) / 12 (36 items, 10.2%).
The nsa12 rate manufactures persistence. It is a 12-term moving average, so applied to pure noise it yields rho ≈ 0.917 and a half-life of about 8 months analytically — the pipeline re-derives 0.896 / 6.3 months by simulation. That is why the two source groups are shown as separate faceted charts with separate rankings on this page and never sorted into one list: a ranking that mixes them is a chart of the filter, not of the basket.
Raw vs relative universe
"Relative" repeats everything on the item's rate minus the headline rate put through the same filter, so a slowly-fading common shock is differenced out. Spearman correlation between the two half-life rankings at the latest month is : the ordering is robust, the levels are not. Note the mechanical bias — owners' equivalent rent is ~25% of the headline, so subtracting the headline subtracts a quarter of OER from itself, and the relative measure is biased toward finding low persistence for high-weight items. The honest answer for a large item is somewhere between the two. Both are published; never quote one alone.
Uncertainty
rho from 120 observations carries a standard error of roughly 0.09, so a half-life of 4 months and one of 6 are usually not distinguishable. lp12 (the local-projection slope at a 12-month horizon) and its Newey–West HAC standard error are in the data table; they are the only published uncertainty numbers here. Read the league table as indicative ordering.

Sticky and flexible CPI — ours and the Atlanta Fed's

What this is: the same December-chained Laspeyres arithmetic as the official replica, run twice with the item weights tilted toward the more persistent items and toward the less persistent ones, next to the Atlanta Fed's published sticky/flexible series. What it isn't: the same measurement as the Atlanta Fed's, and not a validation against it. The two split the basket on different criteria and are expected to disagree.

Show:

Method & exact definitions
Weights
With si the within-source-group rank percentile of rho, sticky CPI weights item i by wi · si and flexible CPI by wi · (1 − si). The _binary schemes split hard at the within-source weighted median; the _pooled schemes deliberately do not normalise within source and are shown as the sensitivity run that makes the nsa12 artefact visible. All schemes run on exactly the same item set, so they are comparable with each other and with the official replica.
No look-ahead
The classification used for the months of year Y+1 is estimated on the window ending December of Y, so the index never uses data from the months it is applied to.
Why owners' equivalent rent dominates the sticky index
OER is 25.2% of the basket and the most persistent seasonally adjusted item. Weight × persistence puts it at 33.4% of the sticky index's weight, with rent of primary residence adding another 10.5% — shelter alone is about 44% of our sticky CPI. Read every movement in it as, to a first approximation, a shelter index with a tail of vehicles and restaurants. It is not an independent read on the economy.
Why ours and the Atlanta Fed's differ — vehicles
The Atlanta Fed splits the basket by how often prices change (Bils–Klenow: sticky = repriced less often than every 4.3 months) — a fact about price-setting. Ours splits by how persistent the published index's inflation rate is — a fact about the time series. The classifications genuinely disagree on big items: used cars and new vehicles reprice constantly, so the Atlanta Fed calls them flexible, but their index has serially correlated monthly changes, so P3 calls them sticky. That single disagreement explains most of the divergence — in June 2021 our sticky CPI hit 6.31% against our flexible 3.12% because the used-car spike landed in our sticky basket and in their flexible one, and in April–May 2026 the same thing runs the other way. Treat the overlay as a sanity band, not a validation. Neither is "right"; they measure different things and the labels happen to collide.
Validation
This pipeline's own official_replica reproduces the published headline within ±0.15 pp in every one of the last six months. The Atlanta Fed rows use a ±2 pp sanity band, not a tolerance.

How much of the basket fades fast

What this is: the share of covered leaf weight whose half-life falls under 3 months, between 3 and 12, and above 12 — computed separately for the two source groups and, for comparison only, pooled. What it isn't: comparable across the two source groups. The pooled row is printed so the artefact is visible, not so it can be quoted.

P4 · RevisionsHow much a print changes later

A seasonally adjusted monthly CPI change is an estimate, and the seasonal pattern it rests on is re-learned every January — at which point BLS restates the previous five years of adjusted history. The underlying prices do not change and the not-seasonally-adjusted index is essentially never revised; what moves is the split between "this is the normal March pattern" and "this is news". This section measures how far a first print eventually travels, and how much of a single month is separable from the recent trend at all.

Every vintage of the last 36 months

What this is: for one series, the seasonally adjusted month-over-month change of the last 36 observation months as it appeared in each of the archived vintages, with the current vintage in ink and the first print of each month dashed. What it isn't: a correction sequence. There is no true value being converged on — there is a seasonal decomposition being re-estimated, and revising it as data arrives is correct practice, not error.

Series:

Method & exact definitions

Source: the ALFRED vintage archive at the St. Louis Fed, which keeps every FRED vintage. Thirteen series are collected; headline goes back to 1972, the aggregates to 1996, and the nine item-level CUSR0000* series to 2011, so only the 2011+ window is comparable across all thirteen.

First print is the month-over-month change in the earliest vintage that contains that observation month. A series' oldest archived vintage also carries back-history that had already been revised before ALFRED ever saw it; those months are stored with true_first = 0 and excluded from every statistic, because including them would bias revisions toward zero.

Each vintage is reindexed onto a complete monthly calendar before differencing, so a month-over-month change is a true calendar lag. October and November 2025 are therefore absent from every vintage of the aggregates — there was no October CPI. Two series are exceptions and do have an October value, new vehicles and used cars, because those indexes are built from transaction data rather than field collection; this is detected from the data per series, not hardcoded.

The February effect is a direction, not a size

What this is: the average signed revision from first print to latest value, by calendar month of the year, pooled over the whole history of the series. What it isn't: a statement about inflation. Re-estimated seasonal factors redistribute a fixed annual total across twelve months, so these revisions roughly cancel over a year — the overall mean signed revision for headline is +0.002 pp, i.e. zero.

Series:

Method & exact definitions

Revision = latest − first_print in percentage points, averaged over every genuine first print for that calendar month. The magnitude is flat across the year — headline mean |revision| is 0.068 pp for January+February against 0.066 pp for the rest of the year, a ratio of 1.03. It is the sign that carries the seasonal signature: early-year prints are systematically revised down, late-year prints systematically up.

Month-of-year statistics pool across each series' whole history, which for headline mixes several seasonal-adjustment methodology regimes (X-11 through X-13ARIMA-SEATS, with intervention analysis introduced at different dates per series). The sign pattern is stable across sub-periods; the magnitudes are not directly comparable across decades.

Does a 0.4 stay a 0.4?

What this is: every headline and core first print that printed as 0.4, and what tenth it eventually rounded to. Rounding is half away from zero (BLS style), not Python's banker's rounding. What it isn't: a claim that the revised number is more correct than the printed one — only that the printed tenth is not durable.

Method & exact definitions

Reporting rounds a monthly CPI change to one decimal, so the honest question is whether the printed number survives. Both the first print and the latest value are rounded to tenths and cross-tabulated; the full transition matrix for all thirteen series is in p4_transition and in the JSON.

First prints against their own trailing trend

What this is: each month's first print, against a band of ±1.5 sampling standard errors around that month's real-time trailing 12-month average. Filled markers are the months that fall inside the band. What it isn't: a hypothesis test. The trailing mean is itself estimated, the SE is a median across cells rather than the standard error of this particular change, and it covers sampling error only.

Series:

Method & exact definitions

The flag is |first_print − trailing 12-month mean of MoM in that same vintage| < 1.5 × SE. The trailing mean is computed from the first-print vintage, not from today's data, and requires at least 9 of the 12 prior calendar months. Standard errors are BLS's own annual median SE of a one-month change (Table 1V of the variance workbooks, parsed by P5), matched to the observation month's year.

Sampling error is the smaller of the two uncertainties here. For headline the sampling SE of a one-month change is 0.04 pp, while the standard deviation of the eventual seasonal-adjustment revision is 0.086 pp — revision is about twice the sampling error. The two are roughly independent, so a first print of headline SA month-over-month carries something like √(0.04² + 0.086²) ≈ 0.095 pp of total uncertainty before anything else is considered.

Three series are matched exactly to a published group (headline, core, energy); the rest are components of, or spread across, a broader group, and are marked with an asterisk in the summary table. For those the group SE is a lower bound on the component's sampling error — narrower cells carry fewer price quotes — so their "within 1.5 SE" share is conservative, i.e. too low.

P8 · Chained CPIWhere households substitute

BLS publishes two headline indexes off the same price quotes. The CPI-U combines them with fixed, lagged expenditure weights; the Chained CPI-U uses spending patterns from both ends of the period, so it registers that when beef gets expensive people buy more chicken. The difference is the upper-level substitution gap. Since December 1999 the all-items gap has averaged 0.27 percentage points a year, which compounds to 7.0% — the reason "chained CPI" keeps appearing in budget proposals.

29 categories, ten years, coloured by the gap

What this is: CPI-U 12-month change minus C-CPI-U 12-month change, in percentage points, for each published category and each of the last 120 months. Blue means the fixed-weight index rose faster; red means the chained index did. What it isn't: a set of independent measurements. The rows nest — All items ⊃ Housing ⊃ Shelter — and the six commodity-and-service-group rows slice the same total a second time. Read it for where and when the two formulas disagree, not as 29 separate facts.

Rows:

Method & exact definitions
The one number
gap_yoy = CPI-U 12-month % change − C-CPI-U 12-month % change, in percentage points. Both indexes are taken as published; nothing is re-aggregated. The CPI-U leg is NSA, matching the C-CPI-U, which BLS never seasonally adjusts. All 12-month lags are calendar-aligned joins, never row offsets.
Which substitution this is
Upper-level only — shifting spending between categories. Swapping between varieties inside a category is already handled in both indexes by the same geometric means BLS has used since 1999, so that layer is not in these numbers.
The three publication stages
The chained formula needs to know what people spent that month, and that arrives about a year late, so every month is published three times: initial with the month itself, interim each quarter, and final 10–12 months later. The stage is carried in the footnote code on each data row of the flat file (I, U, blank), and is marked on the month axis. The newest number on this chart is the least reliable one.
Universe
There is no fine-grained C-CPI-U. The chained index does not exist below these 29 published aggregates, anywhere public — so "item level" here means these 29, not the ~179 leaf strata used by P1 and P2.
October 2025
No CPI and no C-CPI-U, with exactly one exception: new vehicles has an October value in both surveys, so that is the single 2025-10 cell on this chart. Everything else is absent by design.

Cumulative divergence by major group since 1999

What this is: the percent by which each major group's fixed-weight index has outrun its chained counterpart since the chained index's own December 1999 base. What it isn't: a running sum of the monthly gaps — it is a ratio of the two index levels, so it is the cumulative divergence, not an accumulation of the 12-month numbers above.

Groups:

Biggest and smallest 12-month gaps at the last final month

What this is: the 12-month gap by category as of the most recent month whose chained values are final, which is the only stage worth ranking on. What it isn't: a ranking of "who substitutes most". A negative gap simply means the chained index rose faster for that category over those 12 months; that happens routinely at category level and is not a contradiction — the aggregate gap is the weighted net.

What a fresh chained number is worth

What this is: the all-items chained index as first published against its value today, and the resulting revision to the 12-month change. What it isn't: evidence that the long-run gap is unreliable. The long-run average is solid; it is the single fresh month that is not.

Method & exact definitions

The flat file only ever carries the current stage of each month, so it is a snapshot rather than a history. Publication history is therefore rebuilt from BLS's own monthly supplemental tables — Table 1C, xlsx from 2021-11 and pdf back to 2017-07 — each of which prints the index as it stood at that release. 107 files, publications 2017-07 … 2026-07. Nothing before 2017-07 is recoverable: the 2012–2016 archives contain no C-CPI-U table at all, and BLS publishes no consolidated revision history.

rev_yoy_pp is the number to quote. rev_pct compares the level published for that month then and now, and because the whole index path is revised together it is not a clean per-month statistic.

P10 · Lead–lag mapWhat leads what

74 mid-level CPI items covering 89% of household spending, treated as 74 monthly series of price changes since 2000. For each of the 5,402 ordered pairs — "does A move before B?" is a different question from "does B move before A?" — the pipeline asks whether A's move lines up with B's move one to twelve months later, and how reliably. Only the relationships that survive four separate filters are drawn.

Lead–lag correlation, not pass-through, not causal. An arrow from i to j means that when i's seasonally adjusted monthly rate moved, j's tended to move a few months later. It does not mean i's prices feed into j's costs. Two items can lead and lag each other because they share a driver, because BLS prices them on staggered schedules, because one is smoothed and the other is not, or by chance. The filtering below removes accidents, not confounders — a shared driver produces exactly the same picture as a pass-through.

The map

What this is: the stable edges only. Node size is the item's share of the basket, node colour and ring position are its major group, arrow width is |ρ| and arrow colour its sign; hover or click a node to light up everything it leads, two steps out, with the cumulative lag. What it isn't: a causal graph, and not a complete one — 37 of the 74 nodes have no stable edge at all, and the absence of an arrow into a thinly-covered group is weak evidence.

Variant:

Hover or focus a node to highlight its two-level downstream cascade; click to pin it, click again or press Escape to release. The cascade table appears below when a node is selected.

Method & exact definitions
The two variants
raw is the items as published, and it is dominated by energy: fuel oil, gasoline and energy services appear to move first and everything else to follow, because energy is what moves the overall inflation number and the overall number is inside every series. common_removed takes each item's own idiosyncratic movement after regressing out the headline — and is the variant to read. Almost every energy→transport link is strong in raw and gone in common_removed: those items do not have a private relationship with each other, they are both riding the same tide.
Leave-one-out headline
The headline regressor has the item's own contribution removed. This matters more than it sounds: gasoline is 2.9% of the basket but its monthly rate has 19× the headline's standard deviation, so on the plain headline it largely regresses on itself, takes a coefficient of +16, and its residual becomes roughly minus-the-headline — which then shows up as a flat ρ ≈ −0.5 arrow from gasoline into every persistent service item at every lag from 1 to 12, the signature of a level artefact rather than a lead. The fix drops energy sources from 12 to 3 while leaving every genuine edge intact or slightly stronger.
ρ, lag and q
ρ is the cross-correlation at the best lag; ρ = 0.43 means roughly 18% of the follower's month-to-month wiggle lines up with the leader's three months earlier. Lag is the argmax of |ρ| over 1…12 months and is not sharply identified — neighbouring lags usually differ by a few hundredths. q is the FDR-adjusted p-value of a Newey–West HAC Granger-style F test; a low q means the leader says something the follower's own history did not already say. A high q with a high ρ — rent → OER, ρ 0.80, q 0.78 — means "these two move together with a one-month offset, but neither predicts the other beyond its own past". Both are shown because they answer different questions.
Stability
Everything is recomputed on four overlapping ~15-year windows. A pair passes a window if |ρ| > 0.25 or q < 0.05 there; an edge is stable only if it passes in at least 3 of the 4 windows, with the same sign and every best lag within ±2 months of their median. Note that 20 of the 70 stable edges do not clear the screen on the full sample — they pass in three windows but wash out when all 26 years are pooled.
rho_other
Every edge carries the same pair at the same lag measured in the other variant. An edge whose rho_other is near zero or of the opposite sign is a creature of the common-factor step, not a robust feature of the data. Three weak negative gasoline / fuel-oil edges survive into the main view and are residual artefact.
Colour and position
Major group is carried by position first — each group occupies one labelled arc of the ring — and by colour second, which is what allows eight group hues in a form where any two can end up adjacent. Every node is also directly labelled, and the full edge list is in the data table.

5,402 candidate pairs, 70 arrows

What this is: how many ordered pairs survive each filtering stage. What it isn't: a p-value. The FDR step controls the false-discovery rate across all pairs tested within a window; the stability step is a reproducibility requirement, not a significance level.

The relationships that were specified in advance

What this is: ten relationships written into the brief before the pipeline ran, and whether each came out stable in each variant. What it isn't: a scorecard where more passes is better. Several of these are expected to fail in the common-removed view, and that failure is the result.

P6 · Producer pricesWhat's in the pipe

Before a jar of peanut butter is a jar of peanut butter on a shelf, it left a factory with a different price on it. BLS measures both. P6 lines up 61 verified pairs of "this producer price ↔ this consumer price", measures how far apart in time the two have historically moved, and then asks one narrow arithmetic question: producer prices for these things recently moved by more (or less) than they usually do — if that carries through to the shelf the way it has carried through before, how many basis points are still to reach headline CPI over the following twelve months — counting only the pass-through that has not already landed?

Historical-relationship arithmetic, not a forecast. Nobody here is predicting the CPI. The calculation is a recent producer-price deviation multiplied by a coefficient estimated on the past, summed. It contains no view about demand, retail margins, inventories, the dollar or tariffs. It is also not causal: when producer beef prices rise and consumer beef prices follow, part of that is cost pass-through and part is both prices answering to the same herd, feed price and weather. The regression cannot separate them and does not try.

Pressure in the pipe

What this is: the sum, over the pairs where the question is answerable, of each recent producer-price deviation weighted by the pass-through it has not yet delivered — an innovation k months old keeps only (β₁₂ − βk)/β₁₂ of its effect — times β₁₂ times the item's share of the basket, in basis points of the headline. I.e. the CPI change still in the pipe from recent producer surprises, yet to reach the shelf over the coming ~12 months if history repeats. What it isn't: a next-month CPI pressure, a forecast, a decomposition of the CPI, or a statement about anything outside the corner of the basket it covers — the pairs that feed the total carry 9.7% of consumer spending, and shelter, about a third of the CPI, has no producer price at all. The figure is a running total of what is left to come, not dated to any particular future month.

What is making up that number this month

Note how small the weights are. The big-weight pairs are either lag-0 (gasoline 2.90%, electricity 2.49%, physicians 1.68%), weak (hospital services 2.17%) or covered by a finer pair (food at home 8.32%, apparel 2.37%), so the total is a sum over a genuinely small corner of the basket.

Method & exact definitions
The arithmetic, exactly
For a pair with best lag L at month m: base is the mean of the PPI month-over-month rate over the 60 months ending at m. Each of the L months ending at m contributes its deviation devm−k = ppi_momm−k − base, discounted by the pass-through it has already delivered: an innovation k months old keeps the factor (β₁₂ − βk)/β₁₂, where βk is the same local projection estimated at horizon k. The pair's contribution is Σk=0..L−1 devm−k · max(β₁₂ − βk, 0) · weight, which lands directly in basis points of the headline. This removes the double-count that a plain shock × β₁₂ would carry — β₁₂ is the cumulative 12-month response, so applying it in full to an innovation that has already passed through for months over-counts, and it also up-weighted longer-lag pairs mechanically. The freshest innovation (k=0) keeps almost all of its effect; one older than twelve months keeps none — the method assumes pass-through is essentially complete within a year. A pair whose response is entirely contemporaneous (β₀ ≈ β₁₂) contributes ~0: its moves are already on the shelf. The ±1 SE band uses |Σ dev·(β₁₂−βk)/β₁₂| · se(β₁₂) · weight, a deliberately conservative choice — the true SE of β₁₂ − βk is smaller because the two are estimated together.
β₁₂ — the pass-through coefficient
Jordà (2005) local projections: Σj=0..h cpi_momt+j = α + βh·ppi_momt + γ₁₋₃ cpi_momt−1..t−3 + ε, so β₁₂ is the cumulative pp response of the CPI item over 13 months to a 1 pp producer-price move. Overlapping horizons make ε an MA(h) process by construction, so the standard errors are Newey–West with a Bartlett kernel truncated at h + ⌊4·(n/100)^(2/9)⌋ and a small-sample factor — OLS standard errors would be meaningless here.
Lag 0 contributes exactly zero, by construction
22 of the 61 pairs peak at lag 0 — gasoline (ρ = 0.82), electricity, fuel oil, airline fares, milk, eggs, piped gas. For those the producer move and the consumer move land in the same month, so by the time the PPI print exists there is nothing left in the pipe and the pair contributes zero. That is the correct answer, not a coverage failure. The same applies to the 16 weak pairs (β₁₂ ≤ 0 or |β₁₂/se| < 1.96) and to the import-price overlays, which would double-count the PPI pair on the same CPI item.
One pair per CPI item, finer wins
The concordance deliberately nests (both "Meats" and "Beef and veal"). A pair is dropped from the sum — never from the tables — when another pair's CPI item is a descendant of it in the BLS item hierarchy.
The two bands
The ±1 SE drawn on the chart treats the β errors as independent across pairs. They are not — the pairs share macro shocks — so it is a lower bound, and the comonotone bound Σ|contrib_se| is printed beside it. Neither band allows for the βs being wrong in a regime sense, which is normally the larger uncertainty by a wide margin; that is what the rolling range in the pass-through table is for.
PPI is preliminary for four months
Every PPI index is recalculated with late reports at each release, so the most recent readings — exactly the ones this figure is built from — will move. The pipeline vintages them.

Pair by pair

What this is: the producer-price month-over-month rate, already shifted forward by that pair's best lag, drawn over the consumer-price rate for the same item — the last eight years, one facet per pair. What it isn't: a fit. The two lines are the raw inputs; no regression line is drawn, and a pair whose lines look unrelated is unrelated.

Each facet has its own vertical scale — the producer and consumer series for a pair are in the same units (percent per month) but not the same size, and a shared scale across facets would flatten every food pair to nothing next to gasoline.

Every pair, with its error bar and its range

What this is: all 61 surviving pairs, sortable, grouped by how confident the concordance row is. What it isn't: a ranking. NSA-demeaned pairs are not comparable with seasonally adjusted ones (the same rule P3 enforces), and the rolling range matters more than the point estimate — for new vehicles β₁₂ is 0.41 over the full sample and has run from −0.03 to 1.48 depending on the decade.

What the flags mean
weak
Full-sample β₁₂ is ≤ 0 or not distinguishable from zero at |t| < 1.96. 16 of 61. Several are relationships you would have bet on — dental care, hospital services, car rental, motor-vehicle maintenance. They stay in the tables and are kept out of the sum. A concordance that only reported its winners would be worthless.
CPI leads
The correlation at a negative lag beats the one at lag 0 — the consumer price is moving before the producer price, so the pipeline story does not hold for that pair. 16 of 61, three of them in the sum (poultry, fish and seafood, canned fruits and vegetables). Negative lags are an alignment diagnostic only and are never chosen as the best lag.
NSA-dm
BLS has discontinued the seasonally adjusted twin of that PPI series (or the CPI item has no SA index), so both sides have their calendar-month means removed over the estimation sample instead. A crude X-11 substitute — without it, a January producer bump and a January consumer bump would correlate whether or not one caused the other.
β₁₂ above 1
Seven pairs have the consumer price moving more than one-for-one — cereals and bakery products at 3.5 is the extreme. Not automatically wrong: the PPI series usually covers a slice of what goes into the CPI item, so a 1 pp move in the measured slice can accompany a larger move in the whole thing. It does mean "pass-through" is a loose word for those pairs.
Confidence
A property of the hand-built concordance row, not of the statistics: high means the producer series is the right upstream price for that consumer item, low that it is the closest available proxy. Imported-goods pairs — apparel, footwear, consumer electronics, much of furniture — are labelled med or low because the domestic PPI is measuring the wrong upstream price; the BEA import-price overlays are published next to them for that reason.

Producer-price context: final and intermediate demand

What this is: the PPI's own headline aggregates, 12-month changes, for context. What it isn't: comparable with the CPI, and deliberately not paired with any CPI item. Final demand includes exports, government purchases and capital equipment and excludes imports; lining it up against the CPI headline is apples to oranges.

P7 · Import exposureTariff-exposed vs domestic prices

Every item in the basket is made somewhere. P7 works out, for each of the 179 CPI leaf items, how much of a dollar spent on it ends up paying for something that crossed a border — then splits the basket into three groups by that share and builds a separate inflation index for each. Exposed (25% or more imported content) is 43 items and 12.6% of the basket; mid (10–25%) is 81 items and 19.9%; domestic (under 10%) is 55 items and 65.2%, dominated by shelter, medical care, education and personal services.

The current reading is the opposite of the naive story, and it is worth saying plainly. At 2026-07 the exposed tier is running at 2.79% and the domestic tier at 2.98% — the most import-intensive part of the basket is below the least import-intensive part, and below the headline replica at 3.29%. The fastest tier is the middle one (4.61%), which is largely composition: it holds new and used vehicles, food away from home and apparel. None of these three numbers measures the effect of a tariff on a price. They are re-weightings of published BLS item indexes — a fact about two groups of prices, whose cause could equally be the dollar, shipping rates, or goods and services having been on different paths since 2021.

Three baskets, one method

What this is: December-chained Laspeyres indexes over the same published item indexes, re-weighted by import-content tier, with the all-items replica for scale. What it isn't: a treatment and a control. Tier assignment is import content, not tariff exposure: a high-import item sourced entirely from a country that was never tariffed sits in the exposed tier anyway.

Method & exact definitions — how import content is measured
Direct import content of a commodity
sd_c = M[c, F01000] / U[c, F01000] — the import matrix over the Use table, both at producers' prices, on the PCE column, clipped to [0,1]. For the 127 of 402 commodities with negligible PCE use the denominator falls back to total use excluding BEA's negative imports-reconciliation column.
Embodied (indirect) imports — the Leontief round
mi = ΣM[·,j]/x_j per dollar of industry output, re-expressed per dollar of commodity output through the Make table, then run through the domestic commodity-by-commodity total-requirements matrix: t = mc·L. Total content is st_c = sd_c + (1 − sd_c)·t_c — the dollar splits into an imported part and a domestically produced part, and only the domestic part carries embodied imports. Industry and commodity output sums must exclude BEA's total row/column; including it silently halves every intensity.
Why the PCE bridge matters
The margin share of a consumer dollar is not a constant. The 2017 detail bridge puts the producer's share of the purchaser price at 12.5% for games and toys — nearly seven eighths of that price is transport plus wholesale plus retail margin — and at 73.8% for nonelectric cookware. A uniform "goods at retail ≈ 30–40%" haircut would have mis-stated import content by a factor of two at both ends of that range. Margins and transport are domestic services and carry only the embodied content of the trade and transport commodities (2017: wholesale 0.053, retail 0.041, transport 0.094).
2017, on purpose
BEA publishes the detail Use / Make / import / total-requirements set only for benchmark years, so exposure is measured before every tariff in the timeline. That is an advantage for the event study — the tier assignment cannot be contaminated by the tariffs being studied or by re-sourcing in response to them — and a limitation for the descriptive series: any supply chain that moved after 2017 is mis-classified, in the direction of overstating exposure for anything that reshored. The 2007 and 2012 bases are computed too; mean share across the 179 leaves is 0.190 / 0.197 / 0.177.
Where the cutoffs sit
0.25 and 0.10 on total share, and they are not percentile splits. The distribution is bimodal — services and shelter pile up below 0.10, durable goods above 0.25 — so the cuts fall in the sparse middle. Moving the high cut to 0.30 would move 12 items; to 0.20, 21 items.
Coverage gate and the October hole
A month is dropped unless leaves carrying 90% of the tier's weight have both a December base and a current index. October 2025 (no CPI release) fails for every scheme; November 2025 additionally fails for the mid tier at 86.0% coverage, so the mid line has a two-month hole where the others have one. That is the gate working on a narrower weight base, not a bug. The all-items replica matches P1's official_replica to 0.0000 pp at every month.

Which items are import-intensive

What this is: the 179 leaf items, area = share of the basket, fill = total import content of a consumer dollar. Computers top the list at 0.59. What it isn't: a measure of where an item is made. BEA allocates a commodity's imports proportionally across its users, so this is the import share of an item's commodities, not of the specific varieties in the CPI sample.

Event study Tier 2

Read the pre-trend flag before the coefficient, and read this caveat before either. The headline result — the April 2025 universal 10% reciprocal baseline — is a cumulative +2.33 pp exposed-minus-domestic gap over the following year with a HAC standard error of 1.29 pp. That is about 1.8 standard errors: suggestive, and not significant at conventional levels. It also bundles six other tariff actions that took legal effect in the same month — monthly CPI cannot separate them — in a month that saw the largest equity and dollar moves of the year. It is not an estimate of the pass-through of a 10% tariff.

What this is: per-horizon coefficients on the weighted exposed-minus-domestic gap in demeaned month-over-month inflation, with the cumulative path from month 0, for one selected action. What it isn't: a clean experiment. With 28 events in 100 months most ±24-month windows contain other events, and each regression treats the others as noise.

All 25 estimated events, with the pre-trend test

10 of the 25 fail the pre-trend check, and they are shown rather than filtered out. The failures cluster in two places, both informative: the 2018 Section 301 lists, where the goods–services gap was already narrowing, and late 2025 / 2026, where the exposed-domestic gap was trending steadily and any event dropped into it inherits that trend.

Events from mid-2025 onward have very few post-event months, so their cumulative windows are truncated and their standard errors are correspondingly small and not comparable with the earlier rows.

Method & exact definitions — the estimating equation
The dependent variable
G_t = Σexposed w·x / Σw − Σdomestic w·x / Σw, where x is an item's NSA month-over-month change minus that item's own mean for that calendar month, computed over all months more than 12 away from the event so the event cannot demean itself away. NSA throughout, for both legs — mixing SA items with NSA-fallback items would put a seasonal wedge straight into the difference.
The regression
±24 months around the event; dummies for relative months −6…+12 with −24…−7 as the omitted baseline; Newey–West HAC standard errors, 6 lags. The cumulative 0…+12 effect and its SE come from the full coefficient covariance — which is why the cumulative path on the chart carries an interval only at its endpoint. Constructing a band for the intermediate horizons would mean inventing the covariance the pipeline does not publish.
Pre-trend test
OLS slope of G_t over relative months −6…−1 with HAC(2) standard errors; flagged as failing when |t| > 2. A failure says the two tiers were already diverging before the action.
Event selection and bundling
87 timeline rows → 28 events → 25 estimated. A row is eligible if its confidence is high or medium and |ad-valorem change| ≥ 5 pp. Each month contributes at most one event, chosen by duty impulse (|rate change| × annual import value covered), not by the largest rate change — a 50 pp rate on one partner moves the consumer basket far less than a 10 pp rate on everything. Every other row sharing the month is listed as a bundled action. Import values rank events and are never published as facts about trade volumes.
Known weaknesses, in the pipeline's own words
Tier assignment is not treatment assignment. Windows overlap. One-per-month bundling is a real loss of resolution, not a technicality. And the exposed tier is durable-goods heavy while the domestic tier is shelter heavy, so anything that moves durables relative to shelter shows up here regardless of trade policy.

The tariff timeline

What this is: the hand-curated source table everything above is keyed on — the date duties began to be collected (not the announcement date, which the press reports and which differs by weeks), the change in the ad-valorem rate rather than the level, and a primary source for each row. What it isn't: automatic. There is no machine-readable feed of US tariff effective dates with rates and there never will be; every row was read out of a Federal Register or USTR document by hand.

Rows whose rate is shown as varies are single legal actions that changed dozens of rates at once; inventing one number for them would be worse than admitting it, so they are published and excluded from the event study. Court rulings that vacate or stay tariffs get rows at 0 pp — they are events even though they are not rate changes. Actions that were announced but never took legal effect are deliberately absent: the October 2025 100% pharmaceutical tariff, the August 2025 100% semiconductor tariff and a January 2026 wood/furniture step-up that was postponed a year were all widely reported as if they had happened, and none of them is in this table.

P9 · Metro areasYour city vs the average

National inflation is an average and the average is not what anybody pays. The CPI is priced in 23 metro areas large enough to get their own published index, and those 23 numbers spread out a long way — in July 2026 from +1.9% (Tampa) to +5.6% (Urban Hawaii) around a population-weighted mean of 3.5%. This section puts each metro's inflation rate next to two things people feel locally: what local pay did, and what the local rental market did.

Only 3 of the 23 metros publish an all-items index every month — New York, Chicago and Los Angeles. The other 20 publish every other month, split into two staggered groups of 9 and 11, so the cross-section alternates between 12 cities and 14 different cities and the average can move a quarter of a point purely because the cast changed. Every chart here reports only the metros that actually published that month, and flags the months where the swap is visibly moving the average. Nothing is ever interpolated. Shelter and rent are the exception: they are monthly for all 23 — the housing survey runs monthly everywhere even though the general commodity and service pricing does not.

Did pay keep up, by metro

What this is: local average weekly wage growth minus local CPI, in percentage points, for the latest quarter both exist. What it isn't: anybody's paycheck. QCEW wages are per covered job, not per person; they include bonuses, and they move with employment composition — a metro that sheds low-wage jobs shows wage growth without anyone getting a raise. The CPI basket is the average urban consumer's, not the average worker's, and the two populations are not the same people.

Method & exact definitions
Wages lag by 7–8 months, and it is structural
QCEW posts a quarter roughly 5–6 months after it ends, so the newest wage quarter here is 2025Q4 against CPI through 2026-07. The real-wage panel will always trail the price panel by two to three quarters. This is not a stale build.
The 2025Q3+ ownership fallback — read this before comparing quarters
MSA-level private average weekly wage is suppressed for every MSA from 2025Q3 onward (disclosure code -, published as literal zeros, which is why they are stored as nulls rather than as a −100% change). Those quarters fall back to total covered employment, which includes government. Where both bases exist they differ by 0.34 pp on average, so the latest cross-metro ranking sits on a slightly different footing than earlier quarters. The last fully private-basis quarter is 2025Q2, whose ranking is led by Urban Alaska (+3.8 pp), Phoenix (+3.5) and San Francisco (+3.4) with Seattle (−2.1) and Los Angeles (−1.5) at the bottom — a broadly similar picture, which is reassuring. A year-over-year change is never taken across bases.
Matching a quarterly wage to a monthly price
The CPI reading for a quarter is the last month inside that quarter for which the metro actually published. Always inside the quarter, so no information leaks in from the next one; always the freshest reading available; and data-driven rather than schedule-driven, so it self-corrects when BLS reassigned bimonthly slots in the 2018 revision and when a month is missing. The October 2025 hole is visible in it: every even-schedule metro's 2025Q4 row resolves to 2025-12, every odd metro's to 2025-11. real = wage_yoy − cpi_yoy; the exact ratio form differs by under 0.1 pp at these rates.

CPI rent vs the asking-rent market — omitted here

This panel compares each metro’s CPI rent of primary residence against the Zillow Observed Rent Index. Zillow’s terms of use do not permit republishing or displaying values derived from ZORI, so it is not part of this public copy. The pipeline (pipelines/p9_metro.py) is unchanged and records the exact source file, so you can download ZORI from Zillow under their own terms and reproduce this panel in full.

How far apart are cities?

What this is: the population-weighted standard deviation of the 12-month all-items change across whichever metros published that month. What it isn't: a like-for-like month-to-month series — adjacent months hold different cities. The marked months are where the pipeline measures the panel swap moving the mean by more than 0.3 pp.

Method & exact definitions
The composition flag
comp_delta = mean[t] − mean(mean[t−1], mean[t], mean[t+1]), flagged when |comp_delta| > 0.3 pp. Because t−1 and t+1 carry the complementary panel, the three-month centred average is close to composition-neutral and the residual is the composition effect. It is null — and the flag with it — when either neighbour is missing, including the months either side of the October 2025 hole and the latest month. 15 of 212 months are flagged, clustered exactly where you would predict: mid-2022 to mid-2023, when metro rates were furthest apart and the swap mattered most. The sign alternates — 2022-06 +0.73, 2022-07 −0.59, 2022-08 +0.49, 2022-09 −0.35 — which is the signature of a composition artefact rather than of inflation. In that stretch the even panel (Phoenix, Miami, Atlanta) ran roughly a point hotter than the odd panel (New York, Boston, Washington).
Rules
Only metros with a published value that month enter the cross-section, and at least 8 are required. Weights are constant 2020 CBSA population. The series starts 1998-01 because BLS redefined the metro pricing areas in 1998 and again in 2018; before 2018 it covers 20 metros, not 23, on the earlier definitions.
What a metro difference is worth
Metro indexes are built on much smaller samples than the national index and carry materially larger sampling error. A 0.3 pp difference between two metros in one month is not a finding. Metro CPI is also NSA only — there is no seasonally adjusted metro CPI at all — so only 12-month changes are used here and month-to-month moves are not comparable with the seasonally adjusted national headline.

P5 · Instrument healthHow healthy is the measurement

This section is about how the CPI is being collected, not what it says: how much of the price data is actually observed, how much is imputed, and what BLS has publicly announced about its own collection.

The distinction everything here depends on: the share of imputations is not the share of the index imputed. BLS says so in plain text on the source page — "They do not represent an overall imputation rate for each survey." A different-cell share of 37% means that of the observations BLS had to impute, 37% used a wider donor pool instead of the preferred same-item-same-area cell. It does not mean 37% of the CPI was imputed, and it does not mean 37% of anything was guessed. There is no number in any of these sources that supports "X% of the CPI is guessed."

Imputation and response rates vs the 2019 baseline

What this is: four monthly BLS collection statistics, plotted either as published levels or as percentage points above their own January–December 2019 mean. What it isn't: a measure of error in the CPI. An imputed quote borrows a measured price change from similar items; it does not invent a price level.

Scale:

Part of the decline in collection rates is by design. BLS cut the collection sample in 2025, so targeted quote counts fall alongside collected ones — targeted C&S quotes are down about 11% on 2019 while collected quotes are down about 27%. This is a budget and policy change, not purely a wave of refusals. October 2025 is blank in every monthly source (lapse in appropriations); it is omitted, never interpolated and never carried forward.

Method & exact definitions

Instrument stress indicator, in percentage points above 2019

What this is: an indicator of how far the collection environment has moved from 2019, averaging four imputation-quantity and imputation-quality components across two domains. What it isn't: an error bar, a bias estimate, or a correction to the CPI. It has no units of inflation. A high value means more of the index rests on imputation than in 2019; it says nothing about the direction of any resulting error.

Markers on the chart are BLS CPI notices flagged as collection, shutdown, COVID or data-quality events. Hover or focus a marker for the notice title.

Method & exact definitions

Read the magnitude carefully. 2019 was a very flat year — the component standard deviations are 0.83–1.19 pp, and the imputation shares are published as whole percents, so part of that SD is just rounding. Dividing a ~15 pp move by a ~1 pp baseline SD gives z-scores in the teens and thirties. Those are not sigmas in any probability sense — the series are trending and autocorrelated, so a Gaussian tail reading is meaningless. Read the shape and the ordering, and quote the percentage-point version, which is what is plotted here.

Published standard errors have barely moved

What this is: BLS's own annual median standard error of the published 12-month price change, by item, indexed against 2019. What it isn't: a total error. These are sampling error only.

This is the most important nuance in this section. All-items SE inflation versus 2019 is modest and below the 2022 peak, even though imputation roughly doubled. The risk created by falling response is nonresponse bias, which no BLS series here quantifies and which would not show up in these standard errors. "The SEs barely moved" is not evidence that nothing happened; it is evidence that the SEs are not measuring this.

Method & exact definitions

"BLS variance tables: the median (across the year's published changes) standard error of the CPI price change, by item and horizon, U.S. city average. Published annually, one value per calendar year." Standard errors are deliberately not part of the stress composite: an annual number cannot be z-scored against a 12-month 2019 baseline.

BLS collection notices

What this is: BLS's own published notices about CPI collection, shutdowns, COVID impacts and data quality, scraped from the notices index. What it isn't: an analysis of them — only title, date and URL are stored, never the body. Re-read the notice itself before quoting one.

ProvenanceMethod & sources

Everything on this page is rebuilt from published BLS files by pipelines that re-run daily. Nothing is hand-entered.

Data files behind this page

Each panel reads a JSON written by its pipeline. The server aliases /data/ to the pipeline output directory, so this page always shows the most recent successful run.

Primary sources

Specification & documentation

  • CPI Lab specification artifact
  • docs/BRIEF.md — builder brief: runtime, tables, gotchas, house rules
  • docs/P1.md — the frequency-weighted CPI (schemes, bill floor, sensitivity, bootstrap)
  • docs/P2.md — the shape of inflation across items (statistics, variance decomposition)
  • docs/P3.md — item-level persistence, sticky/flexible construction, the nsa12 artefact
  • docs/P4.md — revision ghosts: vintages, transition matrices, the "within 1.5 SE" flag
  • docs/P5.md — CPI instrument health / data quality
  • docs/P6.md — PPI → CPI pipeline pressure: the concordance, the lag map, local-projection pass-through
  • docs/P7.md — tariff-exposed vs domestic prices: import content from the BEA I-O accounts, the tiers, the event study and its maintenance cost
  • docs/P9.md — metro CPI vs local wages and rents: the bimonthly stagger, the quarter-matching rule, the ZORI lag profile
  • docs/P8.md — C-CPI-U vs CPI-U, the substitution gap and its three publication stages
  • docs/P10.md — the lead–lag map: universe, variants, stability filter, sanity expectations
  • research/R1_expectations.md — does the frequency-weighted CPI explain the expectations gap? (No.)
  • docs/SITE.md — how this page is deployed and what each panel reads

Known gotcha that shapes every chart here: October 2025 has no CPI (lapse in appropriations). Every lag is calendar-aligned rather than row-offset, so November 2025 month-on-month and January 2026 three-month-annualised figures are missing by design rather than shifted, and October 2025 is a genuine hole in every line on this page.