policyengine-us 1.432.6__py3-none-any.whl → 1.432.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/README.md +1 -206
  2. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/{income/all.yaml → income.yaml} +1 -1
  3. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution.yaml +70 -0
  4. policyengine_us/tests/policy/baseline/gov/ed/pell_grant/pell_grant_simplified_formula_applies.yaml +1 -1
  5. policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/income_elasticity.yaml +6 -12
  6. policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/labor_supply_behavioral_response.yaml +24 -2
  7. policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/substitution_elasticity.yaml +35 -10
  8. policyengine_us/tests/policy/baseline/gov/test_categorical_eligibility_vectorization.yaml +41 -0
  9. policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.py +1 -2
  10. policyengine_us/variables/gov/fcc/lifeline/is_lifeline_eligible.py +2 -2
  11. policyengine_us/variables/gov/simulation/labor_supply_response/income_elasticity.py +1 -27
  12. policyengine_us/variables/gov/simulation/labor_supply_response/substitution_elasticity.py +18 -43
  13. policyengine_us/variables/gov/states/ca/cpuc/care/eligibility/ca_care_categorically_eligible.py +2 -2
  14. {policyengine_us-1.432.6.dist-info → policyengine_us-1.432.8.dist-info}/METADATA +1 -1
  15. {policyengine_us-1.432.6.dist-info → policyengine_us-1.432.8.dist-info}/RECORD +18 -24
  16. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/age_multiplier_over_threshold.yaml +0 -11
  17. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/age_threshold.yaml +0 -9
  18. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/base.yaml +0 -11
  19. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/age_multiplier_over_threshold.yaml +0 -11
  20. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/age_threshold.yaml +0 -9
  21. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/all.yaml +0 -6
  22. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/by_position_and_decile.yaml +0 -71
  23. policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/integration.yaml +0 -45
  24. {policyengine_us-1.432.6.dist-info → policyengine_us-1.432.8.dist-info}/WHEEL +0 -0
  25. {policyengine_us-1.432.6.dist-info → policyengine_us-1.432.8.dist-info}/entry_points.txt +0 -0
  26. {policyengine_us-1.432.6.dist-info → policyengine_us-1.432.8.dist-info}/licenses/LICENSE +0 -0
