Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

🚧 🚧 🚧 Not the final version 🚧 🚧 🚧

The EGM of Class 17 solves the consumption-savings model without a single root-finding operation, but only when the problem is concave. Today we add a discrete choice, retirement, on top of consumption, and code the DC-EGM of Iskhakov et al. (2017): an EGM step per discrete choice, an upper envelope to throw away the points the Euler equation gets wrong, and taste shocks to make the whole thing smooth.

Discrete and continuous choice togetherΒΆ

In economics the two kinds of choice co-exist:

Traditional methods treat them separately: a discrete choice is a maximum over a finite set, a continuous choice is a first order condition plus concavity, and a dynamic problem is dynamic programming with VFI, policy or time iterations. Put together, the pieces break:

So a traditional solver needs a global optimizer in every point of the state space, has to locate and track every kink, and needs special numerical procedures for non-smooth objects. DC-EGM keeps the two things EGM is good at, no root finding and an exact treatment of the credit constraint, and adds the machinery for the kinks.

The class of problems is that of EGM, extended:

DC-EGM comes in two flavors. Without taste shocks it iterates on the value and policy functions and produces exact thresholds for the discrete decisions. With taste shocks it iterates on choice-specific value functions and produces choice probabilities, as in the Rust model.

  • Which of the four solvers of Classes 16–17 survives a discrete choice on top of consumption, and at what cost?

  • Why is the maximum of two concave functions not concave?

The retirement modelΒΆ

A worker in state W\mathbb{W} chooses consumption cc and whether to keep working or retire, d∈{W,R}d \in \{\mathbb{W}, \mathbb{R}\}. A retiree in state R\mathbb{R} only chooses consumption, because retirement is absorbing:

Vt(Mt,W)=max⁑{max⁑0β©½cβ©½Mtu(c,R)+β EVt+1(R~(Mtβˆ’c),R)max⁑0β©½cβ©½Mtu(c,W)+β EVt+1(R~(Mtβˆ’c)+y,W)}V_t(M_t, \mathbb{W}) = \max\left\{ \begin{array}{l} \max_{0 \leqslant c \leqslant M_t} u(c, \mathbb{R}) + \beta\, \mathbb{E} V_{t+1}\big(\tilde R (M_t - c), \mathbb{R}\big) \\[4pt] \max_{0 \leqslant c \leqslant M_t} u(c, \mathbb{W}) + \beta\, \mathbb{E} V_{t+1}\big(\tilde R (M_t - c) + y, \mathbb{W}\big) \end{array} \right\}
Vt(Mt,R)=max⁑0β©½cβ©½Mt[u(c,R)+β EVt+1(R~(Mtβˆ’c),R)]V_t(M_t, \mathbb{R}) = \max_{0 \leqslant c \leqslant M_t} \Big[ u(c, \mathbb{R}) + \beta\, \mathbb{E} V_{t+1}\big(\tilde R (M_t - c), \mathbb{R}\big) \Big]

Utility is additively separable in consumption and the discrete choice, with a disutility of work Ξ΄\delta:

u(c,d)=cΟβˆ’1Οβˆ’Ξ΄β€‰1(d=W)β€…β€Šβ€…β€ŠβŸΆΟβ†’0β€…β€Šβ€…β€Šlog⁑(c)βˆ’Ξ΄β€‰1(d=W)u(c, d) = \frac{c^{\rho} - 1}{\rho} - \delta\, \mathbf{1}(d = \mathbb{W}) \;\;\underset{\rho \to 0}{\longrightarrow}\;\; \log(c) - \delta\, \mathbf{1}(d = \mathbb{W})

The worker’s problem has exactly the EGM structure, choice by choice: fix dd, and the post-decision state A=Mβˆ’cA = M - c determines next period’s wealth. What is new is the maximum over dd in front.

The analytic consumption rule of a worker, from the DSE 2024 lectures:

Analytic consumption of a worker at T-2, T-5, T-10 and T-19 against
cash-in-hand M (the vertical axis is consumption), with u(c) = \log c, R = 1,
\beta = 0.98, y = 20 and T = 20. Consumption equals M up to y / \beta, then follows the linear
segments of the formula, and drops at every retirement threshold.

