******************************************************************************** * PROGRAM: fsf_week13_reproducibility.do * PURPOSE: Disaggregated food insecurity by race and Hispanic origin * (Food Security Fridays — Week 13) * AUTHOR: Matthew P. Rabbitt, PhD * DATE: April 2026 * * FOOD SECURITY FRIDAYS — WEEK 13: RACE AND ETHNICITY REPRODUCIBILITY FILE * "The Groups You Won't Find in the Annual Report" * * Data: December 2024 CPS Food Security Supplement — the FINAL CPS-FSS * before USDA cancelled the series in September 2025. * Source: U.S. Census Bureau * * MOTIVATION: The USDA annual food security report (ERR-358) reports food * insecurity for only four race/ethnicity groups — White non-Hispanic, * Black non-Hispanic, Hispanic (any race), and "Other non-Hispanic." The * "Other" line collapses Asian, American Indian/Alaska Native (AIAN), * Native Hawaiian/Pacific Islander (NHPI), and all non-Hispanic multiracial * households into a single number. The Hispanic line collapses Mexican, * Puerto Rican, Cuban, Dominican, Salvadoran, Central American, * South American, and Other Spanish origin households into a single number. * * The 2024 revisions to OMB's Statistical Policy Directive No. 15 (SPD 15) * now require federal statistical agencies to collect and report race and * ethnicity using a combined question and to disaggregate within minimum * reporting categories. The December 2024 CPS-FSS still collected race * and ethnicity under the 1997 SPD 15 standards — but the detailed * recodes (PTDTRACE, PRDTHSP, PRDASIAN) already allow most of the * disaggregation that the 2024 SPD 15 requires. * * This file produces the race/ethnicity disaggregations that the annual * ERR-358 report does not publish, using the December 2024 CPS-FSS * microdata. * * IMPORTANT CONTEXT: USDA cancelled the CPS Food Security Supplement in * September 2025. The December 2024 collection analyzed here is the * FINAL CPS-FSS. The disaggregated race/ethnicity estimates produced * below are therefore the last such estimates that will ever be * published from the CPS-FSS series under the 1997 SPD 15 standard. * Any future food insecurity estimates — including MENA food * insecurity under the 2024 SPD 15 combined question — will depend on * a successor survey. * * TABLES (11): * 1. Reproduce the ERR-358 4-category race/ethnicity breakdown * 2. "Other, non-Hispanic" decomposed: Asian, AIAN, NHPI, multiracial * 3. Within-Hispanic disaggregation (by PRDTHSP detailed origin) * 4. Within-Asian disaggregation (by PRDASIAN detailed recode) * 5. Multiracial (non-Hispanic) by 2+ race combination * 6. Very low food security rates for all disaggregated groups * 7. SNAP participation among food-insecure households, by detailed group * 8. Summary statistics for infographic * 9. Design-effect-adjusted 95% CIs for headline groups (deff=1.5) * 10. Children's food insecurity (HRFS12MC) by race/ethnicity * 11. FI rates among HHs at or above 185% FPL (income channel removed) * * DEPENDENCIES: * 1. cpsdec2024.dta — Stata dataset produced by cpsdec2024.do from * the raw ASCII file dec24pub.dat * 2. Stata 14 or later * * INSTRUCTIONS: * 1. Update $rawdata and $projdir paths below (or let the wrapper * do-file set them via profile.do) * 2. Run this file * ******************************************************************************** capture log close clear all set more off /*--------------------------------------------------------------*/ /* Load project path macros if available. External users who do */ /* not have the repository profile.do can set $rawdata and */ /* $projdir manually below — this line fails silently. */ /*--------------------------------------------------------------*/ capture do "$dropbox/profile.do" /*--------------------------------------------------------------*/ /* PATHS: UPDATE THESE BEFORE RUNNING */ /* */ /* rawdata = directory containing cpsdec2024.dta */ /* projdir = project directory (output/ and data/ created below) */ /*--------------------------------------------------------------*/ if "$rawdata" == "" { global rawdata "YOUR_PATH_HERE" } if "$projdir" == "" { global projdir "YOUR_PATH_HERE" } if "$outdir" == "" { global outdir "$projdir\output" } if "$datadir" == "" { global datadir "$projdir\data" } cap mkdir "$outdir" cap mkdir "$datadir" log using "$outdir\fsf_week13_analysis", text replace di _n "==========================================================" di "FOOD SECURITY FRIDAYS — RACE AND ETHNICITY" di "The Groups You Won't Find in the Annual Report" di "Date: $S_DATE Time: $S_TIME" di "==========================================================" /*==============================================================*/ /* SECTION 1: Load raw CPS-FSS data (supplement respondents) */ /*==============================================================*/ use "$rawdata\cpsdec2024.dta" if hrsupint == 1, clear di _n "==========================================================" di "Raw data loaded: `c(N)' individuals (supplement respondents)" di "==========================================================" /*==============================================================*/ /* SECTION 2: Construct household identifier */ /*==============================================================*/ gen revhhid = hrhhid + hrhhid2 sort revhhid perrp /*==============================================================*/ /* SECTION 3: Weights */ /* */ /* Census stores weights as integers * 10000 (4 implied */ /* decimals). Divide by 10,000 to get actual weight. */ /* hhsupwtk = hhsupwgt / 1000 for reporting counts in thousands. */ /*==============================================================*/ replace hhsupwgt = hhsupwgt / 10000 gen hhsupwtk = hhsupwgt / 1000 label var hhsupwgt "HH supplement weight" label var hhsupwtk "HH supplement weight per 1000" /*==============================================================*/ /* SECTION 4: Food security status */ /* */ /* Use pre-constructed HRFS12M1. Screened-out households (those */ /* who answered "no" to the initial food-sufficiency screener) */ /* are correctly classified as food secure by HRFS12M1. */ /*==============================================================*/ gen fscat = hrfs12m1 if hrfs12m1 > 0 label define fscat1 1 "High/Marginal" 2 "Low" 3 "Very low" label values fscat fscat1 label var fscat "Food security status (3-cat, from HRFS12M1)" gen fi = (fscat >= 2) if !missing(fscat) label var fi "Food insecure (low or very low)" gen vlfs = (fscat == 3) if !missing(fscat) label var vlfs "Very low food security" /*==============================================================*/ /* SECTION 5: SNAP participation */ /*==============================================================*/ * hesp1: 1=Received SNAP past 12 months, 2=No, -1=NIU gen snap12 = (hesp1 == 1) if inlist(hesp1, -1, 1, 2) label define snap12_lbl 0 "No SNAP" 1 "SNAP past 12 months" label values snap12 snap12_lbl label var snap12 "SNAP receipt past 12 months" /*==============================================================*/ /* SECTION 5B: Household composition (pre-collapse) */ /* */ /* numpers and numch must be computed from the individual-level */ /* file before collapsing to one record per household; bysort */ /* egen broadcasts the sum to every record, so the value is */ /* preserved on the reference-person record retained below. */ /*==============================================================*/ gen numpers = hrnumhou label var numpers "Number of persons in household" gen ischild = (prtage <= 17) bysort revhhid: egen numch = sum(ischild) label var numch "Number of children in household (age 0-17)" /*==============================================================*/ /* SECTION 6: Collapse to household level (reference person) */ /* */ /* Race and Hispanic origin are assigned at the household level */ /* using the CPS reference person's response. The reference */ /* person has PERRP = 40 (w/ relatives) or 41 (w/o relatives). */ /* We keep one record per household, preferring the reference */ /* person; if not identified, use the lowest-PERRP adult. */ /*==============================================================*/ gen _refpri = cond(inlist(perrp,40,41), 0, 1) bysort revhhid (_refpri perrp): keep if _n == 1 drop _refpri di _n "==========================================================" di "Household-level file: `c(N)' households (reference persons)" di "==========================================================" /*==============================================================*/ /* SECTION 6B: Income-to-poverty ratio */ /* */ /* Income is midpoint-imputed from hefaminc brackets. Top */ /* bracket (>=$150K) assigned $160,000 — a conservative */ /* midpoint. hxfaminc is the allocation flag; observations with */ /* allocated family income are set to missing following the */ /* convention used in the Week 11 post. */ /* */ /* Poverty thresholds are 2024 Census thresholds. CPS-FSS */ /* income brackets refer to income at interview, not a specific */ /* calendar year. The income-to-poverty ratio hhincpv = income / */ /* hpvcut is used for the Table 11 restriction in place of */ /* HRPOOR, which is a screener variable that approximates */ /* income. */ /*==============================================================*/ replace hefaminc = . if hxfaminc > 0 & hxfaminc < . gen hhincome = . replace hhincome = 2500 if hefaminc == 1 replace hhincome = (5000+7500)/2 if hefaminc == 2 replace hhincome = (7500+10000)/2 if hefaminc == 3 replace hhincome = (10000+12500)/2 if hefaminc == 4 replace hhincome = (12500+15000)/2 if hefaminc == 5 replace hhincome = (15000+20000)/2 if hefaminc == 6 replace hhincome = (20000+25000)/2 if hefaminc == 7 replace hhincome = (25000+30000)/2 if hefaminc == 8 replace hhincome = (30000+35000)/2 if hefaminc == 9 replace hhincome = (35000+40000)/2 if hefaminc == 10 replace hhincome = (40000+50000)/2 if hefaminc == 11 replace hhincome = (50000+60000)/2 if hefaminc == 12 replace hhincome = (60000+75000)/2 if hefaminc == 13 replace hhincome = (75000+100000)/2 if hefaminc == 14 replace hhincome = (100000+150000)/2 if hefaminc == 15 replace hhincome = 160000 if hefaminc == 16 label var hhincome "Household income (midpoint-imputed)" gen hpvcut = . replace hpvcut = 16320 if numpers == 1 & prtage < 65 replace hpvcut = 15045 if numpers == 1 & prtage >= 65 replace hpvcut = 21006 if numpers == 2 & prtage < 65 & numch == 0 replace hpvcut = 21621 if numpers == 2 & prtage < 65 & numch == 1 replace hpvcut = 18961 if numpers == 2 & prtage >= 65 & numch == 0 replace hpvcut = 21540 if numpers == 2 & prtage >= 65 & numch == 1 replace hpvcut = 24537 if numpers == 3 & numch == 0 replace hpvcut = 25249 if numpers == 3 & numch == 1 replace hpvcut = 25273 if numpers == 3 & numch == 2 replace hpvcut = 32355 if numpers == 4 & numch == 0 replace hpvcut = 32884 if numpers == 4 & numch == 1 replace hpvcut = 31812 if numpers == 4 & numch == 2 replace hpvcut = 31922 if numpers == 4 & numch == 3 replace hpvcut = 39019 if numpers == 5 & numch == 0 replace hpvcut = 39586 if numpers == 5 & numch == 1 replace hpvcut = 38374 if numpers == 5 & numch == 2 replace hpvcut = 37436 if numpers == 5 & numch == 3 replace hpvcut = 36863 if numpers == 5 & numch == 4 replace hpvcut = 44879 if numpers == 6 & numch == 0 replace hpvcut = 45057 if numpers == 6 & numch == 1 replace hpvcut = 44128 if numpers == 6 & numch == 2 replace hpvcut = 43238 if numpers == 6 & numch == 3 replace hpvcut = 41915 if numpers == 6 & numch == 4 replace hpvcut = 41131 if numpers == 6 & numch == 5 replace hpvcut = 51638 if numpers == 7 & numch == 0 replace hpvcut = 51961 if numpers == 7 & numch == 1 replace hpvcut = 50849 if numpers == 7 & numch == 2 replace hpvcut = 50075 if numpers == 7 & numch == 3 replace hpvcut = 48631 if numpers == 7 & numch == 4 replace hpvcut = 46948 if numpers == 7 & numch == 5 replace hpvcut = 45100 if numpers == 7 & numch == 6 replace hpvcut = 57753 if numpers == 8 & numch == 0 replace hpvcut = 58263 if numpers == 8 & numch == 1 replace hpvcut = 57215 if numpers == 8 & numch == 2 replace hpvcut = 56296 if numpers == 8 & numch == 3 replace hpvcut = 54992 if numpers == 8 & numch == 4 replace hpvcut = 53337 if numpers == 8 & numch == 5 replace hpvcut = 51614 if numpers == 8 & numch == 6 replace hpvcut = 51177 if numpers == 8 & numch == 7 replace hpvcut = 69473 if numpers > 8 & numpers <= . & numch == 0 replace hpvcut = 69810 if numpers > 8 & numpers <= . & numch == 1 replace hpvcut = 68882 if numpers > 8 & numpers <= . & numch == 2 replace hpvcut = 68102 if numpers > 8 & numpers <= . & numch == 3 replace hpvcut = 66822 if numpers > 8 & numpers <= . & numch == 4 replace hpvcut = 65062 if numpers > 8 & numpers <= . & numch == 5 replace hpvcut = 63469 if numpers > 8 & numpers <= . & numch == 6 replace hpvcut = 63075 if numpers > 8 & numpers <= . & numch == 7 replace hpvcut = 60645 if numpers > 8 & numpers <= . & numch > 7 & numch <= . label var hpvcut "Poverty threshold" gen hhincpv = hhincome / hpvcut if hhincome < . & hpvcut > 0 & hpvcut < . label var hhincpv "Household income-to-poverty ratio" /*==============================================================*/ /* SECTION 7: Construct race/ethnicity variables */ /* */ /* PTDTRACE codes 1-26. 1=White only, 2=Black only, 3=AIAN only, */ /* 4=Asian only, 5=NHPI only, 6-26=multiple-race combinations. */ /* PEHSPNON: 1=Hispanic, 2=non-Hispanic. */ /* PRDTHSP: detailed Hispanic origin (valid if PEHSPNON==1). */ /* PRDASIAN: detailed Asian recode (valid if PTDTRACE==4). */ /* */ /* The USDA annual food security report (ERR-358) groups */ /* households into 4 mutually exclusive categories using only */ /* PTDTRACE == 1 or 2 and PEHSPNON: */ /* 1 White, non-Hispanic (PTDTRACE==1 & PEHSPNON==2) */ /* 2 Black, non-Hispanic (PTDTRACE==2 & PEHSPNON==2) */ /* 3 Hispanic (PEHSPNON==1, any race) */ /* 4 Other, non-Hispanic (else, non-Hispanic) */ /*==============================================================*/ * --- ERR-358 4-category race/ethnicity (reproduce annual report) --- gen raceeth4 = . replace raceeth4 = 1 if ptdtrace == 1 & pehspnon == 2 /* White, non-Hispanic */ replace raceeth4 = 2 if ptdtrace == 2 & pehspnon == 2 /* Black, non-Hispanic */ replace raceeth4 = 3 if pehspnon == 1 /* Hispanic */ replace raceeth4 = 4 if missing(raceeth4) & pehspnon == 2 /* Other, non-Hispanic */ label define raceeth4_lbl 1 "White, non-Hispanic" 2 "Black, non-Hispanic" /// 3 "Hispanic" 4 "Other, non-Hispanic" label values raceeth4 raceeth4_lbl label var raceeth4 "Race/ethnicity (ERR-358 annual report categories)" * --- Disaggregated race/ethnicity (extends ERR-358) --- * * Decomposes the "Other, non-Hispanic" category into Asian, AIAN, * NHPI, and multiracial; keeps White, Black, and Hispanic together. gen raceeth8 = . replace raceeth8 = 1 if ptdtrace == 1 & pehspnon == 2 /* White alone, NH */ replace raceeth8 = 2 if ptdtrace == 2 & pehspnon == 2 /* Black alone, NH */ replace raceeth8 = 3 if ptdtrace == 3 & pehspnon == 2 /* AIAN alone, NH */ replace raceeth8 = 4 if ptdtrace == 4 & pehspnon == 2 /* Asian alone, NH */ replace raceeth8 = 5 if ptdtrace == 5 & pehspnon == 2 /* NHPI alone, NH */ replace raceeth8 = 6 if inrange(ptdtrace,6,26) & pehspnon == 2 /* Multiracial, NH */ replace raceeth8 = 7 if pehspnon == 1 /* Hispanic (any race) */ label define raceeth8_lbl 1 "White alone, NH" 2 "Black alone, NH" /// 3 "AIAN alone, NH" 4 "Asian alone, NH" /// 5 "NHPI alone, NH" 6 "Multiracial, NH" /// 7 "Hispanic (any race)" label values raceeth8 raceeth8_lbl label var raceeth8 "Race/ethnicity (disaggregated, 7-category)" * --- Detailed Hispanic origin (PRDTHSP) --- * Only valid when PEHSPNON == 1. gen hisp_detail = prdthsp if pehspnon == 1 & prdthsp >= 1 & prdthsp <= 8 label define hisp_detail_lbl /// 1 "Mexican" 2 "Puerto Rican" 3 "Cuban" 4 "Dominican" /// 5 "Salvadoran" 6 "Central American (excl. Salvadoran)" /// 7 "South American" 8 "Other Spanish" label values hisp_detail hisp_detail_lbl label var hisp_detail "Detailed Hispanic origin (from PRDTHSP)" * --- Detailed Asian origin (PRDASIAN) --- * Only valid when PTDTRACE == 4 (Asian alone). Non-Hispanic filter applied * so the Asian sub-groups sum to the Asian-alone non-Hispanic category. gen asian_detail = prdasian if ptdtrace == 4 & pehspnon == 2 & prdasian >= 1 & prdasian <= 7 label define asian_detail_lbl /// 1 "Asian Indian" 2 "Chinese" 3 "Filipino" 4 "Japanese" /// 5 "Korean" 6 "Vietnamese" 7 "Other Asian" label values asian_detail asian_detail_lbl label var asian_detail "Detailed Asian origin (from PRDASIAN, NH only)" * --- Multiracial combinations (PTDTRACE 6-26) --- * Collapse into a manageable typology for non-Hispanic multiracial HHs. gen multi_group = . replace multi_group = 1 if ptdtrace == 6 & pehspnon == 2 /* White-Black */ replace multi_group = 2 if ptdtrace == 7 & pehspnon == 2 /* White-AIAN */ replace multi_group = 3 if ptdtrace == 8 & pehspnon == 2 /* White-Asian */ replace multi_group = 4 if ptdtrace == 9 & pehspnon == 2 /* White-NHPI */ replace multi_group = 5 if inlist(ptdtrace,10,11,12) & pehspnon == 2 /* Black-other */ replace multi_group = 6 if inrange(ptdtrace,13,15) & pehspnon == 2 /* Other two-race */ replace multi_group = 7 if inrange(ptdtrace,16,26) & pehspnon == 2 /* 3+ race combinations */ label define multi_group_lbl /// 1 "White-Black" 2 "White-AIAN" 3 "White-Asian" 4 "White-NHPI" /// 5 "Black-AIAN/Asian/NHPI" 6 "Other two-race" 7 "Three or more races" label values multi_group multi_group_lbl label var multi_group "Non-Hispanic multiracial combination" /*==============================================================*/ /* Verification: raceeth4 and raceeth8 aggregate consistently */ /*==============================================================*/ di _n "--- Check: raceeth8 collapses to raceeth4 ---" tab raceeth4 raceeth8, m /*==============================================================*/ /* TABLE 1: Reproduce ERR-358 4-category race/ethnicity */ /*==============================================================*/ di _n "==========================================================" di "TABLE 1: ERR-358 4-CATEGORY RACE/ETHNICITY (REPRODUCE)" di "==========================================================" * Weighted counts in thousands di _n "--- Weighted HH counts (thousands) ---" qui sum hhsupwtk if !missing(fscat) di "Total HHs: " %10.1f r(sum) "K" levelsof raceeth4, local(rs) foreach r of local rs { qui sum hhsupwtk if raceeth4 == `r' & !missing(fscat) local lbl : label raceeth4_lbl `r' di "`lbl': " %10.1f r(sum) "K" } * FI and VLFS rates di _n "--- Food insecurity rates ---" tab raceeth4 fi if !missing(fscat) [aw=hhsupwgt], row nofreq tab raceeth4 vlfs if !missing(fscat) [aw=hhsupwgt], row nofreq * Unweighted sample sizes di _n "--- Unweighted N ---" tab raceeth4 if !missing(fscat) /*==============================================================*/ /* TABLE 2: Decompose "Other, non-Hispanic" */ /*==============================================================*/ di _n "==========================================================" di "TABLE 2: INSIDE 'OTHER, NON-HISPANIC'" di "==========================================================" * Weighted counts in thousands for the disaggregated groups di _n "--- Weighted HH counts (thousands) ---" levelsof raceeth8, local(rs) foreach r of local rs { qui sum hhsupwtk if raceeth8 == `r' & !missing(fscat) local lbl : label raceeth8_lbl `r' di "`lbl': " %10.1f r(sum) "K" } * FI and VLFS rates di _n "--- Food insecurity rates (disaggregated) ---" tab raceeth8 fi if !missing(fscat) [aw=hhsupwgt], row nofreq tab raceeth8 vlfs if !missing(fscat) [aw=hhsupwgt], row nofreq * Unweighted sample sizes di _n "--- Unweighted N ---" tab raceeth8 if !missing(fscat) * Focused look: just the groups hidden inside "Other, non-Hispanic" di _n "--- Groups collapsed into 'Other, non-Hispanic' ---" tab raceeth8 fi if inlist(raceeth8,3,4,5,6) & !missing(fscat) [aw=hhsupwgt], row nofreq tab raceeth8 if inlist(raceeth8,3,4,5,6) & !missing(fscat) /*==============================================================*/ /* TABLE 3: Within-Hispanic disaggregation */ /*==============================================================*/ di _n "==========================================================" di "TABLE 3: WITHIN-HISPANIC DISAGGREGATION (BY DETAILED ORIGIN)" di "==========================================================" * Weighted counts in thousands di _n "--- Weighted HH counts (thousands) ---" levelsof hisp_detail, local(hs) foreach h of local hs { qui sum hhsupwtk if hisp_detail == `h' & !missing(fscat) local lbl : label hisp_detail_lbl `h' di "`lbl': " %10.1f r(sum) "K" } * FI and VLFS rates di _n "--- Food insecurity rates ---" tab hisp_detail fi if !missing(fscat) [aw=hhsupwgt], row nofreq tab hisp_detail vlfs if !missing(fscat) [aw=hhsupwgt], row nofreq * Unweighted sample sizes di _n "--- Unweighted N ---" tab hisp_detail if !missing(fscat) /*==============================================================*/ /* TABLE 4: Within-Asian disaggregation */ /*==============================================================*/ di _n "==========================================================" di "TABLE 4: WITHIN-ASIAN DISAGGREGATION (NON-HISPANIC)" di "==========================================================" * Weighted counts in thousands di _n "--- Weighted HH counts (thousands) ---" levelsof asian_detail, local(as) foreach a of local as { qui sum hhsupwtk if asian_detail == `a' & !missing(fscat) local lbl : label asian_detail_lbl `a' di "`lbl': " %10.1f r(sum) "K" } * FI and VLFS rates di _n "--- Food insecurity rates ---" tab asian_detail fi if !missing(fscat) [aw=hhsupwgt], row nofreq tab asian_detail vlfs if !missing(fscat) [aw=hhsupwgt], row nofreq * Unweighted sample sizes di _n "--- Unweighted N ---" tab asian_detail if !missing(fscat) /*==============================================================*/ /* TABLE 5: Multiracial decomposition (non-Hispanic) */ /*==============================================================*/ di _n "==========================================================" di "TABLE 5: MULTIRACIAL (NON-HISPANIC) BY COMBINATION" di "==========================================================" di _n "--- Weighted HH counts (thousands) ---" levelsof multi_group, local(ms) foreach m of local ms { qui sum hhsupwtk if multi_group == `m' & !missing(fscat) local lbl : label multi_group_lbl `m' di "`lbl': " %10.1f r(sum) "K" } di _n "--- Food insecurity rates ---" tab multi_group fi if !missing(fscat) [aw=hhsupwgt], row nofreq tab multi_group vlfs if !missing(fscat) [aw=hhsupwgt], row nofreq di _n "--- Unweighted N ---" tab multi_group if !missing(fscat) /*==============================================================*/ /* TABLE 6: Very low food security comparison */ /*==============================================================*/ di _n "==========================================================" di "TABLE 6: VERY LOW FOOD SECURITY RATES — ALL GROUPS" di "==========================================================" di _n "--- 4-category (ERR-358) ---" tab raceeth4 vlfs if !missing(fscat) [aw=hhsupwgt], row nofreq di _n "--- 7-category disaggregated ---" tab raceeth8 vlfs if !missing(fscat) [aw=hhsupwgt], row nofreq di _n "--- Detailed Hispanic ---" tab hisp_detail vlfs if !missing(fscat) [aw=hhsupwgt], row nofreq di _n "--- Detailed Asian ---" tab asian_detail vlfs if !missing(fscat) [aw=hhsupwgt], row nofreq /*==============================================================*/ /* TABLE 7: SNAP participation among food-insecure HHs */ /*==============================================================*/ di _n "==========================================================" di "TABLE 7: SNAP PARTICIPATION AMONG FI HHs, BY RACE/ETHNICITY" di "==========================================================" di _n "--- 4-category (ERR-358) ---" tab raceeth4 snap12 if fi == 1 & !missing(snap12) [aw=hhsupwgt], row nofreq di _n "--- 7-category disaggregated ---" tab raceeth8 snap12 if fi == 1 & !missing(snap12) [aw=hhsupwgt], row nofreq di _n "--- Detailed Hispanic ---" tab hisp_detail snap12 if fi == 1 & !missing(snap12) [aw=hhsupwgt], row nofreq di _n "--- Detailed Asian ---" tab asian_detail snap12 if fi == 1 & !missing(snap12) [aw=hhsupwgt], row nofreq /*==============================================================*/ /* TABLE 8: Summary statistics for infographic */ /*==============================================================*/ di _n "==========================================================" di "TABLE 8: SUMMARY STATISTICS FOR INFOGRAPHIC" di "==========================================================" * Total households with food security status count if !missing(fscat) di "Unweighted HHs with FS status: `r(N)'" * Weighted totals qui sum hhsupwtk if !missing(fscat) di "Weighted HHs (thousands): " %10.1f r(sum) qui sum hhsupwtk if fi == 1 di "Weighted FI HHs (thousands): " %10.1f r(sum) * Overall FI rate qui sum fi if !missing(fscat) [aw=hhsupwgt] di "Overall FI rate: " %5.1f 100*r(mean) "%" * FI rates by 4-category di _n "--- 4-CATEGORY (ERR-358) FI rates ---" levelsof raceeth4, local(rs) foreach r of local rs { qui sum fi if raceeth4 == `r' & !missing(fscat) [aw=hhsupwgt] local lbl : label raceeth4_lbl `r' di "`lbl': FI = " %5.1f 100*r(mean) "%, N = " r(N) } * FI rates by 7-category disaggregated di _n "--- 7-CATEGORY (DISAGGREGATED) FI rates ---" levelsof raceeth8, local(rs) foreach r of local rs { qui sum fi if raceeth8 == `r' & !missing(fscat) [aw=hhsupwgt] local lbl : label raceeth8_lbl `r' di "`lbl': FI = " %5.1f 100*r(mean) "%, N = " r(N) } * FI rates by detailed Hispanic di _n "--- DETAILED HISPANIC FI rates ---" levelsof hisp_detail, local(hs) foreach h of local hs { qui sum fi if hisp_detail == `h' & !missing(fscat) [aw=hhsupwgt] local lbl : label hisp_detail_lbl `h' di "`lbl': FI = " %5.1f 100*r(mean) "%, N = " r(N) } * FI rates by detailed Asian di _n "--- DETAILED ASIAN FI rates ---" levelsof asian_detail, local(as) foreach a of local as { qui sum fi if asian_detail == `a' & !missing(fscat) [aw=hhsupwgt] local lbl : label asian_detail_lbl `a' di "`lbl': FI = " %5.1f 100*r(mean) "%, N = " r(N) } * VLFS rates by 7-category di _n "--- 7-CATEGORY (DISAGGREGATED) VLFS rates ---" levelsof raceeth8, local(rs) foreach r of local rs { qui sum vlfs if raceeth8 == `r' & !missing(fscat) [aw=hhsupwgt] local lbl : label raceeth8_lbl `r' di "`lbl': VLFS = " %5.1f 100*r(mean) "%, N = " r(N) } * Share of "Other, non-Hispanic" decomposed di _n "--- Share of 'Other, non-Hispanic' that each sub-group represents ---" qui sum hhsupwtk if raceeth4 == 4 & !missing(fscat) local other_total = r(sum) foreach r in 3 4 5 6 { qui sum hhsupwtk if raceeth8 == `r' & !missing(fscat) local lbl : label raceeth8_lbl `r' di "`lbl': " %5.1f 100*r(sum)/`other_total' "% of Other NH" } * Share of Hispanic that each sub-group represents di _n "--- Share of Hispanic by detailed origin ---" qui sum hhsupwtk if raceeth4 == 3 & !missing(fscat) local hisp_total = r(sum) levelsof hisp_detail, local(hs) foreach h of local hs { qui sum hhsupwtk if hisp_detail == `h' & !missing(fscat) local lbl : label hisp_detail_lbl `h' di "`lbl': " %5.1f 100*r(sum)/`hisp_total' "% of Hispanic" } * Share of Asian alone NH that each sub-group represents di _n "--- Share of Asian alone (NH) by detailed origin ---" qui sum hhsupwtk if raceeth8 == 4 & !missing(fscat) local as_total = r(sum) levelsof asian_detail, local(as) foreach a of local as { qui sum hhsupwtk if asian_detail == `a' & !missing(fscat) local lbl : label asian_detail_lbl `a' di "`lbl': " %5.1f 100*r(sum)/`as_total' "% of Asian NH" } /*==============================================================*/ /* TABLE 9: Design-effect-adjusted 95% CIs for headline groups */ /* */ /* This .do file uses a standard design-effect approximation */ /* for the 95% CI on a weighted proportion: */ /* SE = sqrt( p*(1-p) / N * deff ) */ /* deff = 1.5 is used here as a conservative approximation for */ /* CPS subgroup proportions in the absence of a group-specific */ /* generalized variance parameter. CIs should be read as */ /* approximate. */ /*==============================================================*/ di _n "==========================================================" di "TABLE 9: DESIGN-EFFECT-ADJUSTED 95% CIs FOR HEADLINE GROUPS" di "Formula: SE = sqrt(p*(1-p)/N * deff), deff = 1.5" di "==========================================================" local deff = 1.5 di _n "--- 4-category (ERR-358) ---" levelsof raceeth4, local(rs) foreach r of local rs { qui sum fi if raceeth4 == `r' & !missing(fscat) [aw=hhsupwgt] local p = r(mean) local n = r(N) local se = sqrt(`p' * (1 - `p') / `n' * `deff') local lo = max(0, 100*(`p' - 1.96*`se')) local hi = min(100, 100*(`p' + 1.96*`se')) local lbl : label raceeth4_lbl `r' di "`lbl': " %5.1f 100*`p' "% 95% CI [" %5.1f `lo' ", " %5.1f `hi' "] SE=" %4.1f 100*`se' "pp N=" `n' } di _n "--- 7-category disaggregated ---" levelsof raceeth8, local(rs) foreach r of local rs { qui sum fi if raceeth8 == `r' & !missing(fscat) [aw=hhsupwgt] local p = r(mean) local n = r(N) local se = sqrt(`p' * (1 - `p') / `n' * `deff') local lo = max(0, 100*(`p' - 1.96*`se')) local hi = min(100, 100*(`p' + 1.96*`se')) local lbl : label raceeth8_lbl `r' di "`lbl': " %5.1f 100*`p' "% 95% CI [" %5.1f `lo' ", " %5.1f `hi' "] SE=" %4.1f 100*`se' "pp N=" `n' } di _n "--- Detailed Hispanic ---" levelsof hisp_detail, local(hs) foreach h of local hs { qui sum fi if hisp_detail == `h' & !missing(fscat) [aw=hhsupwgt] local p = r(mean) local n = r(N) local se = sqrt(`p' * (1 - `p') / `n' * `deff') local lo = max(0, 100*(`p' - 1.96*`se')) local hi = min(100, 100*(`p' + 1.96*`se')) local lbl : label hisp_detail_lbl `h' di "`lbl': " %5.1f 100*`p' "% 95% CI [" %5.1f `lo' ", " %5.1f `hi' "] SE=" %4.1f 100*`se' "pp N=" `n' } di _n "--- Detailed Asian ---" levelsof asian_detail, local(as) foreach a of local as { qui sum fi if asian_detail == `a' & !missing(fscat) [aw=hhsupwgt] local p = r(mean) local n = r(N) local se = sqrt(`p' * (1 - `p') / `n' * `deff') local lo = max(0, 100*(`p' - 1.96*`se')) local hi = min(100, 100*(`p' + 1.96*`se')) local lbl : label asian_detail_lbl `a' di "`lbl': " %5.1f 100*`p' "% 95% CI [" %5.1f `lo' ", " %5.1f `hi' "] SE=" %4.1f 100*`se' "pp N=" `n' } /*==============================================================*/ /* TABLE 10: Children's food insecurity by race/ethnicity */ /* */ /* HRFS12MC = children's food security status among HHs with */ /* at least one child under 18. 1=FS among children, 2=low FS */ /* among children, 3=VLFS among children, -9/-1 = NIU/no kids. */ /* */ /* "Food insecure among children" here means HRFS12MC >= 2, */ /* i.e., low or very low food security among the children */ /* themselves (the standard USDA ERR-358 child-FI measure). */ /*==============================================================*/ di _n "==========================================================" di "TABLE 10: CHILDREN'S FOOD INSECURITY BY RACE/ETHNICITY" di "(HHs with children only, HRFS12MC >= 2)" di "==========================================================" gen child_fi = (hrfs12mc >= 2) if inlist(hrfs12mc, 1, 2, 3) label var child_fi "Children food insecure (12-month, HRFS12MC>=2)" di _n "--- Weighted HHs with children (thousands), by 7-category ---" levelsof raceeth8, local(rs) foreach r of local rs { qui sum hhsupwtk if raceeth8 == `r' & !missing(child_fi) local lbl : label raceeth8_lbl `r' di "`lbl': " %10.1f r(sum) "K HHs with children" } di _n "--- Child FI rates (4-category ERR-358) ---" tab raceeth4 child_fi if !missing(child_fi) [aw=hhsupwgt], row nofreq tab raceeth4 if !missing(child_fi) di _n "--- Child FI rates (7-category disaggregated) ---" tab raceeth8 child_fi if !missing(child_fi) [aw=hhsupwgt], row nofreq tab raceeth8 if !missing(child_fi) di _n "--- Child FI rates (detailed Hispanic) ---" tab hisp_detail child_fi if !missing(child_fi) [aw=hhsupwgt], row nofreq tab hisp_detail if !missing(child_fi) /*==============================================================*/ /* TABLE 11: FI rates restricted to above 185% FPL */ /* */ /* Threshold is defined from the midpoint-imputed household */ /* income relative to the 2024 Census poverty threshold */ /* (hhincpv, constructed in Section 6B), not from the HRPOOR */ /* screener variable which only approximates income. The */ /* above-185% subsample removes most of the income channel from */ /* the group FI comparison. Differences that survive in this */ /* subsample are not attributable to income alone. */ /*==============================================================*/ di _n "==========================================================" di "TABLE 11: FI RATES AMONG HHs ABOVE 185% FEDERAL POVERTY" di "(Removes income channel from race/ethnicity comparison)" di "==========================================================" gen above185 = (hhincpv >= 1.85) if !missing(hhincpv) label var above185 "HH income at or above 185% FPL (hhincpv >= 1.85)" di _n "--- Sample: weighted HHs at or above 185% FPL, by 7-category ---" levelsof raceeth8, local(rs) foreach r of local rs { qui sum hhsupwtk if raceeth8 == `r' & above185 == 1 & !missing(fscat) local lbl : label raceeth8_lbl `r' di "`lbl': " %10.1f r(sum) "K HHs above 185% FPL" } di _n "--- FI rate, above 185% FPL (4-category ERR-358) ---" tab raceeth4 fi if above185 == 1 & !missing(fscat) [aw=hhsupwgt], row nofreq tab raceeth4 if above185 == 1 & !missing(fscat) di _n "--- FI rate, above 185% FPL (7-category disaggregated) ---" tab raceeth8 fi if above185 == 1 & !missing(fscat) [aw=hhsupwgt], row nofreq tab raceeth8 if above185 == 1 & !missing(fscat) di _n "--- FI rate, above 185% FPL (detailed Hispanic) ---" tab hisp_detail fi if above185 == 1 & !missing(fscat) [aw=hhsupwgt], row nofreq tab hisp_detail if above185 == 1 & !missing(fscat) di _n "--- FI rate, above 185% FPL (detailed Asian) ---" tab asian_detail fi if above185 == 1 & !missing(fscat) [aw=hhsupwgt], row nofreq tab asian_detail if above185 == 1 & !missing(fscat) di _n "==========================================================" di "ANALYSIS COMPLETE" di "Date: $S_DATE Time: $S_TIME" di "==========================================================" log close