You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
SSI take-up: seed an asset gradient in claiming propensity (attributes only, no reform-referential behavior), anchored to MSP asset-test natural experiments #584
takes_up_ssi_if_eligible is seeded as a band-constant Bernoulli, solved so baseline caseloads reconcile to SSA by age band. The flag is a person attribute, but a constant one — so people holding $2k–$20k in countable assets inherit the claiming rate of a population screened to hold under $2k. For the SSI resource-limit class the assumption is the estimate: elderly carry ~70% of the $10k/$20k cost, and against CBPP's published elimination elderly row (115k) we produce 694k — a 6× gap that is entirely claiming, not eligibility (both datasets agree the excluded pool skews heavily elderly; ours: ~1.5M income-eligible seniors excluded solely by assets, avg potential benefit ~$580/mo).
Design principle (owner-adjudicated)
Person attributes stay independent of the tax-benefit system — no reform-referential behavior (an earlier draft of this issue proposed a newly-eligible claiming factor; retracted for exactly this reason). The fix is a gradient in the seed itself, over policy-invariant attributes.
Proposal
Asset gradient in the take-up propensity. Seed takes_up_ssi_if_eligible from P(claim | countable assets, age band, demographics) — attributes only. Calibration constrains the intercepts: the propensity averaged over each band's under-$2k population must still reconcile to SSA's caseload (the SSI take-up: delivered-weight prior basis + hard band delivery gate (#507) #524 delivery gate unchanged in role). Reform behavior then emerges from attributes: high-asset newly-eligible people claim less because of what they hold, with no reform-margin logic anywhere.
Slope estimation, three anchors: (a) the truncated $0–$2k range in SIPP (income/assets/receipt jointly observed); (b) CBPP's published adult-equation log_countable_assets coefficient — the same attribute-based object from the same survey family; (c) state Medicare Savings Program asset-test eliminations — direct observations of senior claiming across the asset range that is out-of-support in SSI data by construction — plus the 1985–89 SSI limit step-ups and SNAP BBCE removals. Add (c) to the reform-validation suite as hard rows so the gradient is gated by observed enrollment responses.
Diagnostics, not dials: reform outputs report realized claiming by asset band among the newly eligible (pure measurement; no behavioral parameter).
Explicitly out of scope here: benefit-size response (regime-dependent → belongs engine-side as a behavioral response with a stored policy-invariant latent, like elasticities, if ever); OACT phase-in (a reporting adjustment for administrative-score comparisons, never a person attribute).
Acceptance sketch
Baseline bands still reconcile to SSA; the CBPP adult row (154k, currently matched at 0.5%) must not regress; the elderly row moves from the estimated gradient rather than an inherited constant, with the MSP-anchor rows green. The ssi-asset-limits rerun harness produces the acceptance table per candidate in ~15 min.
Relates #374 (the residual this closes), #453 (child row), #524/#507 (baseline banding this builds on).
changed the title [-]SSI take-up at the reform margin: newly-eligible claiming inherits the current-claimant band rate — add a gradient model (benefit/asset/gateway) with natural-experiment anchors[/-][+]SSI take-up: seed an asset gradient in claiming propensity (attributes only, no reform-referential behavior), anchored to MSP asset-test natural experiments[/+]on Jul 31, 2026
Body revised after owner review: the original step 1 (a newly-eligible claiming factor) was reform-referential — it conditioned behavior on which regime created eligibility, which nothing else in the model does. The design is now attribute-only: the gradient lives in the seed's propensity function over countable assets, calibration solves the intercepts against the SSA bands, and the reform margin emerges with no special-casing. Benefit-size response is explicitly parked as engine-side future work.
Built and estimated. The SIPP evidence does not support the gradient this issue proposes, so nothing here should merge as a behavior change yet.
Branch: ssi-584-take-up-asset-gradient (work in progress). It has the gradient framework (propensity = logistic(band intercept + band slope × log1p(liquid assets)), intercepts solved against SSA's band counts on the existing candidate basis, reporters pinned true, and a zero slope reproducing today's flags exactly), the estimator tools/estimate_ssi_asset_gradient.py, and the evidence under docs/evidence/ssi-take-up-asset-gradient/.
Estimates
SIPP 2023 (December 2022). Sample: unmarried people aged 15 and over who are 65+ or report a disability, with apparent SSI countable income at or below $841 a month and observed (not imputed) receipt, income and assets. Model: logit of monthly SSI receipt on log1p(own bank + stock/mutual fund + bond assets), household-clustered standard errors. I reran the estimator independently and got the same numbers.
Sample
Rows (SSI recipients)
Slope
SE
18–64, assets $0–$2,000 (primary)
817 (260)
+0.033
0.033
65+, assets $0–$2,000 (primary)
342 (152)
+0.114
0.045
18–64, assets $1–$2,000
401
+0.003
0.069
65+, assets $1–$2,000
196
−0.228
0.092
18–64, all assets
911
−0.055
0.026
65+, all assets
417
−0.058
0.028
What it shows
In the range where the resource test does not bind ($0–$2,000), receipt does not fall as savings rise. For people 65 and over it rises.
That sign depends on people with exactly $0: dropping them turns the 65+ slope negative. Two readings fit that (benefits held in an account raise recipients' balances; people with no account are less likely to be claimants at all), and this sample cannot separate them.
The whole-range slopes are negative, but there the resource test itself removes recipients above $2,000, so they mix eligibility with claiming. CBPP's adult coefficient (−0.04, probit on ln countable assets, SSI or SSDI receipt, SIPP 2014) is an estimate of that whole-range kind; CBPP's appendix calls the assumption "somewhat speculative with regard to future SSI participants".
So the data that exist do not identify how people with $2,000–$20,000 would claim. A slope fitted inside the limit and extrapolated above it would be an assumption, and with the primary estimates it would raise, not lower, the newly eligible seniors' claiming.
The branch also records two natural experiments as reported diagnostics, not gates (Fung et al. 2026 on Medicare Savings Program asset-test removals; Wang et al. 2026 on SNAP broad-based categorical eligibility). Neither has a justified bridge to SSI claiming, and I have not checked the transcribed table values against the papers.
Related
The elderly gap this issue set out to close may not be claiming at all. Two checks against SSA administrative data are running on the certified default before any slope is relied on: recipient composition held out of calibration (finer age bands, concurrent Social Security receipt, marital status; #644) and the resource distribution of the people the reform would admit (#424, direction 3). policyengine-us also does not deem an ineligible spouse's or a parent's resources (20 CFR 416.1202); a fix is in review, with TheAxiomFoundation/rulespec-us#1626 for the Axiom side. I'll post those results here and on #644.
Status, 2026-10-13: hold this until a certified build carries the Social Security fix.
The elderly gap this issue set out to close now looks mostly like population-file defects rather than claiming behaviour. Nothing has changed in the certified default since the October 10 numbers: latest.json and policyengine.py 6.3.3 still pin populace-us-2024-spm-20260915 with policyengine-us 2.2.1. All figures below are from that run (PolicyEngine/ssi-asset-limits, public/data/results.json and results/admin-checks/).
So the asset gradient stays unmerged, for two reasons:
The SIPP slope inside $0–$2,000 points the wrong way (see the comment above).
Any slope fitted now would absorb these defects.
Next step: once a certified build includes #1186, with claiming re-solved against SSA's bands (and ideally #1221 and a fix for #1212), rerun PolicyEngine/ssi-asset-limits and measure what is left of the 65+ gap against CBPP. If a material gap remains, the identifying evidence still has to come from regime variation such as the MSP asset-test removals, not same-regime SIPP slopes.
Related: microcosm-dynamics Registration 19 (PolicyEngine/microcosm-dynamics#511) runs a static SSI asset-test analysis on the same frame and notes the same uncalibrated liquid assets; this issue's evidence applies to it too.
Activity
[-]SSI take-up at the reform margin: newly-eligible claiming inherits the current-claimant band rate — add a gradient model (benefit/asset/gateway) with natural-experiment anchors[/-][+]SSI take-up: seed an asset gradient in claiming propensity (attributes only, no reform-referential behavior), anchored to MSP asset-test natural experiments[/+]MaxGhenis commentedon Jul 31, 2026
Body revised after owner review: the original step 1 (a newly-eligible claiming factor) was reform-referential — it conditioned behavior on which regime created eligibility, which nothing else in the model does. The design is now attribute-only: the gradient lives in the seed's propensity function over countable assets, calibration solves the intercepts against the SSA bands, and the reform margin emerges with no special-casing. Benefit-size response is explicitly parked as engine-side future work.
MaxGhenis commentedon Oct 10, 2026
Built and estimated. The SIPP evidence does not support the gradient this issue proposes, so nothing here should merge as a behavior change yet.
Branch:
ssi-584-take-up-asset-gradient(work in progress). It has the gradient framework (propensity = logistic(band intercept + band slope × log1p(liquid assets)), intercepts solved against SSA's band counts on the existing candidate basis, reporters pinned true, and a zero slope reproducing today's flags exactly), the estimatortools/estimate_ssi_asset_gradient.py, and the evidence underdocs/evidence/ssi-take-up-asset-gradient/.Estimates
SIPP 2023 (December 2022). Sample: unmarried people aged 15 and over who are 65+ or report a disability, with apparent SSI countable income at or below $841 a month and observed (not imputed) receipt, income and assets. Model: logit of monthly SSI receipt on log1p(own bank + stock/mutual fund + bond assets), household-clustered standard errors. I reran the estimator independently and got the same numbers.
What it shows
The branch also records two natural experiments as reported diagnostics, not gates (Fung et al. 2026 on Medicare Savings Program asset-test removals; Wang et al. 2026 on SNAP broad-based categorical eligibility). Neither has a justified bridge to SSI claiming, and I have not checked the transcribed table values against the papers.
Related
The elderly gap this issue set out to close may not be claiming at all. Two checks against SSA administrative data are running on the certified default before any slope is relied on: recipient composition held out of calibration (finer age bands, concurrent Social Security receipt, marital status; #644) and the resource distribution of the people the reform would admit (#424, direction 3). policyengine-us also does not deem an ineligible spouse's or a parent's resources (20 CFR 416.1202); a fix is in review, with TheAxiomFoundation/rulespec-us#1626 for the Axiom side. I'll post those results here and on #644.
MaxGhenis commentedon Oct 13, 2026
Status, 2026-10-13: hold this until a certified build carries the Social Security fix.
The elderly gap this issue set out to close now looks mostly like population-file defects rather than claiming behaviour. Nothing has changed in the certified default since the October 10 numbers:
latest.jsonand policyengine.py 6.3.3 still pinpopulace-us-2024-spm-20260915with policyengine-us 2.2.1. All figures below are from that run (PolicyEngine/ssi-asset-limits,public/data/results.jsonandresults/admin-checks/).PUF-support channel erases CPS-reported Social Security for 11.6M people, inflating SSI eligibility #1178, Social Security erased. Fixed in the build code by Keep CPS-reported Social Security on PUF-support rows (#1178) #1186, merged 2026-10-12 but not yet in a certified release. Under $10,000/$20,000, 53.8% of the model's 362,628 new recipients aged 65+ had their CPS-reported Social Security erased (41 records, weighted median $24,111 a year). Restoring it without redrawing claiming flags changes the 65+ figures as follows:
US frame: people 65+ are 81% married and 9% live alone (ACS 56% and 27%); support selection and the weight solve both favor couples #1212, marital mix. In the frame, 81.2% of people 65+ are married and 9.1% live alone; I recomputed both from the H5 today. ACS 2024 S1201 puts the married share at 56.1%. SSI's aged caseload is mostly unmarried, so this bears directly on who the reform admits.
Liquid assets sit on the lowest-line person, against the stage's declared is_household_head carry; 13.1M SSI-relevant adults test at $0 resources by construction #1215, savings carrier. All of a household's savings sit on its lowest-line person; I confirmed today that all 52,637 holders are that person. Everyone else tests at $0 of their own.
So the asset gradient stays unmerged, for two reasons:
Next step: once a certified build includes #1186, with claiming re-solved against SSA's bands (and ideally #1221 and a fix for #1212), rerun PolicyEngine/ssi-asset-limits and measure what is left of the 65+ gap against CBPP. If a material gap remains, the identifying evidence still has to come from regime variation such as the MSP asset-test removals, not same-regime SIPP slopes.
Related: microcosm-dynamics Registration 19 (PolicyEngine/microcosm-dynamics#511) runs a static SSI asset-test analysis on the same frame and notes the same uncalibrated liquid assets; this issue's evidence applies to it too.