diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..cae4cd466e0 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,6 @@ +- bump: minor + changes: + added: + - Add Head Start and Early Head Start takeup variables for dataset-driven stochastic modeling + changed: + - Update head_start and early_head_start to use takeup in microsimulation (defaults to True in policy calculator) diff --git a/policyengine_us/tests/policy/baseline/gov/aca/ptc/takes_up_aca_if_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/aca/ptc/takes_up_aca_if_eligible.yaml deleted file mode 100644 index 0f401e1b11c..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/aca/ptc/takes_up_aca_if_eligible.yaml +++ /dev/null @@ -1,13 +0,0 @@ -- name: Seed above takeup rate - period: 2025 - input: - aca_take_up_seed: 0.7 - output: - takes_up_aca_if_eligible: false - -- name: Seed below takeup rate - period: 2025 - input: - aca_take_up_seed: 0.6 - output: - takes_up_aca_if_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/takes_up_medicaid_if_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/takes_up_medicaid_if_eligible.yaml deleted file mode 100644 index 0ec73681c48..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/takes_up_medicaid_if_eligible.yaml +++ /dev/null @@ -1,13 +0,0 @@ -- name: Seed above takeup rate - period: 2025 - input: - medicaid_take_up_seed: 1 - output: - takes_up_medicaid_if_eligible: false - -- name: Seed below takeup rate - period: 2025 - input: - medicaid_take_up_seed: 0.9 - output: - takes_up_medicaid_if_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/usda/snap/takes_up_snap_if_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/usda/snap/takes_up_snap_if_eligible.yaml deleted file mode 100644 index b8bdfdc7fed..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/usda/snap/takes_up_snap_if_eligible.yaml +++ /dev/null @@ -1,13 +0,0 @@ -- name: Seed above takeup rate - period: 2022 - input: - snap_take_up_seed: 0.9 - output: - takes_up_snap_if_eligible: false - -- name: Seed below takeup rate - period: 2022 - input: - snap_take_up_seed: 0.8 - output: - takes_up_snap_if_eligible: true diff --git a/policyengine_us/variables/gov/aca/aca_take_up_seed.py b/policyengine_us/variables/gov/aca/aca_take_up_seed.py deleted file mode 100644 index 911ab0217c2..00000000000 --- a/policyengine_us/variables/gov/aca/aca_take_up_seed.py +++ /dev/null @@ -1,8 +0,0 @@ -from policyengine_us.model_api import * - - -class aca_take_up_seed(Variable): - value_type = float - entity = TaxUnit - label = "Randomly assigned seed for ACA take-up" - definition_period = YEAR diff --git a/policyengine_us/variables/gov/aca/takes_up_aca_if_eligible.py b/policyengine_us/variables/gov/aca/takes_up_aca_if_eligible.py index b354bc2a5fd..1dc7d5accf4 100644 --- a/policyengine_us/variables/gov/aca/takes_up_aca_if_eligible.py +++ b/policyengine_us/variables/gov/aca/takes_up_aca_if_eligible.py @@ -4,10 +4,11 @@ class takes_up_aca_if_eligible(Variable): value_type = bool entity = TaxUnit - label = "Whether a random eligible SPM unit does not claim ACA Premium Tax Credit" + label = "Whether an eligible tax unit claims ACA Premium Tax Credit" + documentation = ( + "Generated stochastically in the dataset using take-up rates. " + "No formula - purely deterministic rules engine." + ) definition_period = YEAR - - def formula(tax_unit, period, parameters): - seed = tax_unit("aca_take_up_seed", period) - takeup_rate = parameters(period).gov.aca.takeup_rate - return seed < takeup_rate + # For policy calculator (non-dataset), defaults to True (full take-up assumption) + default_value = True diff --git a/policyengine_us/variables/gov/hhs/head_start/early_head_start.py b/policyengine_us/variables/gov/hhs/head_start/early_head_start.py index 6d6fdcb3244..48b639fc50b 100644 --- a/policyengine_us/variables/gov/hhs/head_start/early_head_start.py +++ b/policyengine_us/variables/gov/hhs/head_start/early_head_start.py @@ -11,6 +11,9 @@ class early_head_start(Variable): reference = "https://headstart.gov/program-data/article/head-start-program-facts-fiscal-year-2022" def formula(person, period, parameters): + takes_up = person("takes_up_early_head_start_if_eligible", period) + is_in_microsim = hasattr(person.simulation, "dataset") + p = parameters(period).gov.hhs.head_start.early_head_start state = person.household("state_code_str", period) spending = p.spending[state] @@ -18,4 +21,8 @@ def formula(person, period, parameters): mask = enrollment > 0 result = np.zeros_like(p.spending[state]) result[mask] = spending[mask] / enrollment[mask] - return result + + if is_in_microsim: + return result * takes_up + else: + return result diff --git a/policyengine_us/variables/gov/hhs/head_start/head_start.py b/policyengine_us/variables/gov/hhs/head_start/head_start.py index 0269d782caa..880819d2c9e 100644 --- a/policyengine_us/variables/gov/hhs/head_start/head_start.py +++ b/policyengine_us/variables/gov/hhs/head_start/head_start.py @@ -11,6 +11,9 @@ class head_start(Variable): reference = "https://headstart.gov/program-data/article/head-start-program-facts-fiscal-year-2022" def formula(person, period, parameters): + takes_up = person("takes_up_head_start_if_eligible", period) + is_in_microsim = hasattr(person.simulation, "dataset") + p = parameters(period).gov.hhs.head_start state = person.household("state_code_str", period) spending = p.spending[state] @@ -18,4 +21,8 @@ def formula(person, period, parameters): mask = enrollment > 0 result = np.zeros_like(p.spending[state]) result[mask] = spending[mask] / enrollment[mask] - return result + + if is_in_microsim: + return result * takes_up + else: + return result diff --git a/policyengine_us/variables/gov/hhs/head_start/takes_up_early_head_start_if_eligible.py b/policyengine_us/variables/gov/hhs/head_start/takes_up_early_head_start_if_eligible.py new file mode 100644 index 00000000000..f02196ae783 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/head_start/takes_up_early_head_start_if_eligible.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * + + +class takes_up_early_head_start_if_eligible(Variable): + value_type = bool + entity = Person + label = "Whether an eligible person enrolls in Early Head Start" + documentation = ( + "Generated stochastically in the dataset using take-up rates. " + "No formula - purely deterministic rules engine." + ) + definition_period = YEAR + # For policy calculator (non-dataset), defaults to True (full take-up assumption) + default_value = True diff --git a/policyengine_us/variables/gov/hhs/head_start/takes_up_head_start_if_eligible.py b/policyengine_us/variables/gov/hhs/head_start/takes_up_head_start_if_eligible.py new file mode 100644 index 00000000000..cd7b73ccdfa --- /dev/null +++ b/policyengine_us/variables/gov/hhs/head_start/takes_up_head_start_if_eligible.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * + + +class takes_up_head_start_if_eligible(Variable): + value_type = bool + entity = Person + label = "Whether an eligible person enrolls in Head Start" + documentation = ( + "Generated stochastically in the dataset using take-up rates. " + "No formula - purely deterministic rules engine." + ) + definition_period = YEAR + # For policy calculator (non-dataset), defaults to True (full take-up assumption) + default_value = True diff --git a/policyengine_us/variables/gov/hhs/medicaid/medicaid_take_up_seed.py b/policyengine_us/variables/gov/hhs/medicaid/medicaid_take_up_seed.py deleted file mode 100644 index e81d43af0d2..00000000000 --- a/policyengine_us/variables/gov/hhs/medicaid/medicaid_take_up_seed.py +++ /dev/null @@ -1,8 +0,0 @@ -from policyengine_us.model_api import * - - -class medicaid_take_up_seed(Variable): - value_type = float - entity = Person - label = "Randomly assigned seed for Medicaid take-up" - definition_period = YEAR diff --git a/policyengine_us/variables/gov/hhs/medicaid/takes_up_medicaid_if_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/takes_up_medicaid_if_eligible.py index c1497f24557..98cc18ea8d8 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/takes_up_medicaid_if_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/takes_up_medicaid_if_eligible.py @@ -4,10 +4,11 @@ class takes_up_medicaid_if_eligible(Variable): value_type = bool entity = Person - label = "Whether a random eligible person unit does not enroll in Medicaid" + label = "Whether an eligible person enrolls in Medicaid" + documentation = ( + "Generated stochastically in the dataset using take-up rates. " + "No formula - purely deterministic rules engine." + ) definition_period = YEAR - - def formula(person, period, parameters): - seed = person("medicaid_take_up_seed", period) - takeup_rate = parameters(period).gov.hhs.medicaid.takeup_rate - return seed < takeup_rate + # For policy calculator (non-dataset), defaults to True (full take-up assumption) + default_value = True diff --git a/policyengine_us/variables/gov/usda/snap/snap_take_up_seed.py b/policyengine_us/variables/gov/usda/snap/snap_take_up_seed.py deleted file mode 100644 index 32ed1cc93d8..00000000000 --- a/policyengine_us/variables/gov/usda/snap/snap_take_up_seed.py +++ /dev/null @@ -1,8 +0,0 @@ -from policyengine_us.model_api import * - - -class snap_take_up_seed(Variable): - value_type = float - entity = SPMUnit - label = "Randomly assigned seed for SNAP take-up" - definition_period = YEAR diff --git a/policyengine_us/variables/gov/usda/snap/takes_up_snap_if_eligible.py b/policyengine_us/variables/gov/usda/snap/takes_up_snap_if_eligible.py index 96a1179c69c..942859274d6 100644 --- a/policyengine_us/variables/gov/usda/snap/takes_up_snap_if_eligible.py +++ b/policyengine_us/variables/gov/usda/snap/takes_up_snap_if_eligible.py @@ -4,10 +4,11 @@ class takes_up_snap_if_eligible(Variable): value_type = bool entity = SPMUnit - label = "Whether a random eligible SPM unit does not claim SNAP" + label = "Whether an eligible SPM unit claims SNAP" + documentation = ( + "Generated stochastically in the dataset using take-up rates. " + "No formula - purely deterministic rules engine." + ) definition_period = YEAR - - def formula(spm_unit, period, parameters): - seed = spm_unit("snap_take_up_seed", period) - takeup_rate = parameters(period).gov.usda.snap.takeup_rate - return seed < takeup_rate + # For policy calculator (non-dataset), defaults to True (full take-up assumption) + default_value = True