Analytic consumption of a worker at Tβˆ’2T-2, Tβˆ’5T-5, Tβˆ’10T-10 and Tβˆ’19T-19 against cash-in-hand MM (the vertical axis is consumption), with u(c)=log⁑cu(c) = \log c, R=1R = 1, Ξ²=0.98\beta = 0.98, y=20y = 20 and T=20T = 20. Consumption equals MM up to y/Ξ²y / \beta, then follows the linear segments of the formula, and drops at every retirement threshold.

  • In the analytic solution, why does consumption drop at the thresholds where the consumer decides to retire one period earlier?

  • What happens to the thresholds as Ξ²R\beta R moves away from one?

The model object follows the architecture of Class 16: parameters, grids, quadrature and the primitives in one place, every solver a function of it. Two details are specific to the discrete choice:

The defaults used in all the figures below, unless stated otherwise:

discount factor, gross returnΞ²=0.95\beta = 0.95, R=1.05R = 1.05
wage, disutility of worky=1y = 1, Ξ΄=0.5\delta = 0.5
utilitylog⁑c\log c, the limit ρ→0\rho \to 0
horizonT=10T = 10 periods, t=0,…,9t = 0, \dots, 9
savings grid500 equally spaced points on [0,20][0, 20]
income shocksnone, Οƒy=0\sigma_y = 0; log-normal with 5 Gauss–Hermite nodes otherwise
taste shocksnone, Οƒ=0\sigma = 0
consumption floorcβ€Ύ=10βˆ’3\underline{c} = 10^{-3}

Periods are indexed from zero, as Python does, so the last period is Tβˆ’1T - 1 and the period before it Tβˆ’2T - 2.

Choice-specific value functionsΒΆ

The plan of Iskhakov et al. (2017) in its first version:

  1. an EGM step for each discrete choice dd and every discrete state stst

  2. this gives the dd-specific consumption rules and value functions

  3. compare the dd-specific value functions to find the optimal switching points, that is compute their upper envelope

  4. reconstruct the overall consumption rule and value function from the switching points

Nothing here needs a root finder, and the credit constraint keeps its EGM treatment. The price is that we must now compute value functions, which time iterations and EGM never needed, and compute an upper envelope.

So each EGM step must return, for its discrete choice dd, the endogenous points (Mj,cj)(M_j, c_j) and the value at those points,

vt(Mj,d)=u(cj,d)+β EVt+1(RAj+y 1(d=W)),v_t(M_j, d) = u(c_j, d) + \beta\, \mathbb{E} V_{t+1}\big(R A_j + y\,\mathbf{1}(d = \mathbb{W})\big),

where Vt+1V_{t+1} is the value of the state the choice dd leads to.

The credit constrained regionΒΆ

Credit constraints are handled so well by EGM because it never has to evaluate the utility of nearly zero consumption. Instead it β€œconnects the dots” (0,0)(0, 0) and (Mtcc,Mtcc)(M^{cc}_t, M^{cc}_t), where MtccM^{cc}_t is the wealth level that corresponds to zero savings, At=0A_t = 0: for every M<MtccM < M^{cc}_{t} the optimal consumption is ct⋆=Mc^\star_t = M.

Once value functions are needed, the constrained region needs its own formula:

The solution of one period and one choice is therefore a set of endogenous points plus one number, EV0EV^0. The two functions below evaluate the policy and the value anywhere: connecting the dots below the first endogenous point, interpolating above it.

The discrete choiceΒΆ

Next period’s worker chooses again, so the EGM step for d=Wd = \mathbb{W} needs the maximum of next period’s two choice-specific values, and the policy of whichever choice wins. The two functions below return that maximum and the indicator of working.

They are written with a scale Οƒ\sigma of taste shocks already, the subject of the second half of the class: for Οƒ=0\sigma = 0 they are the plain maximum and the plain indicator.

The EGM step for one discrete choiceΒΆ

The step is the EGM step of Class 17 with two additions: the next period consumption and value depend on which choice is optimal there, and the value at the endogenous points is computed alongside the policy.

Two EGM steps from the terminal period give the last two periods. In the last period a worker never works: there is no future income to earn, so retiring is better by exactly Ξ΄\delta at every wealth level. One period earlier the two choice-specific value functions intersect.

Source
<Figure size 1200x450 with 2 Axes>

So, what is going on?

  1. the dd-specific value functions intersect, due to the trade-off between the income from work and its disutility: a poor worker works, a rich one retires

  2. the upper envelope of the value functions has a kink at the intersection, and the combined consumption function has a discontinuity there: the retiree has no income to look forward to and consumes less out of the same wealth

