1515from microimpute .models .qrf import QRF
1616import logging
1717from policyengine_us_data .parameters import load_take_up_rate
18-
18+ from policyengine_us_data . utils . randomness import seeded_rng
1919
2020test_lite = os .environ .get ("TEST_LITE" ) == "true"
2121print (f"TEST_LITE == { test_lite } " )
@@ -205,24 +205,25 @@ def add_rent(self, cps: h5py.File, person: DataFrame, household: DataFrame):
205205def add_takeup (self ):
206206 data = self .load_dataset ()
207207
208- from policyengine_us import system , Microsimulation
208+ from policyengine_us import Microsimulation
209209
210210 baseline = Microsimulation (dataset = self )
211211
212- # Generate all stochastic take-up decisions using take-up rates from parameter files
213- # This keeps the country package purely deterministic
214- generator = np . random . default_rng ( seed = 100 )
212+ n_persons = len ( data [ "person_id" ])
213+ n_tax_units = len ( data [ "tax_unit_id" ])
214+ n_spm_units = len ( data [ "spm_unit_id" ] )
215215
216- # Load take-up rates from parameter files
216+ # Load take-up rates
217217 eitc_rates_by_children = load_take_up_rate ("eitc" , self .time_period )
218218 dc_ptc_rate = load_take_up_rate ("dc_ptc" , self .time_period )
219219 snap_rate = load_take_up_rate ("snap" , self .time_period )
220220 aca_rate = load_take_up_rate ("aca" , self .time_period )
221- medicaid_rate = load_take_up_rate ("medicaid" , self .time_period )
221+ medicaid_rates_by_state = load_take_up_rate ("medicaid" , self .time_period )
222222 head_start_rate = load_take_up_rate ("head_start" , self .time_period )
223223 early_head_start_rate = load_take_up_rate (
224224 "early_head_start" , self .time_period
225225 )
226+ ssi_pass_rate = load_take_up_rate ("ssi_pass_rate" , self .time_period )
226227
227228 # EITC: varies by number of children
228229 eitc_child_count = baseline .calculate ("eitc_child_count" ).values
@@ -232,38 +233,60 @@ def add_takeup(self):
232233 for c in eitc_child_count
233234 ]
234235 )
235- data ["takes_up_eitc" ] = (
236- generator .random (len (data ["tax_unit_id" ])) < eitc_takeup_rate
237- )
236+ rng = seeded_rng ("takes_up_eitc" )
237+ data ["takes_up_eitc" ] = rng .random (n_tax_units ) < eitc_takeup_rate
238238
239239 # DC Property Tax Credit
240- data ["takes_up_dc_ptc" ] = (
241- generator .random (len (data ["tax_unit_id" ])) < dc_ptc_rate
242- )
240+ rng = seeded_rng ("takes_up_dc_ptc" )
241+ data ["takes_up_dc_ptc" ] = rng .random (n_tax_units ) < dc_ptc_rate
243242
244243 # SNAP
245- data ["takes_up_snap_if_eligible" ] = (
246- generator .random (len (data ["spm_unit_id" ])) < snap_rate
247- )
244+ rng = seeded_rng ("takes_up_snap_if_eligible" )
245+ data ["takes_up_snap_if_eligible" ] = rng .random (n_spm_units ) < snap_rate
248246
249247 # ACA
250- data ["takes_up_aca_if_eligible" ] = (
251- generator .random (len (data ["tax_unit_id" ])) < aca_rate
252- )
248+ rng = seeded_rng ("takes_up_aca_if_eligible" )
249+ data ["takes_up_aca_if_eligible" ] = rng .random (n_tax_units ) < aca_rate
253250
254- # Medicaid
251+ # Medicaid: state-specific rates
252+ state_codes = baseline .calculate ("state_code_str" ).values
253+ hh_ids = data ["household_id" ]
254+ person_hh_ids = data ["person_household_id" ]
255+ hh_to_state = dict (zip (hh_ids , state_codes ))
256+ person_states = np .array (
257+ [hh_to_state .get (hh_id , "CA" ) for hh_id in person_hh_ids ]
258+ )
259+ medicaid_rate_by_person = np .array (
260+ [medicaid_rates_by_state .get (s , 0.93 ) for s in person_states ]
261+ )
262+ rng = seeded_rng ("takes_up_medicaid_if_eligible" )
255263 data ["takes_up_medicaid_if_eligible" ] = (
256- generator .random (len ( data [ "person_id" ])) < medicaid_rate
264+ rng .random (n_persons ) < medicaid_rate_by_person
257265 )
258266
259267 # Head Start
268+ rng = seeded_rng ("takes_up_head_start_if_eligible" )
260269 data ["takes_up_head_start_if_eligible" ] = (
261- generator .random (len ( data [ "person_id" ]) ) < head_start_rate
270+ rng .random (n_persons ) < head_start_rate
262271 )
263272
264273 # Early Head Start
274+ rng = seeded_rng ("takes_up_early_head_start_if_eligible" )
265275 data ["takes_up_early_head_start_if_eligible" ] = (
266- generator .random (len (data ["person_id" ])) < early_head_start_rate
276+ rng .random (n_persons ) < early_head_start_rate
277+ )
278+
279+ # SSI resource test
280+ rng = seeded_rng ("meets_ssi_resource_test" )
281+ data ["meets_ssi_resource_test" ] = rng .random (n_persons ) < ssi_pass_rate
282+
283+ # WIC draws (country package compares against category-specific rates)
284+ rng = seeded_rng ("wic_takeup_draw" )
285+ data ["wic_takeup_draw" ] = rng .random (n_persons ).astype (np .float32 )
286+
287+ rng = seeded_rng ("wic_nutritional_risk_draw" )
288+ data ["wic_nutritional_risk_draw" ] = rng .random (n_persons ).astype (
289+ np .float32
267290 )
268291
269292 self .save_dataset (data )
0 commit comments