@@ -1,206 +1 @@
1
- # Labor Supply Response Elasticities
2
-
3
- This directory contains parameters for labor supply response elasticities used in behavioral microsimulation analysis.
4
-
5
- ## Overview
6
-
7
- Labor supply elasticities measure how individuals adjust their work behavior in response to changes in economic incentives:
8
-
9
- - **Substitution elasticity**: How labor supply responds to changes in the effective marginal wage rate (after-tax wage)
10
- - **Income elasticity**: How labor supply responds to changes in disposable income
11
-
12
- ## Age Heterogeneity: The Multiplier Approach
13
-
14
- Both elasticity types support age-based heterogeneity through an **age multiplier** that scales base elasticities for individuals aged 65 and over. This approach is based on empirical research showing that older workers have higher labor supply elasticities than working-age adults.
15
-
16
- ### Research Findings
17
-
18
- - **French (2005)**: Elasticities 3.0x-3.25x higher for age 60 vs age 40 workers
19
- - **CBO Working Papers (2012-12, 2012-13)**: Frisch elasticity ranges from 0.27 to 0.53 (central: 0.40) for working-age adults
20
- - **General pattern**: Retirement-age individuals (62-70) have particularly high elasticities, especially on the extensive margin (whether to work at all)
21
-
22
- ### Why a Multiplier Approach?
23
-
24
- The multiplier approach was chosen over separate age-specific parameters because:
25
- 1. **Evidence-based**: Literature consistently shows older workers are more elastic, but doesn't provide income-decile-specific multipliers
26
- 2. **Parsimony**: 13 total parameters instead of 44 (11 base elasticities + 2 age multipliers)
27
- 3. **Transparency**: Users can easily understand and adjust one multiplier value
28
- 4. **Flexibility**: Multiplier can range from 1.0 (no age effect) to 3.0+ (French 2005 finding)
29
-
30
- ## Substitution Elasticity Structure
31
-
32
- The substitution elasticity uses a two-step calculation:
33
-
34
- ### Step 1: Base Elasticity (by position and decile)
35
-
36
- Base elasticities vary by:
37
- 1. **Position**: primary earner vs secondary earner within tax unit
38
- 2. **Decile**: 10 income deciles (for primary earners only)
39
-
40
- This creates 11 base elasticity parameters:
41
- - 10 for primary earners by decile
42
- - 1 for secondary earners (all deciles)
43
-
44
- ### Step 2: Age Multiplier
45
-
46
- For individuals aged 65 and over, the base elasticity is multiplied by `age_multiplier_65_and_over`.
47
-
48
- **Formula**:
49
- - If age < 65: `elasticity = base_elasticity`
50
- - If age >= 65: `elasticity = base_elasticity × age_multiplier_65_and_over`
51
-
52
- ### Global Override
53
-
54
- The `all` parameter overrides all base elasticities and age multipliers if set to non-zero.
55
-
56
- ## Income Elasticity Structure
57
-
58
- The income elasticity uses a simpler two-parameter structure:
59
-
60
- 1. **Base elasticity**: Applied to all working-age individuals (under 65)
61
- 2. **Age multiplier**: Applied to individuals 65 and over
62
-
63
- **Formula**:
64
- - If age < 65: `elasticity = base`
65
- - If age >= 65: `elasticity = base × age_multiplier_65_and_over`
66
-
67
- The `all` parameter overrides base and multiplier if set to non-zero.
68
-
69
- ## Default Values
70
-
71
- - All base elasticities default to 0 (no behavioral response)
72
- - Age multipliers default to 2.0 (conservative estimate based on literature)
73
- - Users must explicitly set base elasticity values to enable behavioral responses
74
-
75
- ## Usage Examples
76
-
77
- ### Example 1: No behavioral response (default)
78
- ```yaml
79
- substitution:
80
- by_position_and_decile:
81
- primary:
82
- 1: 0
83
- 2: 0
84
- # ... all zeros
85
- secondary: 0
86
- age_multiplier_65_and_over: 2.0 # Doesn't matter since base is 0
87
-
88
- income:
89
- base: 0
90
- age_multiplier_65_and_over: 2.0 # Doesn't matter since base is 0
91
- ```
92
-
93
- Result: Everyone has zero elasticity regardless of age.
94
-
95
- ### Example 2: Same elasticity for all ages
96
- ```yaml
97
- substitution:
98
- by_position_and_decile:
99
- primary:
100
- 1: 0.31 # CBO-style values
101
- 2: 0.27
102
- # ... other deciles
103
- secondary: 0.40
104
- age_multiplier_65_and_over: 1.0 # No age effect
105
-
106
- income:
107
- base: -0.04
108
- age_multiplier_65_and_over: 1.0 # No age effect
109
- ```
110
-
111
- Result: Same elasticity for everyone regardless of age.
112
-
113
- ### Example 3: Higher elasticity for elderly (RECOMMENDED)
114
- ```yaml
115
- substitution:
116
- by_position_and_decile:
117
- primary:
118
- 1: 0.31
119
- 2: 0.27
120
- # ... other deciles
121
- secondary: 0.40
122
- age_multiplier_65_and_over: 2.0 # Conservative estimate
123
-
124
- income:
125
- base: -0.04
126
- age_multiplier_65_and_over: 2.0
127
- ```
128
-
129
- Result:
130
- - Age 40, primary earner, decile 1: elasticity = 0.31
131
- - Age 70, primary earner, decile 1: elasticity = 0.31 × 2.0 = 0.62
132
- - Age 40: income elasticity = -0.04
133
- - Age 70: income elasticity = -0.04 × 2.0 = -0.08
134
-
135
- ### Example 4: Aggressive multiplier based on French (2005)
136
- ```yaml
137
- substitution:
138
- age_multiplier_65_and_over: 3.0 # Upper end of literature
139
-
140
- income:
141
- base: -0.04
142
- age_multiplier_65_and_over: 3.0
143
- ```
144
-
145
- Result:
146
- - Age 70, primary earner, decile 1 (base 0.31): elasticity = 0.31 × 3.0 = 0.93
147
- - Age 70: income elasticity = -0.04 × 3.0 = -0.12
148
-
149
- ## Multiplier Value Guidance
150
-
151
- Based on literature review (see `age_heterogeneity_analysis.md`):
152
-
153
- | Multiplier | Interpretation | Source |
154
- |------------|----------------|--------|
155
- | 1.0 | No age difference | Ignores evidence |
156
- | 1.5 | Conservative | Lower end of estimates |
157
- | 2.0 | **Recommended default** | Conservative but evidence-based |
158
- | 2.5 | Moderate | Midpoint of French (2005) range |
159
- | 3.0 | Aggressive | French (2005) finding for age 60 vs 40 |
160
- | 3.25 | Upper bound | Upper end of French (2005) range |
161
-
162
- **Note**: The exact multiplier value has uncertainty. We recommend starting with 2.0 and conducting sensitivity analysis with values in the 1.5-3.0 range.
163
-
164
- ## References
165
-
166
- - [French (2005): "The Effects of Health, Wealth, and Wages on Labour Supply and Retirement Behaviour"](https://academic.oup.com/restud/article-abstract/72/2/395/1558553) - Review of Economic Studies 72(2): 395-427
167
- - [CBO Working Paper 2012-12: "A Review of Recent Research on Labor Supply Elasticities"](https://www.cbo.gov/publication/43675) - McClelland & Mok
168
- - [CBO Working Paper 2012-13: "Review of Estimates of the Frisch Elasticity of Labor Supply"](https://www.cbo.gov/publication/43676) - Reichling & Whalen
169
-
170
- ## Implementation Notes
171
-
172
- - Age is determined from the `age` variable for the year (`period.this_year`)
173
- - Age 65 is the cutoff: age < 65 uses base elasticity, age >= 65 applies multiplier
174
- - Primary earner is defined as the highest earner within the tax unit
175
- - Earnings deciles are determined using hardcoded markers (TODO: parametrize)
176
- - Negative total earnings result in zero elasticity (using `max_(earnings, 0)`)
177
- - Zero base elasticity remains zero even with multiplier (0 × multiplier = 0)
178
-
179
- ## Technical Details
180
-
181
- ### How Primary/Secondary Earner is Determined
182
-
183
- Within each tax unit, the person with the highest total earnings (employment + self-employment) is designated as the primary earner. All other earners in the unit are secondary earners. This means:
184
- - Single-person tax units: That person is always primary
185
- - Multi-person tax units: Only the highest earner gets primary elasticity; others get zero (since secondary earner base elasticities default to 0)
186
-
187
- ### Earnings Decile Markers
188
-
189
- Current hardcoded decile boundaries (TODO: parametrize):
190
- - Decile 1: $0 - $14,000
191
- - Decile 2: $14,000 - $28,000
192
- - Decile 3: $28,000 - $39,000
193
- - Decile 4: $39,000 - $50,000
194
- - Decile 5: $50,000 - $61,000
195
- - Decile 6: $61,000 - $76,000
196
- - Decile 7: $76,000 - $97,000
197
- - Decile 8: $97,000 - $138,000
198
- - Decile 9: $138,000 - $1,726,000
199
- - Decile 10: $1,726,000+
200
-
201
- ### Negative Earnings Handling
202
-
203
- To prevent negative earnings from causing sign flips in economic responses, the code applies `max_(earnings, 0)` before calculating elasticities. This means:
204
- - Positive net earnings: Normal elasticity calculation
205
- - Negative net earnings: Treated as zero earnings, resulting in zero substitution elasticity
206
- - Income elasticity still applies to individuals with negative earnings
1
+ # Elasticities
@@ -1,4 +1,4 @@
1
- description: Percent change (of the change in disposable income) in labor supply given a 1% change in disposable income. This parameter overrides the base income elasticity and age multiplier if provided.
1
+ description: Percent change (of the change in disposable income) in labor supply given a 1% change in disposable income.
2
2
  values:
3
3
  2020-01-01: 0
4
4
  metadata:
@@ -0,0 +1,70 @@
1
+ all:
2
+ description: Percent change (of the change in the effective marginal wage) in labor supply given a 1% change in the effective marginal wage. This parameter overrides all other substitution elasticities if provided.
3
+ values:
4
+ 2020-01-01: 0
5
+ metadata:
6
+ unit: /1
7
+ label: substitution elasticity of labor supply
8
+ by_position_and_decile:
9
+ metadata:
10
+ label: by position and decile
11
+ unit: /1
12
+ propagate_metadata_to_children: true
13
+ primary:
14
+ metadata:
15
+ label: primary adult
16
+ 1:
17
+ metadata:
18
+ label: primary adult, 1st decile substitution elasticity
19
+ values:
20
+ 2020-01-01: 0
21
+ 2:
22
+ metadata:
23
+ label: primary adult, 2nd decile substitution elasticity
24
+ values:
25
+ 2020-01-01: 0
26
+ 3:
27
+ metadata:
28
+ label: primary adult, 3rd decile substitution elasticity
29
+ values:
30
+ 2020-01-01: 0
31
+ 4:
32
+ metadata:
33
+ label: primary adult, 4th decile substitution elasticity
34
+ values:
35
+ 2020-01-01: 0
36
+ 5:
37
+ metadata:
38
+ label: primary adult, 5th decile substitution elasticity
39
+ values:
40
+ 2020-01-01: 0
41
+ 6:
42
+ metadata:
43
+ label: primary adult, 6th decile substitution elasticity
44
+ values:
45
+ 2020-01-01: 0
46
+ 7:
47
+ metadata:
48
+ label: primary adult, 7th decile substitution elasticity
49
+ values:
50
+ 2020-01-01: 0
51
+ 8:
52
+ metadata:
53
+ label: primary adult, 8th decile substitution elasticity
54
+ values:
55
+ 2020-01-01: 0
56
+ 9:
57
+ metadata:
58
+ label: primary adult, 9th decile substitution elasticity
59
+ values:
60
+ 2020-01-01: 0
61
+ 10:
62
+ metadata:
63
+ label: primary adult, 10th decile substitution elasticity
64
+ values:
65
+ 2020-01-01: 0
66
+ secondary:
67
+ metadata:
68
+ label: secondary adult, all deciles substitution elasticity
69
+ values:
70
+ 2020-01-01: 0
@@ -135,7 +135,7 @@
135
135
  tanf: 0
136
136
  spm_unit_wic: 0
137
137
  output:
138
- pell_grant_simplified_formula_applies: true
138
+ pell_grant_simplified_formula_applies: [false, true] # main has no benefits, other has medicaid
139
139
 
140
140
  - name: Too much income
141
141
  period: 2023
@@ -1,19 +1,13 @@
1
- - name: Income elasticity for person under 65 uses base
1
+ - name: Default income elasticity is zero
2
2
  period: 2023
3
3
  input:
4
- age: 50
5
- gov.simulation.labor_supply_responses.elasticities.income.all: 0
6
- gov.simulation.labor_supply_responses.elasticities.income.base: -0.04
7
- gov.simulation.labor_supply_responses.elasticities.income.age_multiplier_over_threshold: 2.0
4
+ gov.simulation.labor_supply_responses.elasticities.income: 0
8
5
  output:
9
- income_elasticity: -0.04
6
+ income_elasticity: 0
10
7
 
11
- - name: Income elasticity for person 65+ applies multiplier
8
+ - name: Custom income elasticity value
12
9
  period: 2023
13
10
  input:
14
- age: 70
15
- gov.simulation.labor_supply_responses.elasticities.income.all: 0
16
- gov.simulation.labor_supply_responses.elasticities.income.base: -0.04
17
- gov.simulation.labor_supply_responses.elasticities.income.age_multiplier_over_threshold: 2.0
11
+ gov.simulation.labor_supply_responses.elasticities.income: -0.2
18
12
  output:
19
- income_elasticity: -0.08
13
+ income_elasticity: -0.2
@@ -1,9 +1,31 @@
1
+ - name: No elasticities means no response
2
+ period: 2023
3
+ input:
4
+ employment_income_before_lsr: 50_000
5
+ self_employment_income_before_lsr: 10_000
6
+ gov.simulation.labor_supply_responses.elasticities.income: 0
7
+ gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
8
+ output:
9
+ labor_supply_behavioral_response: 0
10
+
11
+ - name: Zero income and substitution elasticities
12
+ period: 2023
13
+ input:
14
+ employment_income_before_lsr: 50_000
15
+ self_employment_income_before_lsr: 10_000
16
+ income_elasticity_lsr: 0
17
+ substitution_elasticity_lsr: 0
18
+ gov.simulation.labor_supply_responses.elasticities.income: 0
19
+ gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
20
+ output:
21
+ labor_supply_behavioral_response: 0
22
+
1
23
  - name: Negative total earnings with elasticities off
2
24
  period: 2023
3
25
  input:
4
26
  employment_income_before_lsr: 30_000
5
27
  self_employment_income_before_lsr: -40_000 # Net negative earnings
6
- gov.simulation.labor_supply_responses.elasticities.income.all: 0
28
+ gov.simulation.labor_supply_responses.elasticities.income: 0
7
29
  gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
8
30
  output:
9
31
  labor_supply_behavioral_response: 0
@@ -13,7 +35,7 @@
13
35
  input:
14
36
  employment_income_before_lsr: 50_000
15
37
  self_employment_income_before_lsr: -10_000 # Net positive earnings = 40_000
16
- gov.simulation.labor_supply_responses.elasticities.income.all: 0
38
+ gov.simulation.labor_supply_responses.elasticities.income: 0
17
39
  gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
18
40
  output:
19
41
  labor_supply_behavioral_response: 0
@@ -1,23 +1,48 @@
1
- - name: Primary earner under 65 in decile 5 with base elasticity
1
+ - name: Default substitution elasticity is zero
2
2
  period: 2023
3
3
  input:
4
- age: 50
5
4
  employment_income_before_lsr: 50_000
6
5
  self_employment_income_before_lsr: 0
7
6
  gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
8
- gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.5: 0.15
9
- gov.simulation.labor_supply_responses.elasticities.substitution.age_multiplier_over_threshold: 2.0
10
7
  output:
11
- substitution_elasticity: 0.15
8
+ substitution_elasticity: 0
12
9
 
13
- - name: Primary earner 65+ in decile 5 with multiplier effect
10
+ - name: Global substitution elasticity override
14
11
  period: 2023
15
12
  input:
16
- age: 70
17
13
  employment_income_before_lsr: 50_000
18
14
  self_employment_income_before_lsr: 0
15
+ gov.simulation.labor_supply_responses.elasticities.substitution.all: 0.25
16
+ output:
17
+ substitution_elasticity: 0.25
18
+
19
+ - name: Primary earner in decile 1 with default parameters
20
+ period: 2023
21
+ input:
22
+ employment_income_before_lsr: 10_000
23
+ self_employment_income_before_lsr: 0
19
24
  gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
20
- gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.5: 0.15
21
- gov.simulation.labor_supply_responses.elasticities.substitution.age_multiplier_over_threshold: 2.0
25
+ gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.1: 0.1
26
+ gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.secondary: 0.2
22
27
  output:
23
- substitution_elasticity: 0.30
28
+ substitution_elasticity: 0 # TODO: Debug why single person isn't getting primary earner elasticity
29
+
30
+ - name: Negative total earnings should have zero elasticity
31
+ period: 2023
32
+ input:
33
+ employment_income_before_lsr: 50_000
34
+ self_employment_income_before_lsr: -60_000 # Net negative earnings
35
+ gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
36
+ gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.1: 0.2
37
+ output:
38
+ substitution_elasticity: 0 # max_(earnings, 0) = 0, so elasticity = 0
39
+
40
+ - name: Positive net earnings after self-employment loss
41
+ period: 2023
42
+ input:
43
+ employment_income_before_lsr: 50_000
44
+ self_employment_income_before_lsr: -5_000 # Net positive earnings = 45_000
45
+ gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
46
+ gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.5: 0.15 # 45k falls in decile 5
47
+ output:
48
+ substitution_elasticity: 0.15
@@ -0,0 +1,41 @@
1
+ - name: Categorical eligibility respects income limits with axes
2
+ period: 2025
3
+ absolute_error_margin: 100
4
+ input:
5
+ people:
6
+ parent:
7
+ age: 40
8
+ child:
9
+ age: 1
10
+ families:
11
+ fam:
12
+ members: [parent, child]
13
+ marital_units:
14
+ mu1:
15
+ members: [parent]
16
+ mu2:
17
+ members: [child]
18
+ marital_unit_id: 1
19
+ tax_units:
20
+ tu:
21
+ members: [parent, child]
22
+ spm_units:
23
+ spm:
24
+ members: [parent, child]
25
+ households:
26
+ hh:
27
+ members: [parent, child]
28
+ state_code: CA
29
+ axes:
30
+ - - name: employment_income
31
+ min: 0
32
+ max: 100_000
33
+ count: 5
34
+ output:
35
+ # At $0, $25k, $50k, $75k, $100k income
36
+ # Child should only be eligible at low incomes (below ~$26k FPG for family of 2)
37
+ is_early_head_start_eligible: [True, True, False, False, False, True, True, False, False, False]
38
+ # SPM unit lifeline eligibility (indices 0,2,4,6,8 for 5 income levels)
39
+ is_lifeline_eligible: [True, False, False, False, False]
40
+ # Household CA CARE eligibility (indices 0,2,4,6,8 for 5 income levels)
41
+ ca_care_categorically_eligible: [True, False, False, False, False]
@@ -12,6 +12,5 @@ class pell_grant_simplified_formula_applies(Variable):
12
12
  head_income = tax_unit("pell_grant_primary_income", period)
13
13
  p = parameters(period).gov.ed.pell_grant.efc.simplified
14
14
  income_eligible = head_income < p.income_limit
15
- total_benefits = add(tax_unit, period, p.benefits)
16
- has_benefits = np.any(total_benefits > 0)
15
+ has_benefits = add(tax_unit, period, p.benefits) > 0
17
16
  return income_eligible & has_benefits & p.applies
@@ -21,8 +21,8 @@ class is_lifeline_eligible(Variable):
21
21
  )
22
22
  categorically_eligible = np.where(
23
23
  is_on_tribal_land,
24
- np.any(tribal_lifeline_programs),
25
- np.any(non_tribal_lifeline_programs),
24
+ tribal_lifeline_programs > 0,
25
+ non_tribal_lifeline_programs > 0,
26
26
  )
27
27
  # Use the new unified income eligibility variable
28
28
  income_eligible = spm_unit("is_lifeline_income_eligible", period)
@@ -7,30 +7,4 @@ class income_elasticity(Variable):
7
7
  label = "income elasticity of labor supply"
8
8
  unit = "/1"
9
9
  definition_period = YEAR
10
- reference = [
11
- "https://www.cbo.gov/publication/43675",
12
- "https://www.cbo.gov/publication/43676",
13
- "https://academic.oup.com/restud/article-abstract/72/2/395/1558553",
14
- ]
15
-
16
- def formula(person, period, parameters):
17
- p = parameters(
18
- period
19
- ).gov.simulation.labor_supply_responses.elasticities.income
20
-
21
- # Check if global override is set
22
- if p.all != 0:
23
- return p.all
24
-
25
- # Get base income elasticity
26
- base_elasticity = p.base
27
-
28
- # Apply age multiplier for individuals at or above age threshold
29
- age = person("age", period.this_year)
30
- age_multiplier = where(
31
- age >= p.age_threshold,
32
- p.age_multiplier_over_threshold,
33
- 1.0, # No multiplier for under threshold
34
- )
35
-
36
- return base_elasticity * age_multiplier
10
+ adds = ["gov.simulation.labor_supply_responses.elasticities.income"]
@@ -7,18 +7,12 @@ class substitution_elasticity(Variable):
7
7
  label = "substitution elasticity of labor supply"
8
8
  unit = "/1"
9
9
  definition_period = YEAR
10
- reference = [
11
- "https://www.cbo.gov/publication/43675",
12
- "https://www.cbo.gov/publication/43676",
13
- "https://academic.oup.com/restud/article-abstract/72/2/395/1558553",
14
- ]
15
10
 
16
11
  def formula(person, period, parameters):
17
12
  p = parameters(
18
13
  period
19
14
  ).gov.simulation.labor_supply_responses.elasticities.substitution
20
15
 
21
- # Check for global override
22
16
  if p.all != 0:
23
17
  return p.all
24
18
 
@@ -36,7 +30,6 @@ class substitution_elasticity(Variable):
36
30
  1_726e3,
37
31
  ]
38
32
 
39
- # Calculate earnings
40
33
  raw_earnings = add(
41
34
  person,
42
35
  period,
@@ -45,59 +38,41 @@ class substitution_elasticity(Variable):
45
38
  "self_employment_income_before_lsr",
46
39
  ],
47
40
  )