The kink is the primary kink, the one that comes from the discrete choice itself. The first version of the algorithm handles it: compute both choice-specific functions, find the intersection, and switch.

  • Why is the consumption of a worker who keeps working higher than that of a retiree at the same wealth, when the worker also pays the disutility Ξ΄\delta?

  • The worker’s value function is the maximum of two concave functions. Where is it not concave?

Why the Euler equation is not enoughΒΆ

One more period back the trouble starts. The worker’s EGM step now integrates over VTβˆ’2(β‹…,W)V_{T-2}(\cdot, \mathbb{W}), which has a kink, so:

  1. the derivative of the value function has a discontinuity at the kink, and so does next period’s consumption, which enters the Euler equation

  2. for some values of wealth the Euler equation has two solutions: one with savings that land below the kink next period, one above

  3. the EGM step, which inverts the Euler equation at every point of the savings grid, returns all of them: the endogenous grid points sorted by savings are no longer sorted by wealth, they bend back and form a zig-zag region

The Euler equation remains a necessary condition for the optimal consumption, as shown by Clausen & Strub (2020) for exactly this kind of non-smooth problem, so the optimum is among the EGM points. It is no longer sufficient: some of the points are not the optimum.

The figure shows the raw output of the worker’s EGM step two periods before the last, zoomed in on the zig-zag, with the points connected in the order of the savings grid. The right panel plots the Euler residual as a function of consumption at a few wealth levels in the region, with the overall consumption rule of next period on the right-hand side.

Source
<Figure size 1600x450 with 3 Axes>

What the figure shows:

The EGM step has no way of telling which crossing is the optimum: that needs the value at the two points.

  • Time iterations solve the Euler equation in every state with a root finder. Which of the two zeros would brentq return?

  • The kink of VTβˆ’2(β‹…,W)V_{T-2}(\cdot, \mathbb{W}) sits at one wealth level. Why does the zig-zag in period Tβˆ’3T-3 spread over an interval of wealth?

The secondary upper envelopeΒΆ

How to detect the zig-zag regions algorithmically? The theorem from Class 17 still holds:

Note that the savings function may still have upward jumps. The theorem turns the detection into a sorting problem:

  1. sort the exogenous grid over AA in ascending order

  2. then the sequence of endogenous grid points over MM has to be in ascending order as well, as long as the Euler equation is sufficient

  3. every time the endogenous grid bends back, it is separated into subsets of points

  4. calculate the upper envelope of the value function over the segments

  5. delete the suboptimal endogenous points

  6. find and add the kink point to the endogenous grid

The kink point is where two segments of the value function cross. Consumption is discontinuous there, so it enters the policy twice: with the consumption of the left segment and with the consumption of the right one. This is the secondary kink, which comes from the primary kink of the next period propagated through the Euler equation.

In code the runs are index arrays. Each run is interpolated only on the wealth points that fall inside its own interval, and the envelope is built by letting the runs overwrite it one at a time where they are higher. The cost is the number of points plus the number of points in the overlapping regions, which is linear in the grid size. A matrix of all runs on all points would cost (runs) Γ— (points), and interpolate every run on hundreds of points where it is not even defined.

The lines: the credit constrained curve as line 0, then one line per run, each on the slice of wealth points it covers.

The kink: two straight lines on one interval cross in closed form; only the constrained curve, which is concave, needs the root finder.

The envelope itself: keep the original points that sit on top, add the kinks, sort. Usually the line on top at xk+1x_{k+1} overtakes the one on top at xkx_k directly, but a third line can sit above both in the middle of the interval, so the code walks through the crossings one at a time.

The tolerance in the keep line matters: a point of a suboptimal segment can sit 10-5 below the envelope, and np.isclose with its default tolerance would keep it, a stray point that puts a spurious jump into the policy. Linear interpolation reproduces a point’s own value to machine precision, so the tolerance can be tight. The crossing is computed from the values of the two lines at the ends of one interval, so it costs nothing beyond the interpolation already done.

Source
500 endogenous points in, 494 out: 2 inserted at the kink
<Figure size 1200x450 with 2 Axes>

The middle segment and the tails of the other two are gone, the value function has a kink where the two surviving segments cross, and consumption jumps down at that point: the consumer who saves a little more lands above next period’s retirement threshold, and behaves differently from there on.

Where it breaks:

An alternative that does not rely on the monotonicity of savings is the fast upper-envelope scan of Dobrescu & Shanker (2022):

