Methods
Technical Notes on the Reconstructed ALICE Series
How to reproduce the reconstruction. What was documented, what I recovered from the data, what I had to fit, and what I could not do at all.
This is the technical companion to I Reverse-Engineered the ALICE Methodology with Fable 5. That post reports what I found. This one is written so that someone else can reproduce it: every rule I recovered, the arithmetic behind it, the tests it has to pass, and the places where I could not get there. If you want to rebuild this yourself, or check whether I got it right, this page is the specification.
Everything below describes my own independent reconstruction of United For ALICE's survival-budget methodology. These are not United For ALICE's official figures. I call the result the Reconstructed ALICE Series. Its county and community output is in the interactive map.
One note on the word "I." The reconstruction was built by Fable 5, working under my supervision. I set the problem, chose the sources, wrote the gates before any code existed, decided every judgment call, and checked the output. Fable 5 did the identification work and wrote the code. This page says "I" throughout because the decisions and the responsibility are mine. The labor was not.
Why the problem was solvable at all
United For ALICE publishes two things that, taken together, make their method recoverable.
The first is a method described in prose. Six methodology PDFs across three report cycles, each naming its sources, percentiles, age bands and multipliers, but not the arithmetic that binds them together. The second is roughly three thousand answers every year: every county in the country, each with a Household Survival Budget and an ALICE Threshold.
My starting observation was that this combination makes the problem over-determined rather than under-determined. A dozen or so unknown parameters against thousands of published equations is not an estimation problem in the usual sense. The right rule can be identified exactly rather than estimated. A wrong candidate does not fit slightly worse than the right one. It fails on structure, and the pattern of the failure is what identifies the rule that is correct.
So the goal was never to fit a model of ALICE. It was to recover the function ALICE runs, and then evaluate that function on the years where it was never run.
Three regimes, defined by data year
Their method changed twice in the window I care about. Everything below is organized by data year, not report year, because that is the axis the rules actually follow.
| Regime | Data years | What defines it |
|---|---|---|
| R0 | 2021 and earlier | Standard Fair Market Rent (the HUD rent standard, FMR from here on) plus a metro uplift; utilities stripped from gross rent and added back; a 30% poor-health multiplier on both premiums and out-of-pocket costs; no broadband; published thresholds rounded to a short list of preset income levels |
| R1 | 2022 only | Exact dollars replace the preset-level rounding; health multiplier drops to 19% and applies to out-of-pocket only; broadband added; unlimited-data phone plan |
| R2 | 2023–2024, current | Housing moves to 110% of FMR with Small Area FMR substitution and a one-way 2022 rent floor; car insurance source changes |
The reconstruction target is R2. I fit against data years 2023 and 2024, then applied R2 to the 2010–2021 inputs. R1 is a single-year regime I deliberately did not reproduce, for reasons in the limits section.
One term I use throughout. The seam is the discontinuity in United For ALICE's own published series at the 2021 to 2022 boundary, where thresholds stopped being rounded to preset levels and became exact dollars. The seam test decomposes their published 2021 to 2022 jump into three parts: real cost change, the change in method itself, and the residual from the housing rule that changed the following year.
What was actually public
| Input | What I used | Note |
|---|---|---|
| Methodology text | Six PDFs: Jan 2019, Jan 2020, Apr 2023 (last R0), 2024–25 (R1), May 2025 (R2), June 2026 | Keep the May 2025 edition. It is the only one carrying inline Update: markers dating its own changes. The June 2026 edition deleted them silently, same rules, no changelog |
| Published targets | State data sheets, live download plus archived vintages from four report cycles | 558 rows |
| Component panel | United For ALICE's undocumented but anonymously accessible JSON data service: county × household composition × component × year | 2022–2024 only. It returns empty for every earlier year, so there is no hidden pre-2022 component series |
| Housing | HUD FMR history (FY1983 onward) plus Small Area FMR (FY2019 onward) | Solved back to 1983. The largest component is the easiest one |
| Food | USDA Thrifty Food Plan bands plus Feeding America's Map the Meal Gap county Cost-of-Food Index | The county index I had to request manually |
| Child care | State Market Rate Surveys (Hawaii resolves by county, every two years) | The hardest input to source. No county series for 2023–24, and none for Hawaii before 2011 |
| Health care | MEPS-IC employee contributions, 1996–2025 (the federal employer health-insurance survey), Consumer Expenditure Survey out-of-pocket costs, and CMS chronic-condition costs | Their own footnote documents a 2007 interpolation, which I reuse |
| Taxes | Atlanta Fed Policy Rules Database plus IRS and state statute | The database is a current-law snapshot. This matters, and I come back to it |
| Demography | American Community Survey: B19001 income brackets, B11001 household counts, B25007 tenure by householder age, B25010 average household size, and B19037 householder age crossed with income |
Keyless route only |
The component panel is what changed the shape of the problem. For 2022 through 2024 I did not have to infer their component values. I could read them, county by county. So the task narrowed to recovering the mapping from public inputs to known outputs, and then running that mapping where no output exists.
Three tiers, kept strictly apart
Every rule in the reconstruction sits in exactly one of three tiers. Keeping them separate is the most important discipline in the project, because it is what stops something I fitted for convenience from being quoted later as a documented fact.
Tier 1, stated and reproduced. Rules United For ALICE documents, which I implemented and which then reproduce their published values with no adjustment. The assembly arithmetic is here, and it is short: MISC = 0.10 × (sum of the cost lines), then PRETAX = BASE + MISC, then annualization. That is verified exact on every cell of the component panel. So is the housing rule, and the child-care cut at the 75th percentile of registered family child-care homes.
Tier 2, recovered from the data. Discrete rules that are not correctly stated in the documentation, identified by testing candidates against the published cross-section, and which then hold exactly. This is the tier that makes the work more than curve-fitting. It includes the household-size step function, the food vintage, the rule that 34 counties nationally price transportation on transit rather than car ownership (Honolulu is one of them), the fact that Hawaii's food index enters relative to Honolulu rather than the national average because USDA's Hawaii food plan is already Honolulu-priced, and a reliability guard on the household-size step that fires in about 1.1% of cells.
Tier 3, genuinely fitted, plus one substitution. Free parameters with no public source, fitted against the published cross-section and labeled as fitted everywhere they appear: vehicle costs, the technology line before 2022, the senior chronic-condition line, and one food scale factor per state. Hawaii's food scale is 1.021, so the documented rule nearly closes. Ohio's is 1.444, which means their mainland food line sits about 44% above what their own cited Thrifty Food Plan implies. Nothing documented explains that. I carry it as a single number per state rather than as 93 county-specific ones, so that the county pattern and its history stay fully public.
The tax engine belongs in Tier 3 as a substitution rather than a replication. Their taxes come from the Atlanta Fed database. Mine are built from statute. The median error on the tax line is 0.85%, which is close, but it is knowably a different object and it is labeled that way everywhere.
How recovery actually worked
Component by component, in dependency order, the loop was the same four steps. Hypothesise a candidate rule, from the methodology text, from a rival methodology such as MIT's Living Wage or the Self-Sufficiency Standard, or from the structure of the source data. Implement it as a function of public inputs only. Score it against the whole published cross-section rather than one county. Then discriminate between the candidates that survive, using sub-dollar residuals and cross-county patterns. I ran that loop with Fable 5, which is what made it practical to test many candidate rules against thousands of cells instead of a handful.
Two county counts run through this work and they are not interchangeable. Validation uses 93 counties, 88 in Ohio plus all five in Hawaii, Kalawao included, because I do reconstruct its published thresholds. The hardship series and every aggregate use four Hawaii counties, with Kalawao excluded. About 80 people live there, and its household-size and income-bracket inputs are degenerate at that population.
The fourth step is where most of the identification happens, and it depends on one lucky detail in the published files. The 2024-cycle data sheets print data-year-2022 thresholds as un-rounded decimals, Honolulu at 85707.625181 where later editions print 85708. Of 186 overlapping cells, 153 differ by up to fifty cents. Integer targets cannot discriminate between candidate arithmetics that agree to the dollar. Sub-dollar residuals can. The caveat is that this precision exists for data year 2022 only, which is R1, so the highest-precision target and the regime I most want to test are different years.
The household-size rule their documentation gets wrong
The threshold is not a weighted average of the archetype budgets. It is a step function. Compute the average household size for the relevant population, then select the archetype budget whose size bracket contains it.
The question was which denominator feeds that average. The R1 and R2 text says "the total number of households." The R0 text says households headed by someone under 65. If the newer text were right, another regime change happened in 2022.
That is a testable difference, so I computed the threshold both ways and compared to published values county by county. The quantity I need is avgHH_u65 = pop_u65 ÷ HH_u65, and the denominator is the whole question. Built as HH_u65 = B11001_001 − Σ(B25007 rows with a householder 65 or older), on single-year survey data for the counties that publish it, it reproduces the published threshold exactly, to the dollar, in three of Hawaii's four populated counties, with the fourth explained by the documented reliability guard. The literal reading of the newer text does not reproduce it. Two counties sit right at the bracket boundary of 3.5, and both land exactly. The senior rule, min(SSB(1A) × avgHH_65, SSB(2A)), where SSB is the survival budget for a given household composition and 1A and 2A are the one-adult and two-adult archetypes, reproduces to the dollar in four of four.
So the denominator never changed. The 2024–25 text is a drafting error. This was the unknown I had nominated as the hardest one at the start. It turned out to be documented, and the documentation turned out to be wrong in a way the data settles.
The food vintage, identified by regression
Feeding America publishes a county Cost-of-Food Index every year. Which vintage sits inside a given ALICE budget is not correctly stated anywhere.
For each candidate vintage from 2010 to 2023, I regressed the published 2022 county food line on the county index of that vintage, and recorded the coefficient of variation of the implied per-county factor. If the vintage is right, that factor should be one constant for the whole state, and its dispersion should fall to the joint rounding floor of the two sources.
| Vintage tested | Variation, Hawaii | Variation, Ohio |
|---|---|---|
| 2020 | 0.48% | 0.54% |
| every other year | 2.5% or more | 2.5% or more |
That is not a marginal preference between candidates. It is a step change, cross-checked on 88 Ohio counties independently of Hawaii's five. And the same 2020 index is still inside the 2023 and 2024 budgets, which makes it a two-year lag, frozen, against a text that says one year.
This is the general shape of a Tier 2 identification: find a statistic that falls to the measurement floor for the true rule and stays high for every alternative.
The rent floor, found in one county
R2 installs a one-way floor. If measured rents fall, the housing line keeps the higher 2022 value. The rule is stated. Its anchor year is not.
Maui County gave me the clean case. Its published housing line is frozen at exactly the same two values across 2022, 2023 and 2024, while Honolulu's rose about 20% over the same three years. A line that is perfectly unchanged across a change in method is the floor binding: Maui's FY2023 and FY2024 rent standards came in below its 2022 value, even at 110% and even with the Small Area substitution. One county, three observations, a small candidate set.
It is also a finding in its own right. A rule whose stated purpose is to avoid understating hardship is, in this county and this window, understating it. The window is the two years in which Maui's housing situation changed most.
How I checked it
The gates were written down before the code was, so that they could not be loosened afterward. The instruction on failure was explicit: do not loosen the gate. Widen the offending component to a band, propagate it, and re-report accuracy as interval coverage.
Two runs are easy to confuse, so to be precise about which is which. The production fit uses data years 2023 and 2024 together, and every number in the table below comes from that fit, except G8. G8 is a separate holdout: refit on 2023 alone, then predict 2024 and score the prediction.
| Gate | Target | Result |
|---|---|---|
| G0 assembly identities | 99.5% exact or better | 100% |
| G0b threshold from their own budgets | 90% exact, median 0.5% or better | 92.5% exact, 0.0006% |
| G1 median error, all counties | 2.0% or better | 0.153% |
| G2 90th percentile | 5.0% or better | 0.754% |
| G3 Hawaii, both household types, both years | 3.0% or better each | 3.72% worst case, Kauai 2024. One cell fails |
| G4 senior threshold accuracy | 2.5% median or better, deliberately looser because senior health inputs are coarser | 0.151% |
| G5 bias, median signed | within 0.5% | −0.0001% |
| G6 cross-sectional correlation | 0.995 or better | 0.998 and 0.999 |
| G7 per-component within 5% | 90% or better per component | Food 100%, taxes 95.4%, all others 98% or better |
| G8 fit 2023, predict 2024 | 3.0% or better | 2.30% |
| G9 archetype bucket recovery | 95% or better | guard fires in 1.1% |
G7 and G8 are the two that matter. G1 through G3 can be passed by a well-tuned wrong model. G7 forbids component errors in opposite directions from summing to a good total, and it is a county-level gate rather than a state-level one, which the component panel is what makes possible. G8 forbids overfitting to a single cross-section.
"Exact to the dollar" is a real test here, not a figure of speech. G0 and G0b feed their own published component values into my assembly and threshold code. If the arithmetic is right the output is not close, it is identical. That isolates the composition rule from every question about inputs, which is why it is set as an exact-match gate rather than a tolerance.
One number in that table got worse on purpose. An earlier build read the county food factor off their data service, one number per county, which produced 0.00% median error on the food line by construction. Rebuilding that line from USDA and Feeding America with one fitted state scale moved it to 0.311%. That is a degradation of about a third of a percentage point, and it is the number I report. Honest degradation beats forced improvement. What it buys is a food line whose geography and history can be audited from public files, and a headline that no longer depends on the largest carried assumption in the build.
Component errors as they stand, median and 90th percentile: housing 0.000 and 0.522, child care 0.000 and 0.000, food 0.311 and 0.963, transportation 0.000 and 0.245, health care 0.000 and 0.000, technology 0.000 and 0.000, miscellaneous 0.000 and 0.431, taxes 0.846 and 3.185, monthly total 0.142 and 0.512.
Running the method backwards
The forward model is fitted on R2. The backfill applies R2 rules to each year's inputs from 2010 to 2021. Six rules govern it. Four of them matter most.
Apply the R2 component rules, not the rules that were in force at the time. That is the entire point of the exercise: 1.10 × FMR_t for each year's rent standard, the 19% multiplier on out-of-pocket costs only, and utilities left inside HUD gross rent.
Do not apply the one-way rent floor before 2022. It is a forward-only floor anchored at 2022, and applying it backwards would raise every historical year to the 2022 rent level, which is the same error I am documenting, in the opposite direction.
Where a component did not exist in a given year, price it anyway. Broadband was purchasable in 2010 even though they did not budget for it. R2 includes it, so an R2-consistent 2010 budget includes 2010-priced broadband. Zeroing it out would create a break in method inside my own series.
Where an input has a break of its own, disclose it and do not smooth it. The Thrifty Food Plan's 2021 re-evaluation raised the level about 21%, and under R2's own rule that is a real price change. I carry it, flag it, and ship a frozen-plan sensitivity beside it. The 2021 expanded Child Tax Credit produces a large, real, one-year drop in the threshold under R2 rules. That is a finding, not a bug, and it must not be smoothed either.
Uncertainty. Per-component sigmas are combined by share-weighted quadrature, with one deliberate asymmetry. Fit residuals are treated as independent across components, while errors from input fallbacks are treated as perfectly correlated within a component across years, because a child-care level that is wrong is wrong the same way every year. The consequence matters more than the arithmetic. The level band is wide, a median of plus or minus 3.57%, dominated by child care at 10% ordinarily and 20% in the four Hawaii years with no contemporaneous survey. The band on changes is much narrower, because correlated errors cancel when you difference two years. Most of the argument is about changes, so the narrow band is the relevant one.
The food sigma is not a guess. The text states a one-year lag and the data shows two, so I run both as full backfills and their disagreement is the county-year food sigma, in quadrature with a 2.08% floor.
The preset-level rounding is a different kind of number. Pre-2022 thresholds as they published them are rounded to a short list of preset income levels, and they are not the same kind of object as a 2022-onward exact-dollar value. So the reconstruction produces two outputs per pre-2022 county-year, the continuous budget and its rounded image, and the two must never be conflated. The rounded image supports one corroboration test: does my rounded value equal the cell they published? The hit rate is 77.1%. That test is weak by construction, because the preset levels are $5,000 apart below $50,000 and $15,000 to $25,000 apart above it, so it can falsify but never confirm. I report it anyway.
Ten data years, not fifteen. This one surprised me. United For ALICE has never published data years 2011, 2013, 2015, 2017 or 2020 for any county. Their sheet carries exactly ten: 2010, 2012, 2014, 2016, 2018, 2019, 2021, 2022, 2023 and 2024. The backfill is built on that same grid. Those five years exist in my output as rows with null estimates so that the grid stays complete and predictable, and they are not interpolated. Anything needing a dense annual series has to interpolate downstream and own that choice.
The two corrections I had to make
Measuring one thing consistently for fifteen years is difficult, and I got it wrong twice before I published anything.
The first was in the backfill itself. It was splicing their own 2023 housing-rule change: the pre-2023 years were built on the old rent rule while 2023 and 2024 used the 110% rule, so part of what I was measuring as a cost increase was actually their change in method. That is the same class of error I set out to document, committed inside my own series. I restated the whole backfill on the new rule from end to end. The figure measured the same way in every year moved from +7.05 points to +5.13, which is what a nearly two-point error looks like when you find it.
The second was in the counting. They publish two budgets, a working-age one and a lower senior one, and about a third of Hawaii's household heads are now 65 or older. My first estimator scored every household against the working-age budget. The fix splits households by B19037, the Census table that crosses householder age with household income, which sums to B19001 exactly in all 60 county-years, so it is an exact partition of the table the earlier estimator already used rather than a reweighting. Scoring each age group against its own budget cut the 2010 to 2023 rise from +5.13 points to +2.66. Roughly half of what I had been reporting was Hawaii aging rather than Hawaii getting less affordable.
Both corrections moved the headline in the direction of a smaller finding. I am reporting them here because the second one in particular would have been easy not to look for.
Where the numbers stand
Current figures, with each age group scored against its own budget, and the window stated every time because the two are close enough to confuse:
- +2.66 points, 2010 to 2023 (41.77% to 44.42%)
- +2.38 points, 2010 to 2024 (41.77% to 44.15%)
- United For ALICE's own printed share, for comparison: +2.02 points, 2010 to 2023
The +7.05 and +5.13 figures above are history. They were the single-budget series, from before the restatement and before I scored each age group separately, and neither should be quoted as current.
The senior-only series is measured here for the first time, 47.0% in 2010 to 42.5% in 2024. They have never published it.
Input problems that cost me real time
Every one of these is a place where the data looked fine and was not.
Empty spreadsheet tabs with populated-looking names. The Atlanta Fed database ships a federal EITC workbook containing a tab literally named ruleYear2023 that is empty. Four of its eight Excel exports are shells like that. Anyone reading tab names concludes the target year is covered. Verify row counts, not tab names.
A stale file served at the wrong path. Fetching the benefit-parameters file from that repository's root returns HTTP 200 and serves a different, older file than the correct one in its parameters directory. A restore from the root path installs wrong data with no error at all. Verify checksums.
Map the Meal Gap changed its own basis. Feeding America recomputed the national cost-per-meal in the 2025 edition and did not restate earlier years in the distributed file. Read straight off the spreadsheet, US food costs appear to fall 10.3% from 2022 to 2023, where on a consistent basis they rose 3.8%. Their team asks users to read the technical brief first, and doing that is what surfaced it. Use only the within-year index, which cancels the national scalar exactly.
A rename broke their own cited URLs. USDA's Food and Nutrition Service became the Food and Nutrition Administration in June 2026 and the old content delivery network was retired, so both food URLs cited in the May 2025 methodology now return 404. The files are still public under the current scheme.
Ohio's first taxable bracket carries a $360.69 base amount. Liability jumps from zero to about $361 at $26,050 of taxable income. A reconstruction that just accumulates marginal rates is wrong by roughly $361 for every Ohio household above that line, which is most of the ALICE range.
Some paywalls are only a bot wall, and some bot walls are not paywalls. Two sources I needed return 403 to scripted clients but are freely readable. The Census API is now key-gated and returns a missing-key page through a redirect for anonymous requests. The right response is not to hunt for a key, it is to use the keyless table API.
What this does not claim
A reconstruction this close to exact starts to feel authoritative, and it is not their number.
The tax engine is a substitution. They run the Atlanta Fed database. That database is a current-law snapshot with no historical series, and its earliest recoverable state is around mid-2024, so there is no path to 2010-era rules through it. Mine is built from statute, and it is knowably a different object. For the forward years, rebuilding the tax line from their source rather than from statute is the better target. For the backfill it is impossible.
Ohio local income tax is a floor on the Ohio residual. Ohio households pay municipal and school-district income taxes averaging about 1.56%, which is larger than the gap between the state's zero band and its 2.75% bottom rate, and the ALICE methodology mentions no local income tax at all. Worse, those boundaries cross county lines, so a county-resolved reconstruction is wrong on both incidence and rate with no well-defined county aggregation available. This is moot for Hawaii, which has no local income tax, so it is an asymmetry between my two pilot states rather than a shared problem.
One cell is unidentified. Kauai's published threshold implies an average household size of 3.8473, which matches none of the obvious survey candidates. It is the single cell that fails G3, at 3.72% against a 3% target. With about 3,000 counties nationally, the subset where that guard fires should be large enough to identify what quantity is being substituted from its distribution.
Still fitted rather than sourced: vehicle parameters, the technology line before 2022, the senior chronic-condition line, and one food scale per state.
Child care is the binding constraint on the backfill. No county price series exists for 2023–24, and none for Hawaii before 2011. Four Hawaii data years carry extrapolated surveys at double sigma.
Two 2022-only rules found and deliberately not copied. Ohio's 2022 tax line is solved as a gross-up rather than in the single pass I verified for 2023 and 2024, and Hawaii's 2022 tax line contains no Hawaii state income tax at all, which is present again in 2023. Both mean the published 2022 Hawaii figures are understated. Neither is copied into the reconstruction, because the whole protocol is R2 rules on each year's inputs.
On the data service and on courtesy. The component data service is undocumented but anonymously accessible. No credential, agreement or permission gates it, and everything here is labeled as my reconstruction rather than as their figures, so no permission is required. I send United For ALICE a heads-up before publishing anyway. That is professional courtesy, not a gate. Feeding America's files are a separate matter, not redistributable and requiring a citation for each edition.
How to reproduce this
Everything above is written so that someone else can rebuild this without my code. Here is the short version.
What you need. The six methodology PDFs, the published state data sheets (live download plus archived vintages for the older cycles), the component data service, and the public input sources in the table near the top of this page. One input is not available from public files: Feeding America's county Cost-of-Food Index is not redistributable under their license, so it has to be requested from them directly, as I did. Everything else is public, and the access routes that are not obvious are in the input-problems section above.
The order, which matters more than it looks. Harvest the component panel and run the assembly identity checks first. That step is fast, needs no historical data, and it validates the assembly and threshold rules before any effort goes into sourcing inputs. Then the regimes as data, the threshold step function, rents, the budget skeleton, the component fetchers, taxes, child care, the gates, and only then the backfill. Every step is independently checkable, which is the property you want when the whole thing is one long dependency chain.
How you know it worked. The gate table above is the acceptance test, and its numbers are the ones to match. If the assembly arithmetic is right, G0 returns exact matches rather than close ones. If the component rules are right, G7 holds county by county rather than only in the state total. If nothing is overfitted, G8 predicts a year that was withheld. A build that passes G1 and fails G7 has component errors in opposite directions, and it is wrong in a way the total hides.
One rule above the others. Do not build the backfill before the gates pass. A backfill from an unvalidated forward model is worse than no backfill, because it looks like a result.
Extending it to the other 47 states
This part is now mechanical rather than exploratory. The rules are recovered and the gates are written. Three things will need real per-state work: finding a child-care source that resolves by county, which Ohio does not have at all, handling local income tax where it exists, and the food scale factor, which is currently one fitted number per state and deserves to be interrogated rather than assumed.
That last one is the piece I would look at first. If the food scale is really 1.021 in Hawaii and 1.444 in Ohio, something is going on in their mainland food line that nobody has written down, and I would rather know what it is than carry it as a constant.