Questions about Finite Horizon models

Few questions:

  1. I use to think of the action space of a model for toolkit implementation as “choices” plus “state variables”, so for example (d,a',a,z) in a standard infinite horizon Bewley model. But in a finite horizon model, age (usually denoted as j) is also a state variable. Must it be included in the action space?
  2. When retired, usually there are no shocks z nor labor supply decision d. Can we set age specific grids for d and z where they have both one point (whose value is 0 for labor supply and irrelevant for z)? Speed is important especially when calibrating models and this is an obvious waste of grid points which is pretty standard.

Working age
For ages j=1,\ldots,J_R-1, the individual solves

$
V_j(a,z) = \max_{d,a’} \left{ F_j(d,a’,a,z) + \beta \sum_{z’ \in \mathcal{Z}} \pi_j(z’ \mid z) V_{j+1}(a’,z’) \right},
$
subject to
$ a’ \in \mathcal{A}, \qquad d \in \mathcal{D}_j.
$
where
$
F_j(d,a’,a,z) = u((1+r)a+\kappa_jwzd-a’,d)
$
The productivity process follows a finite-state Markov chain with transition probabilities \pi_j(z' \mid z) = \Pr(z_{j+1}=z' \mid z_j=z).

Retirement
For ages j=J_R,\ldots,J, individuals are retired and do not supply labor. Thus labor supply is fixed at d = 0.

The recursive problem is
$
V_j(a) = \max_{a’} \left{ F_j(d,a’,a) + \beta V_{j+1}(a’) \right},
$
where
$
F_j(d,a’,a) = u((1+r)a+pen-a’,0)
$
Note that the retirement problem is simpler for two reasons: There is no d choice and there is no z state variable.

j is in the state space, but you don’t include it in ReturnFn nor in FnsToEvaluate. I did this because there are ‘age-dependent parameters’ so if you ever want j you just create Params.agej=1:1:N_j and use that. Seemed pointless to have to add j everywhere since half the time you don’t want it and the half the time you do you have easy access to it anyway. This also allows me to reuse the same commands internally for lots of InfHorz and FHorz stuff, as otherwise I would need a version that also inputs j, so is nice from a maintenance perspective too.

When retired, usually there are no shocks z nor labor supply decision d. Can we set age specific grids for d and z where they have both one point (whose value is 0 for labor supply and irrelevant for z)? Speed is important especially when calibrating models and this is an obvious waste of grid points which is pretty standard.

  1. Not possible, but now with AI coding this has moved from something way down my todo list to something I might do (I would just make it so you don’t drop them in retirement, but instead simply switch them to being single points, is much easier to code and gives essentially all the runtime gains). Note that this requires making n_z_J depend on age, which is the part that is not yet possible. As you say this is faster, although the runtime gains are likely modest at only around 30-40% reductions in runtime (as that is the fraction of periods that are going be retirement). While modest they are also very simple for users to access (once they are implemented), so makes sense to have them.

PS. I am currently reworking various bits of internal code to make things internally cleaner and more consistent and also to shave runtimes, so maybe once I am done with that I will do the age-dependent n_z_J. The main problem with things like age-dependent n_z_J is that they are a bit messy with how to set up the grids like z_grid_J, as this is now a different size for each age. Also, does the user need to input all ages, or can they just input z_grid_1 and z_grid_46 and toolkit will understand to fill in all the rest? I feel like I should do this approach of ‘fill in all the rest’ as while a little extra coding it is really nice for users. [My idea for how to handle them is I would build z_grid_J based on max(n_z_J), and then just fill in NaN for all the unused part, and then when passing to functions I just only get the used part for that age.]

2 Likes

A very timely discussion as we debate changes to superannuation age. In several cases models are truncated at the top end of the age range because we see what happens at virtual age 80 and then just wave our hands about how that all plays out. By making it computationally cheaper to add years well past retirement, we can afford to be more precise when it comes to policy decisions. :grinning_face:

1 Like