It generalizes to higher dimensions, at the price of a pre-set threshold that can mis-classify points. FUES is the default secondary envelope of the dcegm package of Maximilian Blesch and coauthors (see the references), with the fixed-grid envelope of Druedahl & JΓΈrgensen (2017) as the alternative; the implementation above is the original DC-EGM envelope of Iskhakov et al. (2017), made local.

  • Which runs can be on top in step 3 of the algorithm, and why is the credit constrained segment included at all?

  • Count the operations of envelope_lines as a function of the number of points nn and the number of runs. Which part is intrinsic to the problem, and which would a matrix of all runs on all points add?

  • The kink point is inserted twice in the policy, 10-13 apart. What would a single point do to the linear interpolation of consumption?

The full algorithm without taste shocksΒΆ

Steps 1 and 2 are the solver. Steps 3 and 4 are done on demand, by comparing the two interpolated value functions at any wealth level: the function worker below is the primary envelope. The retiree’s curve never bends back, because the retiree’s problem is concave, so only the worker’s step runs the envelope.

Source
DC-EGM solved 10 periods on 500 grid points in 0.013 seconds
<Figure size 1600x450 with 3 Axes>

Properties of the full solution, all of them attributes of the model itself and not of the method:

  1. value functions are non-concave and have kinks, one primary kink per period at the retirement threshold, which moves out as the horizon grows

  2. consumption functions have discontinuities: the drop at the retirement threshold and, to the left of it, the smaller drops at the secondary kinks

  3. the discontinuities and kinks propagate through time and accumulate: the policy in period 0 carries the image of every future threshold, a snowball of jumps

Any solution method has to deal with these complexities. A solver on a fixed grid sees them as noise.

Check against the analytic solutionΒΆ

With R=1R = 1 the analytic policy is a list of candidate lines. The check evaluates the numerical policy on a dense grid and reports the distance to the nearest candidate.

9 periods to go:  84.5% of the grid points within 1e-10 of the analytic policy, max deviation 2.1e-03 at M = 1.17
5 periods to go:  95.7% of the grid points within 1e-10 of the analytic policy, max deviation 2.1e-03 at M = 1.17
2 periods to go:  99.7% of the grid points within 1e-10 of the analytic policy, max deviation 2.1e-03 at M = 1.17
1 periods to go: 100.0% of the grid points within 1e-10 of the analytic policy, max deviation 1.8e-15 at M = 10.67

DC-EGM matches the analytic solution to machine precision on most of the grid, and on all of it one period before the end: the retirement thresholds and the jumps are placed exactly.

The deviations, at most 2β‹…10βˆ’32 \cdot 10^{-3} and starting at Mβ‰ˆ1.15M \approx 1.15, sit at the kinks of the second row of the analytic formula and at their images in earlier periods. A kink that comes from the credit constraint binding two periods ahead is not an endogenous grid point, so linear interpolation smears it like on any fixed grid, and the error spreads the longer the horizon.

  • The run time is a few milliseconds for ten periods. Which part of the algorithm is not vectorized, and when would it dominate?

  • Why does the accumulation of kinks make a finer grid more necessary in period 0 than in period Tβˆ’2T-2?

Random incomeΒΆ

Random shocks do help. With a log-normal wage the expectation in the Euler equation averages next period’s consumption rule over the income nodes, and the jump at the retirement threshold is spread over a range of savings. However:

Source
<Figure size 1200x450 with 2 Axes>

With Οƒy=0.5\sigma_y = 0.5 the secondary jumps have become smooth dips, and the primary drop at the retirement threshold is as sharp as before. With 5 quadrature nodes the dips carry small spurious kinks, one per node crossing the threshold: 30 nodes remove them.

  • Why can an income shock never smooth the primary kink of the same period?

  • The expectation of a discontinuous function by Gauss–Hermite quadrature is itself a discontinuous function of savings. Where exactly are its jumps?

Extreme value taste shocksΒΆ

Taste shocks smooth out the primary kinks too. Add to each discrete alternative an additive shock σϡd\sigma \epsilon_d, i.i.d. extreme value type 1, as in the logit of Class 6:

Re-formulate the worker’s problem in terms of choice-specific value functions:

