Skip to content

Commit 7aa7367

Browse files
committed
Add Travel Grant
1 parent e682d00 commit 7aa7367

18 files changed

Lines changed: 329 additions & 0 deletions

changelog.d/travel-grant.added.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add a first-pass Travel Grant model.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
description: Travel Grant reduction rate per pound of household income above the published threshold.
2+
values:
3+
2025-01-01: 0.1145475372279496
4+
2026-01-01: 0.1145475372279496
5+
metadata:
6+
unit: /1
7+
period: year
8+
label: Travel Grant income reduction rate
9+
reference:
10+
- title: "Travel grants for students studying abroad or on placements (England): What you'll get"
11+
href: https://www.gov.uk/travel-grants-students-england/what-youll-get
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
description: Household-income threshold above which Travel Grant is reduced.
2+
values:
3+
2025-01-01: 39_796
4+
2026-01-01: 39_796
5+
metadata:
6+
unit: currency-GBP
7+
period: year
8+
label: Travel Grant income reduction threshold
9+
reference:
10+
- title: "Travel grants for students studying abroad or on placements (England): What you'll get"
11+
href: https://www.gov.uk/travel-grants-students-england/what-youll-get
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
description: Initial travel-cost contribution the student must meet before Travel Grant reimbursement begins.
2+
values:
3+
2025-01-01: 303
4+
2026-01-01: 303
5+
metadata:
6+
unit: currency-GBP
7+
period: year
8+
label: Travel Grant initial contribution
9+
reference:
10+
- title: "Travel grants for students studying abroad or on placements (England): What you'll get"
11+
href: https://www.gov.uk/travel-grants-students-england/what-youll-get

policyengine_uk/programs.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ programs:
375375
- id: adult_dependants_grant
376376
name: Adult Dependants' Grant
377377
full_name: Student Finance England Adult Dependants' Grant
378+
378379
category: Benefits
379380
agency: DfE
380381
status: partial
@@ -384,6 +385,18 @@ programs:
384385
verified_start_year: 2025
385386
notes: First-pass England model using the published maximum amount and household-income tests, with automatic 25-plus couple detection and explicit inputs for under-25 spouse/civil-partner and non-partner adult dependant cases
386387

