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.
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/README.md +1 -206
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/{income/all.yaml → income.yaml} +1 -1
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution.yaml +70 -0
- policyengine_us/tests/policy/baseline/gov/ed/pell_grant/pell_grant_simplified_formula_applies.yaml +1 -1
- policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/income_elasticity.yaml +6 -12
- policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/labor_supply_behavioral_response.yaml +24 -2
- policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/substitution_elasticity.yaml +35 -10
- policyengine_us/tests/policy/baseline/gov/test_categorical_eligibility_vectorization.yaml +41 -0
- policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.py +1 -2
- policyengine_us/variables/gov/fcc/lifeline/is_lifeline_eligible.py +2 -2
- policyengine_us/variables/gov/simulation/labor_supply_response/income_elasticity.py +1 -27
- policyengine_us/variables/gov/simulation/labor_supply_response/substitution_elasticity.py +18 -43
- policyengine_us/variables/gov/states/ca/cpuc/care/eligibility/ca_care_categorically_eligible.py +2 -2
- {policyengine_us-1.432.6.dist-info → policyengine_us-1.432.8.dist-info}/METADATA +1 -1
- {policyengine_us-1.432.6.dist-info → policyengine_us-1.432.8.dist-info}/RECORD +18 -24
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/age_multiplier_over_threshold.yaml +0 -11
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/age_threshold.yaml +0 -9
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/base.yaml +0 -11
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/age_multiplier_over_threshold.yaml +0 -11
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/age_threshold.yaml +0 -9
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/all.yaml +0 -6
- policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/by_position_and_decile.yaml +0 -71
- policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/integration.yaml +0 -45
- {policyengine_us-1.432.6.dist-info → policyengine_us-1.432.8.dist-info}/WHEEL +0 -0
- {policyengine_us-1.432.6.dist-info → policyengine_us-1.432.8.dist-info}/entry_points.txt +0 -0
- {policyengine_us-1.432.6.dist-info → policyengine_us-1.432.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,206 +1 @@
|
|
|
1
|
-
#
|
|
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.
|
|
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:
|
policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution.yaml
ADDED
|
@@ -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
|
policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/income_elasticity.yaml
CHANGED
|
@@ -1,19 +1,13 @@
|
|
|
1
|
-
- name:
|
|
1
|
+
- name: Default income elasticity is zero
|
|
2
2
|
period: 2023
|
|
3
3
|
input:
|
|
4
|
-
|
|
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:
|
|
6
|
+
income_elasticity: 0
|
|
10
7
|
|
|
11
|
-
- name:
|
|
8
|
+
- name: Custom income elasticity value
|
|
12
9
|
period: 2023
|
|
13
10
|
input:
|
|
14
|
-
|
|
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.
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
8
|
+
substitution_elasticity: 0
|
|
12
9
|
|
|
13
|
-
- name:
|
|
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.
|
|
21
|
-
gov.simulation.labor_supply_responses.elasticities.substitution.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
55
|
+
elasticities[zero_earnings] = 0
|
|
67
56
|
|
|
68
|
-
# For non-zero earnings, assign
|
|
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
|
-
#
|
|
73
|
-
|
|
74
|
-
|
|
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 ==
|
|
69
|
+
& (earnings_decile == i + 1)
|
|
78
70
|
& is_primary_earner
|
|
79
71
|
)
|
|
80
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
policyengine_us/variables/gov/states/ca/cpuc/care/eligibility/ca_care_categorically_eligible.py
CHANGED
|
@@ -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
|
-
|
|
21
|
-
|
|
20
|
+
tribal_lifeline_programs > 0,
|
|
21
|
+
non_tribal_lifeline_programs > 0,
|
|
22
22
|
)
|
|
@@ -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=
|
|
924
|
-
policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income
|
|
925
|
-
policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/
|
|
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=
|
|
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=
|
|
3798
|
-
policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/
|
|
3799
|
-
policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
8866
|
-
policyengine_us-1.432.
|
|
8867
|
-
policyengine_us-1.432.
|
|
8868
|
-
policyengine_us-1.432.
|
|
8869
|
-
policyengine_us-1.432.
|
|
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
|
policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/base.yaml
DELETED
|
@@ -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
|
policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/all.yaml
DELETED
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|