Vt(Mt,W)=max⁑{vt(Mt,W,R)+σϡRvt(Mt,W,W)+σϡW}V_t(M_t, \mathbb{W}) = \max\left\{ \begin{array}{l} v_t(M_t, \mathbb{W}, \mathbb{R}) + \sigma \epsilon_{\mathbb{R}} \\ v_t(M_t, \mathbb{W}, \mathbb{W}) + \sigma \epsilon_{\mathbb{W}} \end{array} \right\}
vt(Mt,W,W)=max⁑0β©½cβ©½Mt[u(c)+β EVt+1(R~(Mtβˆ’c)+y,W)]vt(Mt,W,R)=max⁑0β©½cβ©½Mt[u(c)+β EVt+1(R~(Mtβˆ’c),R)]\begin{aligned} v_t(M_t, \mathbb{W}, \mathbb{W}) &= \max_{0 \leqslant c \leqslant M_t} \Big[ u(c) + \beta\, EV_{t+1}\big(\tilde R (M_t - c) + y, \mathbb{W}\big) \Big] \\ v_t(M_t, \mathbb{W}, \mathbb{R}) &= \max_{0 \leqslant c \leqslant M_t} \Big[ u(c) + \beta\, EV_{t+1}\big(\tilde R (M_t - c), \mathbb{R}\big) \Big] \end{aligned}

The expected value of a worker, before the shocks are drawn, is the logsum of Class 6:

EVt+1(x,W)=Οƒlog⁑[exp⁑vt+1(x,W,W)Οƒ+exp⁑vt+1(x,W,R)Οƒ]EV_{t+1}(x, \mathbb{W}) = \sigma \log\Big[ \exp\frac{v_{t+1}(x, \mathbb{W}, \mathbb{W})}{\sigma} + \exp\frac{v_{t+1}(x, \mathbb{W}, \mathbb{R})}{\sigma} \Big]

and the retiree’s problem is unchanged, Vt(Mt,R)=max⁑c[u(c)+Ξ²EVt+1(R~(Mtβˆ’c),R)]V_t(M_t, \mathbb{R}) = \max_{c} [u(c) + \beta EV_{t+1}(\tilde R(M_t - c), \mathbb{R})].

The smoothed Euler equationΒΆ

Without taste shocks the Euler equation is discontinuous in savings, because next period’s consumption is that of either a worker or a retiree:

uβ€²(ct)=β E[uβ€²(ct+1(W/R)) R~]u'(c_t) = \beta\, \mathbb{E}\Big[ u'\big(c_{t+1}(\mathbb{W}/\mathbb{R})\big)\, \tilde R \Big]

With extreme value taste shocks the Euler equation is smoothed: the marginal utility of next period is averaged over the two choices with the choice probabilities,

uβ€²(ct)=β E[Pt+1(W) uβ€²(ct+1(W)) R~+Pt+1(R) uβ€²(ct+1(R)) R~],u'(c_t) = \beta\, \mathbb{E}\Big[ P_{t+1}(\mathbb{W})\, u'\big(c_{t+1}(\mathbb{W})\big)\, \tilde R + P_{t+1}(\mathbb{R})\, u'\big(c_{t+1}(\mathbb{R})\big)\, \tilde R \Big],

where the probability to keep working is the logit

Pt+1(W)=exp⁑vt+1(Mt+1,W,W)Οƒexp⁑vt+1(Mt+1,W,W)Οƒ+exp⁑vt+1(Mt+1,W,R)ΟƒP_{t+1}(\mathbb{W}) = \frac{\exp\frac{v_{t+1}(M_{t+1}, \mathbb{W}, \mathbb{W})}{\sigma}} {\exp\frac{v_{t+1}(M_{t+1}, \mathbb{W}, \mathbb{W})}{\sigma} + \exp\frac{v_{t+1}(M_{t+1}, \mathbb{W}, \mathbb{R})}{\sigma}}

This is exactly what egm_step computes with choice_prob and logsum when Οƒ>0\sigma > 0: the code of the first half of the class was written for both flavors. The de-maxing of Class 6 is essential, because v/Οƒv/\sigma overflows exp for any small Οƒ\sigma.

With taste shocks DC-EGM becomes simpler:

  1. the problem is re-formulated in terms of choice-specific value functions

  2. the calculation of the primary upper envelope is replaced by the logsum

  3. expectations are easier to compute, because there are fewer discontinuities

  4. more memory is required, to store the choice-specific value functions

How far is the smoothed solution from the exact one? The paper gives a bound.

This implies that the extreme value perturbed policy functions cσ,t(s,ϡ)c_{\sigma, t}(s, \epsilon) and dσ,t(s,ϡ)d_{\sigma, t}(s, \epsilon) converge pointwise to ct(s)c_t(s) and dt(s)d_t(s), the optimal continuous and discrete decision rules of the problem without taste shocks, as σ→0\sigma \to 0.