388+
- id: travel_grant
389+
name: Travel Grant
390+
full_name: Student Finance England Travel Grant
391+
category: Benefits
392+
agency: DfE
393+
status: partial
394+
coverage: England
395+
variable: travel_grant
396+
parameter_prefix: gov.dfe.travel_grant
397+
verified_start_year: 2025
398+
notes: First-pass England model using the published initial contribution and household-income reduction formula, with explicit placement and eligible-expense inputs because the survey does not observe reimbursable travel costs
399+
387400
- id: bursary_fund_16_to_19
388401
name: 16 to 19 Bursary Fund
389402
full_name: 16 to 19 Bursary Fund
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
- name: Travel Grant reimburses overseas placement expenses above the initial contribution
2+
period: 2025
3+
absolute_error_margin: 0.01
4+
input:
5+
people:
6+
student:
7+
age: 21
8+
travel_grant_abroad_placement: true
9+
travel_grant_eligible_expenses: 1_000
10+
travel_grant_household_income: 30_000
11+
benunits:
12+
benunit:
13+
members: ["student"]
14+
households:
15+
household:
16+
members: ["student"]
17+
country: ENGLAND
18+
output:
19+
travel_grant_eligible: [true]
20+
travel_grant: [697]
21+
22+
- name: Travel Grant applies the published household-income reduction above the threshold
23+
period: 2025
24+
absolute_error_margin: 0.01
25+
input:
26+
people:
27+
student:
28+
age: 22
29+
travel_grant_abroad_placement: true
30+
travel_grant_eligible_expenses: 1_000
31+
travel_grant_household_income: 39_804.73
32+
benunits:
33+
benunit:
34+
members: ["student"]
35+
households:
36+
household:
37+
members: ["student"]
38+
country: ENGLAND
39+
output:
40+
travel_grant: [696]
41+
42+
- name: Travel Grant is nil when expenses do not exceed the initial contribution
43+
period: 2025
44+
input:
45+
people:
46+
student:
47+
age: 20
48+
travel_grant_abroad_placement: true
49+
travel_grant_eligible_expenses: 303
50+
travel_grant_household_income: 0
51+
benunits:
52+
benunit:
53+
members: ["student"]
54+
households:
55+
household:
56+
members: ["student"]
57+
country: ENGLAND
58+
output:
59+
travel_grant_eligible: [true]
60+
travel_grant: [0]
61+
62+
- name: Travel Grant clinical placements require income-assessed support
63+
period: 2025
64+
input:
65+
people:
66+
student:
67+
age: 24
68+
travel_grant_clinical_placement: true
69+
travel_grant_eligible_expenses: 800
70+
travel_grant_income_assessed_support: false
71+
benunits:
72+
benunit:
73+
members: ["student"]
74+
households:
75+
household:
76+
members: ["student"]
77+
country: ENGLAND
78+
output:
79+
travel_grant_eligible: [false]
80+
travel_grant: [0]
81+
82+
- name: Travel Grant excludes UK clinical placements with means-tested NHS bursaries
83+
period: 2025
84+
input:
85+
people:
86+
student:
87+
age: 24
88+
travel_grant_clinical_placement: true
89+
travel_grant_eligible_expenses: 800
90+
travel_grant_income_assessed_support: true
91+
travel_grant_receives_means_tested_nhs_bursary: true
92+
benunits:
93+
benunit:
94+
members: ["student"]
95+
households:
96+
household:
97+
members: ["student"]
98+
country: ENGLAND
99+
output:
100+
travel_grant_eligible: [false]
101+
travel_grant: [0]
102+
103+
- name: Travel Grant excludes households outside England
104+
period: 2025
105+
input:
106+
people:
107+
student:
108+
age: 21
109+
travel_grant_abroad_placement: true
110+
travel_grant_eligible_expenses: 1_000
111+
benunits:
112+
benunit:
113+
members: ["student"]
114+
households:
115+
household:
116+
members: ["student"]
117+
country: WALES
118+
output:
119+
travel_grant_eligible: [false]
120+
travel_grant: [0]
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from policyengine_uk.model_api import *
2+
3+
4+
class travel_grant(Variable):
5+
value_type = float
6+
entity = Person
7+
label = "Travel Grant"
8+
documentation = (
9+
"Student Finance England Travel Grant. "
10+
"This first-pass model reimburses eligible travel expenses above the published initial contribution, "
11+
"reduced for household income above the published threshold. Placement status and eligible expenses "
12+
"must be provided explicitly because they are not recoverable from the survey."
13+
)
14+
definition_period = YEAR
15+
quantity_type = FLOW
16+
unit = GBP
17+
defined_for = "travel_grant_eligible"
18+
19+
def formula(person, period, parameters):
20+
p = parameters(period).gov.dfe.travel_grant
21+
expenses = person("travel_grant_eligible_expenses", period)
22+
household_income = person("travel_grant_household_income", period)
23+
income_reduction = (
24+
max_(
25+
0,
26+
household_income - p.income_reduction.threshold,
27+
)
28+
* p.income_reduction.rate
29+
)
30+
return max_(0, expenses - p.initial_contribution - income_reduction)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from policyengine_uk.model_api import *
2+
3+
4+
class travel_grant_abroad_placement(Variable):
5+
value_type = bool
6+
entity = Person
7+
label = "Has an eligible study or work placement abroad for Travel Grant"
8+
documentation = (
9+
"Whether the student is on an eligible overseas study or work placement for Travel Grant purposes. "
10+
"This must be set explicitly in simulations."
11+
)
12+
definition_period = YEAR
13+
default_value = False
14+
set_input = set_input_dispatch_by_period
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from policyengine_uk.model_api import *
2+
3+
4+
class travel_grant_clinical_placement(Variable):
5+
value_type = bool
6+
entity = Person
7+
label = "Has an eligible UK clinical placement for Travel Grant"
8+
documentation = (
9+
"Whether the student is on an essential medical or dental clinical placement in the UK for Travel Grant purposes. "
10+
"This must be set explicitly in simulations."
11+
)
12+
definition_period = YEAR
13+
default_value = False
14+
set_input = set_input_dispatch_by_period
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from policyengine_uk.model_api import *
2+
3+
4+
class travel_grant_eligible(Variable):
5+
value_type = bool
6+
entity = Person
7+
label = "Eligible for Travel Grant"
8+
documentation = (
9+
"Whether the person is eligible for Student Finance England Travel Grant. "
10+
"This first-pass model uses explicit placement inputs, the published England coverage rule, "
11+
"the clinical-placement NHS-bursary exclusion, and a maintenance-loan proxy for income-assessed support."
12+
)
13+
definition_period = YEAR
14+
defined_for = "would_claim_travel_grant"
15+
16+
def formula(person, period, parameters):
17+
country = person.household("country", period)
18+
in_england = country == country.possible_values.ENGLAND
19+
20+
abroad_placement = person("travel_grant_abroad_placement", period)
21+
clinical_placement = person("travel_grant_clinical_placement", period)
22+
receives_nhs_bursary = person(
23+
"travel_grant_receives_means_tested_nhs_bursary", period
24+
)
25+
income_assessed_support = person("travel_grant_income_assessed_support", period)
26+
expenses = person("travel_grant_eligible_expenses", period)
27+
28+
clinical_path = (
29+
clinical_placement & income_assessed_support & ~receives_nhs_bursary
30+
)
31+
32+
return in_england & (abroad_placement | clinical_path) & (expenses > 0)

0 commit comments

Comments
 (0)