48
- # Use max_ to prevent negative earnings from causing issues
49
41
  earnings = max_(raw_earnings, 0)
50
- # Use searchsorted with side='right' to bin earnings into deciles
51
- # This gives decile numbers 1-10 directly without needing to add 1
52
- earnings_decile = np.searchsorted(
53
- EARNINGS_DECILE_MARKERS, earnings, side="right"
42
+ earnings_decile = (
43
+ np.searchsorted(EARNINGS_DECILE_MARKERS, earnings) + 1
54
44
  )
55
45
 
56
- # Determine if primary earner (highest earner in tax unit)
57
46
  tax_unit = person.tax_unit
47
+ # Primary earner == highest earner in tax unit
58
48
  max_earnings_in_unit = tax_unit.max(earnings)
59
49
  is_primary_earner = earnings == max_earnings_in_unit
60
50
 
61
- # Get base elasticity from position and decile
62
- base_elasticity = np.zeros_like(earnings, dtype=float)
51
+ elasticities = np.zeros_like(earnings)
63
52
 
64
53
  # Handle zero earnings first
65
54
  zero_earnings = earnings == 0
66
- base_elasticity[zero_earnings] = 0
55
+ elasticities[zero_earnings] = 0
67
56
 
68
- # For non-zero earnings, assign base elasticities
57
+ # For non-zero earnings, assign elasticities
69
58
  non_zero_earnings = earnings > 0
70
59
 
71
60
  if np.any(non_zero_earnings):
72
- # Primary earners by decile
73
- for i in range(10): # Iterate through deciles 1-10
74
- decile_num = i + 1 # Decile numbers are 1-10
61
+ # First assign primary earner elasticities by decile
62
+ decile_elasticities = [
63
+ p.by_position_and_decile.primary._children[str(i + 1)]
64
+ for i in range(10)
65
+ ]
66
+ for i in range(10):
75
67
  mask = (
76
68
  non_zero_earnings
77
- & (earnings_decile == decile_num)
69
+ & (earnings_decile == i + 1)
78
70
  & is_primary_earner
79
71
  )
80
- if np.any(mask):
81
- # Access parameter using getattr to handle both normal and test scenarios
82
- decile_param = getattr(
83
- p.by_position_and_decile.primary, str(decile_num)
84
- )
85
- # Handle both Parameter objects and raw values (when overridden in tests)
86
- param_value = (
87
- decile_param(period)
88
- if callable(decile_param)
89
- else decile_param
90
- )
91
- base_elasticity[mask] = param_value
72
+ elasticities[mask] = decile_elasticities[i]
92
73
 
93
- # Secondary earners get zero elasticity (only primary earners have non-zero values)
74
+ # Then assign secondary earner elasticity where applicable
75
+ secondary_mask = non_zero_earnings & ~is_primary_earner
76
+ elasticities[secondary_mask] = p.by_position_and_decile.secondary
94
77
 
95
- # Apply age multiplier for individuals at or above age threshold
96
- age = person("age", period.this_year)
97
- age_multiplier = where(
98
- age >= p.age_threshold,
99
- p.age_multiplier_over_threshold,
100
- 1.0, # No multiplier for under threshold
101
- )
102
-
103
- return base_elasticity * age_multiplier
78
+ return elasticities
@@ -17,6 +17,6 @@ class ca_care_categorically_eligible(Variable):
17
17
  tribal_lifeline_programs = add(household, period, p.tribal_categorical)
18
18
  return np.where(
19
19
  is_on_tribal_land,
20
- np.any(tribal_lifeline_programs),
21
- np.any(non_tribal_lifeline_programs),
20
+ tribal_lifeline_programs > 0,
21
+ non_tribal_lifeline_programs > 0,
22
22
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: policyengine-us
3
- Version: 1.432.6
3
+ Version: 1.432.8
4
4
  Summary: Add your description here.
5
5
  Author-email: PolicyEngine <hello@policyengine.org>
6
6
  License-File: LICENSE
@@ -920,15 +920,9 @@ policyengine_us/parameters/gov/simulation/capital_gains_responses/elasticity.yam
920
920
  policyengine_us/parameters/gov/simulation/labor_supply_responses/bounds/README.md,sha256=o3Ma9FY6zLzF3qYli3J52cv2Dw1WGvJUp9kDuXkDx-U,9
921
921
  policyengine_us/parameters/gov/simulation/labor_supply_responses/bounds/effective_wage_rate_change.yaml,sha256=MtDdf5nH1N3-snStnkvh9JsfWlLfP0aKiTsBz23Yi7I,179
922
922
  policyengine_us/parameters/gov/simulation/labor_supply_responses/bounds/income_change.yaml,sha256=G3jBCDCS9aVPm_fIk7MroG3eeHC9R4FHFvyvFylhzXI,157
923
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/README.md,sha256=p_ZppvSIgEdLOXZGN3PagygmqYfKlwaZDUWKakceNpc,7843
924
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/age_multiplier_over_threshold.yaml,sha256=QpIwprtWdpjLbGp0PkSWdCJPEmPs5l-Kc7MZP3rY3Lc,769
925
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/age_threshold.yaml,sha256=F1-N4w7C3L_NksKdcxrYbHtD4Qc9GF9IVNJ8mxbCeJQ,644
926
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/all.yaml,sha256=yfIGr7j1GjiQgEfgvVW1BINWMhyDLQMzSO21Eq96imE,293
927
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/base.yaml,sha256=IDdYy_GyuF-6vqZ2vtMHoJfA9X0GCNuOCxVQ8N8-D24,648
928
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/age_multiplier_over_threshold.yaml,sha256=t16tyufELBFdV-UItR7BXf8BVgXVoXkdnxugJbRzaO4,802
929
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/age_threshold.yaml,sha256=F1-N4w7C3L_NksKdcxrYbHtD4Qc9GF9IVNJ8mxbCeJQ,644
930
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/all.yaml,sha256=JjAYkRUs6zcy8bPrP6HSiKqpCTxXhDFHKPrTLBW14NY,309
931
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/by_position_and_decile.yaml,sha256=e0qsuZygCDZ_EbgGydfEYOSRxwU-AOpZfoblxsXTVkQ,2070
923
+ policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/README.md,sha256=jlWjpmYXUItsM3twGtNyUkbKuAaE8O9GjWcIF0bVAlg,14
924
+ policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income.yaml,sha256=8368gwpFH5jRPP3JOsZTmPrOoqN1d_WWiEwuKxDTrJQ,209
925
+ policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution.yaml,sha256=q3b4i70HTPpRPbKU95QCRxL0wVxzi9_PRqDhGznd7Cs,1869
932
926
  policyengine_us/parameters/gov/ssa/README.md,sha256=Rcxn6NYTRCJYhktw0-I4QxgcDsYYsqCKabBb7EJq4gw,39
933
927
  policyengine_us/parameters/gov/ssa/nawi.yaml,sha256=Dbb8NPv7AEmaKPhHgDsWA5D54Q2aJPkr0OSccgDR4bw,4197
934
928
  policyengine_us/parameters/gov/ssa/uprating.yaml,sha256=qR8giFlpvxYxaeOopHqy8BiGT1OQQEz2X09elmbLNl4,1447
@@ -3419,6 +3413,7 @@ policyengine_us/tests/policy/baseline/contrib/ubi_center/basic_income_eligible.y
3419
3413
  policyengine_us/tests/policy/baseline/contrib/ubi_center/basic_income_phase_in.yaml,sha256=NQqlPRrHDMbNADaFbzHa3BBtZFpC6mXXs6MJBI8DbTM,1274
3420
3414
  policyengine_us/tests/policy/baseline/contrib/ubi_center/basic_income_phase_out.yaml,sha256=hVUNLNcgpSpDPD5ogSLCOKeEhcVplmML0MZR_KQPLsg,772
3421
3415
  policyengine_us/tests/policy/baseline/gov/abolitions.yaml,sha256=KpFguu-FjU6H0PNZ7uyQymy7g4gRbfUTVVxYPj0b02w,250
3416
+ policyengine_us/tests/policy/baseline/gov/test_categorical_eligibility_vectorization.yaml,sha256=cmmrBz_8brf7e_7X_fYUX8Z4UzTrO0nhCjmsZ0uyOsA,1191
3422
3417
  policyengine_us/tests/policy/baseline/gov/aca/eligibility/aca_child_index.yaml,sha256=T3vKbC6typ0DO8qMVkUM-GfsyItUpyHnjM98KG6_BEs,413
3423
3418
  policyengine_us/tests/policy/baseline/gov/aca/eligibility/aca_magi.yaml,sha256=rYl5rPlZg-_LJIhiyDtwyDY0v7xMZoB-98weSvWWIZQ,892
3424
3419
  policyengine_us/tests/policy/baseline/gov/aca/eligibility/is_aca_eshi_eligible.yaml,sha256=XlrN4Hs9Uo-6KU1eWE7EZazb4KKf6QqIxdQLHN8_x88,542
@@ -3451,7 +3446,7 @@ policyengine_us/tests/policy/baseline/gov/doe/high_efficiency_electric_home_reba
3451
3446
  policyengine_us/tests/policy/baseline/gov/doe/residential_efficiency_electrification_rebate_program/residential_efficiency_electrification_rebate.yaml,sha256=zvI71cXcqxLmWMrGeVxvThuV6qeoxrJxyLylERpuYAg,2577
3452
3447
  policyengine_us/tests/policy/baseline/gov/ed/pell_grant/pell_grant.yaml,sha256=54khnkBUsX3irQw0fcLpRU0FAPF9Ec0VECOXwY_lYLI,1719
3453
3448
  policyengine_us/tests/policy/baseline/gov/ed/pell_grant/pell_grant_formula.yaml,sha256=922Z9zpQrnf7TvV9qelKM80PHV_2SVccb4zjJgJK-_8,666
3454
- policyengine_us/tests/policy/baseline/gov/ed/pell_grant/pell_grant_simplified_formula_applies.yaml,sha256=8Dn88rWvM3ywC2IY-KAvDCYpzLy60yaZBnuAl_VaZzQ,2898
3449
+ policyengine_us/tests/policy/baseline/gov/ed/pell_grant/pell_grant_simplified_formula_applies.yaml,sha256=B--hlfDdgKNjeeSMJGa8Eyav8aDVL12E80NlkEJ510o,2951
3455
3450
  policyengine_us/tests/policy/baseline/gov/ed/pell_grant/dependent/pell_grant_dependent_allowances.yaml,sha256=rAZIdoR0bK26DF8JVAlLqt72FnWztBfWKxsmYa5H4WM,608
3456
3451
  policyengine_us/tests/policy/baseline/gov/ed/pell_grant/dependent/pell_grant_dependent_contribution.yaml,sha256=6KfjUIGt5mNwQ0eStdh0bkrS7hCK6tLPZIURvAg8mew,1444
3457
3452
  policyengine_us/tests/policy/baseline/gov/ed/pell_grant/dependent/pell_grant_dependents_in_college.yaml,sha256=t3JFIIOW3If_lbp9yfNkTuOLTNL15HRt3mrSW2zTKI0,832
@@ -3794,10 +3789,9 @@ policyengine_us/tests/policy/baseline/gov/local/tx/harris/in_harris_county_tx.ya
3794
3789
  policyengine_us/tests/policy/baseline/gov/local/tx/harris/rides/tx_harris_rides_eligible.yaml,sha256=eOBTzdhMtzwr3QAUURqqpNKgAsk7z9HXl543qD8oqUo,796
3795
3790
  policyengine_us/tests/policy/baseline/gov/local/tx/harris/rides/tx_harris_rides_subsidy.yaml,sha256=m4V1kGW3ID_znp8EWOLZBX_PqyWhs371OJHZCY1VZq0,852
3796
3791
  policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/employment_income_behavioral_response.yaml,sha256=UyVqLHduKDRHuIE-wJS0czNGyEDmTNq2gIiVoW-kEpA,1695
3797
- policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/income_elasticity.yaml,sha256=JZAa-i5I9xkMgd_SPu5ifYfDAKnzYmv_B8nkvXfnhXE,747
3798
- policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/integration.yaml,sha256=hnRnR_mlswcCK-n7GTStDAa5bBME3nKR_VDIlIUoIx8,2385
3799
- policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/labor_supply_behavioral_response.yaml,sha256=5Zqh9KxGEg9u1CgIrxjFD6G-qYzZ7Ut9B9tdkwIdv5Q,799
3800
- policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/substitution_elasticity.yaml,sha256=LriCrDWZbyNX4g6bz__N1qesWuBgtgB_4vDbiFobIQQ,1022
3792
+ policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/income_elasticity.yaml,sha256=_NCgAPoomWP-Hp563Ih5mBtN7VTywrXmtx0BhFO5r0c,336
3793
+ policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/labor_supply_behavioral_response.yaml,sha256=FqBkZcYs-EFj-pNtUAtW85ZyGn_riZ3_pH-8DP90ORU,1551
3794
+ policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/substitution_elasticity.yaml,sha256=Cfb3-vmZxtLJdDIimJsByRDqdYh1ds5lBCQVgShDDtQ,2032
3801
3795
  policyengine_us/tests/policy/baseline/gov/ssa/ss/never_eligible_for_social_security_benefits.yaml,sha256=-l0F8L_YCNpNfwBtZLxEfPOCPea4ZHfGNAHRw3ozkYk,587
3802
3796
  policyengine_us/tests/policy/baseline/gov/ssa/ssi/integration_tests.yaml,sha256=CLLMuqslIKd8niom1AL0CrhnkGlTH30rF0MOfLTA_3o,8398
3803
3797
  policyengine_us/tests/policy/baseline/gov/ssa/ssi/is_ssi_aged_blind_disabled.yaml,sha256=tyim2uGywNbV57pL2M6DO2kH1I2lXZS6P2Vab2zyIRA,470
@@ -5696,7 +5690,7 @@ policyengine_us/variables/gov/ed/pell_grant/dependent/pell_grant_dependent_contr
5696
5690
  policyengine_us/variables/gov/ed/pell_grant/dependent/pell_grant_dependent_other_allowances.py,sha256=uZxYiH-F-SIseRaqgLnYlflw7Nazmg_Nl7AbPReMa7I,236
5697
5691
  policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_dependents_in_college.py,sha256=B4j9_-1KxIZcoBE2nsiGXCK9MKESPAOX-UUi8FZ9rP8,488
5698
5692
  policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_efc.py,sha256=ReZAFCtnowXQEr6__G74ffD6cXscAZ90vThBr8qI2fw,1133
5699
- policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.py,sha256=8kEDI-3CoUa5r68yv10P3reNab2KpwR6LxqV2TdCUWA,651
5693
+ policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.py,sha256=g1hOGhz7h96nR5kV-n9xY0pe5_2OaNV0NLIjW6FDp-8,603
5700
5694
  policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_uses_efc.py,sha256=c8Mbs2rQYg_ZIFX8dIZABzLhMbW_AIfsLWnKdeBgQDE,385
5701
5695
  policyengine_us/variables/gov/ed/pell_grant/head/pell_grant_head_allowances.py,sha256=te4MlQds6xbC3RX0QQ_NWDcC9FV0zCJr6-fDnKSS1XU,214
5702
5696
  policyengine_us/variables/gov/ed/pell_grant/head/pell_grant_head_assets.py,sha256=BMMA4gh8e7Rt-VR6FDz-oWd5hQLxb4wPGAumYQlls4E,550
@@ -5717,7 +5711,7 @@ policyengine_us/variables/gov/fcc/ebb/ebb.py,sha256=b6GkGJTr1EUM67vvgek7P-T88o7r
5717
5711
  policyengine_us/variables/gov/fcc/ebb/enrolled_in_ebb.py,sha256=8f2mhjIC2P3cNtOoAqoOp1OZTXZ9Z2HRWhCo40_OweI,298
5718
5712
  policyengine_us/variables/gov/fcc/ebb/is_ebb_eligible.py,sha256=deBBKNw-ehQOHhNDDMTEWoW0HyysYxBw-DWPux4ifzw,754
5719
5713
  policyengine_us/variables/gov/fcc/lifeline/broadband_cost_after_lifeline.py,sha256=QwdwiK-ghWxGghuLU8ib3hOTcln1HXxanXgQk84jT90,545
5720
- policyengine_us/variables/gov/fcc/lifeline/is_lifeline_eligible.py,sha256=9y87YwHwQkfLt2c0kkZfvPtX4zqHofT8dbI4D0efets,1117
5714
+ policyengine_us/variables/gov/fcc/lifeline/is_lifeline_eligible.py,sha256=Kv4iAgCC7hC6fUkIy6ufZmFV0pg-gwPWv32ubDDRdW8,1109
5721
5715
  policyengine_us/variables/gov/fcc/lifeline/is_lifeline_income_eligible.py,sha256=KcwZ8ar3G3O1tUS8YQTyBDAQyfYod3LA9guLTBLkXSU,1279
5722
5716
  policyengine_us/variables/gov/fcc/lifeline/lifeline.py,sha256=U39enY0v1HJXf9X7DY1lBjjeOkGxtAKDTnVQqZU3LQw,1890
5723
5717
  policyengine_us/variables/gov/hhs/hhs_smi.py,sha256=CfCM973bROOtUqPnp7MokOQBaZv1huJiDh37WYs0vME,1162
@@ -6222,13 +6216,13 @@ policyengine_us/variables/gov/local/tx/harris/rides/tx_harris_rides_eligible.py,
6222
6216
  policyengine_us/variables/gov/local/tx/harris/rides/tx_harris_rides_subsidy.py,sha256=fuMRW0_3Lh0q-9OJi3DyY0l5dJA_4ejj1fbIEl5xLWg,875
6223
6217
  policyengine_us/variables/gov/simulation/capital_gains_responses.py,sha256=Sjie6qu1LQIb5Ktk4iGXuEoHxQ0soSIenameuxHdyX0,5947
6224
6218
  policyengine_us/variables/gov/simulation/labor_supply_response/employment_income_behavioral_response.py,sha256=_gErh7LpoOhZ-_b67cg3qtNgexecofttE4fAw0-htMg,840
6225
- policyengine_us/variables/gov/simulation/labor_supply_response/income_elasticity.py,sha256=yVNHx5hJ0rI90J0OCyWeZ7xFWusK0Wotj-HIeZ1iPKE,1077
6219
+ policyengine_us/variables/gov/simulation/labor_supply_response/income_elasticity.py,sha256=QIi7EX2EmvW3S2nYP_6vJ37uU9YEsM249QGhudBoQ7Q,286
6226
6220
  policyengine_us/variables/gov/simulation/labor_supply_response/income_elasticity_lsr.py,sha256=GpHk3ZAYfsI6qXWD8iTJ_IRvaoYHg4s2gNeTl22kd2Y,732
6227
6221
  policyengine_us/variables/gov/simulation/labor_supply_response/labor_supply_behavioral_response.py,sha256=KpnZMqjMoS0tpDKT6TDp0ev9moxka5lisjqDxoHdOWA,2422
6228
6222
  policyengine_us/variables/gov/simulation/labor_supply_response/relative_income_change.py,sha256=EOCmle2VTADu0A0VXmSZk38SzVeH7oKPe-4Noyvl62c,1346
6229
6223
  policyengine_us/variables/gov/simulation/labor_supply_response/relative_wage_change.py,sha256=Lhn-zdGyIevS04jF3roS4101GF70N1-FPpNeKimW2iU,1361
6230
6224
  policyengine_us/variables/gov/simulation/labor_supply_response/self_employment_income_behavioral_response.py,sha256=zdJjfUOVbVRQEtcHVIssvxkS5D3BZlnn6GxI9AIA_mQ,352
6231
- policyengine_us/variables/gov/simulation/labor_supply_response/substitution_elasticity.py,sha256=eet1LtMM0h0E1cwLtNifajVA7NdKIz-LIr7YKs7GFHs,3528
6225
+ policyengine_us/variables/gov/simulation/labor_supply_response/substitution_elasticity.py,sha256=2_Wo5XPqMiC4LnSfbcSVj-P2QWUCCcGBd8r95c0Afjw,2282
6232
6226
  policyengine_us/variables/gov/simulation/labor_supply_response/substitution_elasticity_lsr.py,sha256=TH5bDW97u1N5pIr82eVve5DDt7A10kg5zAipjodFbd0,768
6233
6227
  policyengine_us/variables/gov/ssa/ss/never_eligible_for_social_security_benefits.py,sha256=Yc8a0ySF-Ddijb5CMJBNklqUSW4VQH7d5mNSJClo_6c,547
6234
6228
  policyengine_us/variables/gov/ssa/ss/social_security.py,sha256=J5zzCleYk_K5eMCtrlvzAlOXyLwJESqzcnF7w4ubiKU,438
@@ -6447,7 +6441,7 @@ policyengine_us/variables/gov/states/ca/cdss/tanf/child_care/reimbursement/ca_ca
6447
6441
  policyengine_us/variables/gov/states/ca/chhs/is_ca_medicaid_immigration_status_eligible.py,sha256=fAUNCk-fQJWqEOhBvJj8bXHZLipbKHILMmIcxs7RVGY,675
6448
6442
  policyengine_us/variables/gov/states/ca/cpuc/care/ca_care.py,sha256=7iOkWAbGhFDCg8aMTJgMrEdAKqc4l9fM1BU_Wq4Fl18,656
6449
6443
  policyengine_us/variables/gov/states/ca/cpuc/care/ca_care_amount_if_eligible.py,sha256=C0YjEX789tM6x9ZNCfqoqdNRydDJ4NMtZwyGOileqGM,695
6450
- policyengine_us/variables/gov/states/ca/cpuc/care/eligibility/ca_care_categorically_eligible.py,sha256=dgGynZU6eaJDm8K_XNRzYKisi-Gw79QX-JUjmXCfPG4,987
6444
+ policyengine_us/variables/gov/states/ca/cpuc/care/eligibility/ca_care_categorically_eligible.py,sha256=OUrSo-zQWNYKy9CG9ZpkUuX8joRMxHXAAWPgdPfhZ3k,979
6451
6445
  policyengine_us/variables/gov/states/ca/cpuc/care/eligibility/ca_care_eligible.py,sha256=uF8wxrLTfP7U_4FJR0VO130882LecXCPkMv2GCj2ZC4,493
6452
6446
  policyengine_us/variables/gov/states/ca/cpuc/care/eligibility/ca_care_income_eligible.py,sha256=xoB5jnnLQIrA0D3aNnQzTVwGzSDX6aFkEmz7H1n6N-U,951
6453
6447
  policyengine_us/variables/gov/states/ca/cpuc/care/eligibility/ca_care_poverty_line.py,sha256=730F0hmE8A0CB4t-YLKDFqhs7M8tr1Y0OduhbP0m21Y,852
@@ -8862,8 +8856,8 @@ policyengine_us/variables/input/farm_income.py,sha256=BEKxYmHNNnWJAAvULl5qZJigy5
8862
8856
  policyengine_us/variables/input/geography.py,sha256=Ux0ueAf0rhZaflyEqz81UuXP3xKCKBDvoO3CrKhiQEc,5421
8863
8857
  policyengine_us/variables/input/self_employment_income.py,sha256=PwsGz8R4lRikKWUYOhsC0qosNNLXq4f5SQmfw4S3mk8,511
8864
8858
  policyengine_us/variables/input/self_employment_income_before_lsr.py,sha256=E8fcX9Nlyqz8dziHhQv_euutdmoIwFMMWePUwbbwv_w,379
8865
- policyengine_us-1.432.6.dist-info/METADATA,sha256=75a1X1rBDk5oUiuFSwY3cJfpIfORQ6R8GDCssdxOf08,1649
8866
- policyengine_us-1.432.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
8867
- policyengine_us-1.432.6.dist-info/entry_points.txt,sha256=MLaqNyNTbReALyKNkde85VkuFFpdPWAcy8VRG1mjczc,57
8868
- policyengine_us-1.432.6.dist-info/licenses/LICENSE,sha256=2N5ReRelkdqkR9a-KP-y-shmcD5P62XoYiG-miLTAzo,34519
8869
- policyengine_us-1.432.6.dist-info/RECORD,,
8859
+ policyengine_us-1.432.8.dist-info/METADATA,sha256=SSIK2TtnmQUltDDLnwK3kXFbr7W7NPwuwSB0i0tSnXU,1649
8860
+ policyengine_us-1.432.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
8861
+ policyengine_us-1.432.8.dist-info/entry_points.txt,sha256=MLaqNyNTbReALyKNkde85VkuFFpdPWAcy8VRG1mjczc,57
8862
+ policyengine_us-1.432.8.dist-info/licenses/LICENSE,sha256=2N5ReRelkdqkR9a-KP-y-shmcD5P62XoYiG-miLTAzo,34519
8863
+ policyengine_us-1.432.8.dist-info/RECORD,,
@@ -1,11 +0,0 @@
1
- description: Multiplier applied to base income elasticity for individuals at or above the age threshold. Research suggests income effects are stronger for older workers. French (2005) shows much higher elasticities near retirement age. A multiplier of 2.0 is conservative. Set to 1.0 for no age difference.
2
- values:
3
- 2020-01-01: 2.0
4
- metadata:
5
- unit: /1
6
- label: elasticity multiplier for ages at or above threshold
7
- reference:
8
- - title: "French (2005): The Effects of Health, Wealth, and Wages on Labour Supply and Retirement Behaviour"
9
- href: https://academic.oup.com/restud/article-abstract/72/2/395/1558553
10
- - title: "CBO Working Paper 2012-12: A Review of Recent Research on Labor Supply Elasticities"
11
- href: https://www.cbo.gov/publication/43675
@@ -1,9 +0,0 @@
1
- description: Age at which the age multiplier begins to apply. Individuals at this age or older will have their base elasticity multiplied by the age multiplier. Default is 65 (typical retirement age), but can be adjusted to reflect different retirement patterns or policy scenarios (e.g., 62 for early retirement, 67 for full retirement age).
2
- values:
3
- 2020-01-01: 65
4
- metadata:
5
- unit: year
6
- label: age threshold for elasticity multiplier
7
- reference:
8
- - title: "French (2005): The Effects of Health, Wealth, and Wages on Labour Supply and Retirement Behaviour"
9
- href: https://academic.oup.com/restud/article-abstract/72/2/395/1558553
@@ -1,11 +0,0 @@
1
- description: Base income elasticity of labor supply for working-age individuals (under 65). This value is multiplied by the age multiplier for individuals 65 and over. Typically negative, indicating that higher income reduces labor supply.
2
- values:
3
- 2020-01-01: 0
4
- metadata:
5
- unit: /1
6
- label: base income elasticity below threshold
7
- reference:
8
- - title: "CBO Working Paper 2012-12: A Review of Recent Research on Labor Supply Elasticities"
9
- href: https://www.cbo.gov/publication/43675
10
- - title: "CBO Working Paper 2012-13: Review of Estimates of the Frisch Elasticity of Labor Supply"
11
- href: https://www.cbo.gov/publication/43676
@@ -1,11 +0,0 @@
1
- description: Multiplier applied to all substitution elasticities for individuals at or above the age threshold. Research shows older workers have higher labor supply elasticities than working-age adults. French (2005) finds elasticities 3x higher for age 60 vs age 40. A multiplier of 2.0 is conservative. Set to 1.0 for no age difference.
2
- values:
3
- 2020-01-01: 2.0
4
- metadata:
5
- unit: /1
6
- label: elasticity multiplier for ages at or above threshold
7
- reference:
8
- - title: "French (2005): The Effects of Health, Wealth, and Wages on Labour Supply and Retirement Behaviour"
9
- href: https://academic.oup.com/restud/article-abstract/72/2/395/1558553
10
- - title: "CBO Working Paper 2012-12: A Review of Recent Research on Labor Supply Elasticities"
11
- href: https://www.cbo.gov/publication/43675
@@ -1,9 +0,0 @@
1
- description: Age at which the age multiplier begins to apply. Individuals at this age or older will have their base elasticity multiplied by the age multiplier. Default is 65 (typical retirement age), but can be adjusted to reflect different retirement patterns or policy scenarios (e.g., 62 for early retirement, 67 for full retirement age).
2
- values:
3
- 2020-01-01: 65
4
- metadata:
5
- unit: year
6
- label: age threshold for elasticity multiplier
7
- reference:
8
- - title: "French (2005): The Effects of Health, Wealth, and Wages on Labour Supply and Retirement Behaviour"
9
- href: https://academic.oup.com/restud/article-abstract/72/2/395/1558553
@@ -1,6 +0,0 @@
1
- description: Percent change (of the change in the effective marginal wage) in labor supply given a 1% change in the effective marginal wage. This parameter overrides all other substitution elasticities if provided.
2
- values:
3
- 2020-01-01: 0
4
- metadata:
5
- unit: /1
6
- label: substitution elasticity of labor supply
@@ -1,71 +0,0 @@
1
- metadata:
2
- label: by position and decile
3
- unit: /1
4
- propagate_metadata_to_children: true
5
- reference:
6
- - title: "CBO Working Paper 2012-12: A Review of Recent Research on Labor Supply Elasticities"
7
- href: https://www.cbo.gov/publication/43675
8
- - title: "CBO Working Paper 2012-13: Review of Estimates of the Frisch Elasticity of Labor Supply"
9
- href: https://www.cbo.gov/publication/43676
10
- - title: "French (2005): The Effects of Health, Wealth, and Wages on Labour Supply and Retirement Behaviour"
11
- href: https://academic.oup.com/restud/article-abstract/72/2/395/1558553
12
- primary:
13
- metadata:
14
- label: primary adult
15
- description: The highest earner within the tax unit. Elasticity varies by earnings decile.
16
- 1:
17
- metadata:
18
- label: primary adult, 1st decile substitution elasticity
19
- values:
20
- 2020-01-01: 0
21
- 2:
22
- metadata:
23
- label: primary adult, 2nd decile substitution elasticity
24
- values:
25
- 2020-01-01: 0
26
- 3:
27
- metadata:
28
- label: primary adult, 3rd decile substitution elasticity
29
- values:
30
- 2020-01-01: 0
31
- 4:
32
- metadata:
33
- label: primary adult, 4th decile substitution elasticity
34
- values:
35
- 2020-01-01: 0
36
- 5:
37
- metadata:
38
- label: primary adult, 5th decile substiticity
39
- values:
40
- 2020-01-01: 0
41
- 6:
42
- metadata:
43
- label: primary adult, 6th decile substitution elasticity
44
- values:
45
- 2020-01-01: 0
46
- 7:
47
- metadata:
48
- label: primary adult, 7th decile substitution elasticity
49
- values:
50
- 2020-01-01: 0
51
- 8:
52
- metadata:
53
- label: primary adult, 8th decile substitution elasticity
54
- values:
55
- 2020-01-01: 0
56
- 9:
57
- metadata:
58
- label: primary adult, 9th decile substitution elasticity
59
- values:
60
- 2020-01-01: 0
61
- 10:
62
- metadata:
63
- label: primary adult, 10th decile substitution elasticity
64
- values:
65
- 2020-01-01: 0
66
- secondary:
67
- metadata:
68
- label: secondary adult, all deciles substitution elasticity
69
- description: Any earner in the tax unit who is not the primary (highest) earner.
70
- values:
71
- 2020-01-01: 0
@@ -1,45 +0,0 @@
1
- - name: Couple with different ages (under 65 and 65+) with multiplier approach
2
- period: 2023
3
- input:
4
- people:
5
- person1:
6
- age: 67
7
- employment_income_before_lsr: 60_000
8
- self_employment_income_before_lsr: 0
9
- person2:
10
- age: 55
11
- employment_income_before_lsr: 40_000
12
- self_employment_income_before_lsr: 0
13
- tax_units:
14
- tax_unit:
15
- members: [person1, person2]
16
- gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
17
- gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.5: 0.20
18
- gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.secondary: 0.30
19
- gov.simulation.labor_supply_responses.elasticities.substitution.age_multiplier_over_threshold: 2.0
20
- gov.simulation.labor_supply_responses.elasticities.income.all: 0
21
- gov.simulation.labor_supply_responses.elasticities.income.base: -0.04
22
- gov.simulation.labor_supply_responses.elasticities.income.age_multiplier_over_threshold: 2.0
23
- output:
24
- substitution_elasticity:
25
- - 0.40 # person1: 67 years old, primary earner (60k), decile 5 (50k-61k), base 0.20 × multiplier 2.0 = 0.40
26
- - 0 # person2: 55 years old, secondary earner, gets 0 since not primary
27
- income_elasticity:
28
- - -0.08 # person1: 67 years old, base -0.04 × multiplier 2.0 = -0.08
29
- - -0.04 # person2: 55 years old, base -0.04 (no multiplier)
30
-
31
- - name: Person with negative net earnings has zero substitution elasticity
32
- period: 2023
33
- input:
34
- age: 66
35
- employment_income_before_lsr: 25_000
36
- self_employment_income_before_lsr: -30_000
37
- gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
38
- gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.1: 0.25
39
- gov.simulation.labor_supply_responses.elasticities.substitution.age_multiplier_over_threshold: 2.0
40
- gov.simulation.labor_supply_responses.elasticities.income.all: 0
41
- gov.simulation.labor_supply_responses.elasticities.income.base: -0.04
42
- gov.simulation.labor_supply_responses.elasticities.income.age_multiplier_over_threshold: 2.25
43
- output:
44
- substitution_elasticity: 0 # Negative net earnings (-5k) treated as 0, resulting in zero elasticity
45
- income_elasticity: -0.09 # Income elasticity still applies: -0.04 × 2.25 = -0.09