This is the extreme value homotopy: solve with a comfortable Οƒ\sigma, and reduce it towards the sharp problem if needed.

Source
<Figure size 1600x450 with 3 Axes>

Where it breaks: Οƒ\sigma is a structural parameter if the shocks are interpreted as unobserved states, and a numerical one otherwise. A large Οƒ\sigma changes the economics of the model, a small one brings the kinks back, and the bound of the theorem is the only guide to how far a given Οƒ\sigma is from the sharp problem.

  • Taste shocks make the EGM step simpler and the solution better behaved, and the paper still presents the version without them in full. Why?

  • Which parts of the course notation does Οƒ\sigma collide with, and which object in the Rust model of Class 9 plays its role?

SimulationΒΆ

The simulator draws the taste shocks through the choice probability and the income shocks from the log-normal, and applies the choice-specific policies. Retirement is absorbing, so the discrete state is carried forward.

Source
<Figure size 1600x450 with 3 Axes>

The rich retire in the first period and run their wealth down, the poor work until the last period, where everyone retires: the retirement age distribution is bimodal, driven by initial wealth, with the taste shocks filling the middle. The consumption paths are smooth except for the drop at retirement, the one discontinuity that no shock removes.

  • Which moments of these simulated data would identify Ξ΄\delta, and which Οƒ\sigma?

  • Keane’s test of Class 16 needs Ξ²R=1\beta R = 1 and no shocks. What does a flat consumption path look like in this model?

Estimation with DC-EGMΒΆ

We can now solve many problems of this type fast, and a fast solver is the inner loop of every estimator:

  1. a fast solver for important problems with discrete and continuous choice allows calibration, structural estimation with your favorite method, and in particular NFXP: the inner loop solves the model, the outer loop optimizes the objective function

  2. the solver can be run repeatedly in some outer loop: for individual heterogeneity, solving the model for each individual in the sample; for unobserved heterogeneity, random effects; and for flexibility in the distributional assumptions

With taste shocks the discrete choices have logit probabilities, so maximum likelihood with discrete and continuous data is straightforward, as in the Monte Carlo experiments of Iskhakov et al. (2017). Without a likelihood, the simulator above is all that the method of simulated moments of the next class needs.

How does EGM as an inner loop compare with MPEC, which avoids the inner loop altogether? JΓΈrgensen (2013) runs the comparison on the infinite horizon Deaton model, maximum likelihood on synthetic data with one structural parameter:

Ξ²\betaRMSETime
0.70EGM0.0020.1 sec
MPEC0.049112.4 sec
0.95EGM0.0061.9 sec
MPEC0.00993.7 sec
0.99EGM0.0005.0 sec
MPEC0.00030.9 sec

Points to take home:

ReferencesΒΆ
  1. Iskhakov, F., JΓΈrgensen, T., Rust, J., & Schjerning, B. (2017). The endogenous grid method for discrete-continuous dynamic choice models with (or without) taste shocks. Quantitative Economics, 8(2), 317–365. https://doi.org/10.3982/QE643
  2. Clausen, A., & Strub, C. (2020). Reverse Calculus and nested optimization. Journal of Economic Theory, 187, 105019. 10.1016/j.jet.2020.105019
  3. Dobrescu, L. I., & Shanker, A. (2022). Fast Upper-Envelope Scan for Discrete-Continuous Dynamic Programming (Working Paper No. 4181302). SSRN. 10.2139/ssrn.4181302
  4. Druedahl, J., & JΓΈrgensen, T. H. (2017). A general endogenous grid method for multi-dimensional models with non-convexities and constraints. Journal of Economic Dynamics and Control, 74, 87–107. 10.1016/j.jedc.2016.11.005
  5. JΓΈrgensen, T. H. (2013). Structural estimation of continuous choice models: Evaluating the EGM and MPEC. Economics Letters, 119(3), 287–290. 10.1016/j.econlet.2013.02.027
  6. Fella, G. (2014). A generalized endogenous grid method for non-smooth and non-concave problems. Review of Economic Dynamics, 17(2), 329–344. 10.1016/j.red.2013.07.001
  7. Carroll, C. D. (2006). The method of endogenous gridpoints for solving dynamic stochastic optimization problems. Economics Letters, 91(3), 312–320. 10.1016/j.econlet.2005.09.013