diff --git a/_toc.yml b/_toc.yml index 9af42ab3..0cbdeb74 100644 --- a/_toc.yml +++ b/_toc.yml @@ -16,17 +16,8 @@ # Learn more at https://jupyterbook.org/customize/toc.html format: jb-book -root: README +root: content/paper/0_paper parts: - - caption: Content - chapters: - - file: content/paper/1_intro - - file: content/paper/2_method - - file: content/paper/3_multdim - - file: content/paper/4_multinterp - - file: content/paper/5_conditions - - file: content/paper/6_conclusion - - file: content/paper/7_appendix - caption: Code chapters: - file: code/examples/example_ConsPensionModel_baseline diff --git a/banner.png b/banner.png new file mode 100644 index 00000000..0b621a1c Binary files /dev/null and b/banner.png differ diff --git a/content/paper/0_paper.md b/content/paper/0_paper.md new file mode 100644 index 00000000..ebc2b273 --- /dev/null +++ b/content/paper/0_paper.md @@ -0,0 +1,20 @@ +:::{include} 1_intro.md +::: + +:::{include} 2_method.md +::: + +:::{include} 3_multdim.md +::: + +:::{include} 4_multinterp.md +::: + +:::{include} 5_conditions.md +::: + +:::{include} 6_conclusion.md +::: + +:::{include} 7_appendix.md +::: diff --git a/content/paper/1_intro.md b/content/paper/1_intro.md index 4e961c50..eab01cf6 100644 --- a/content/paper/1_intro.md +++ b/content/paper/1_intro.md @@ -1,32 +1,7 @@ ---- -# title: Introduction # a string (max 500 chars) page & project -# description: # a string (max 500 chars) page & project -short_title: Intro # a string (max 40 chars) page & project -# name: # a string (max 500 chars) page & project -# tags: # a list of strings page only -# thumbnail: # a link to a local or remote image page only -# subtitle: # a string (max 500 chars) page only -# date: # a valid date formatted string page can override project -# authors: # a list of author objects page can override project -# doi: # a valid DOI, either URL or id page can override project -# arxiv: # a valid arXiv reference, either URL or id page can override project -# open_access: # boolean (true/false) page can override project -# license: # a license object or a string page can override project -# github: # a valid GitHub URL or owner/reponame page can override project -# binder: # any valid URL page can override project -# subject: # a string (max 40 chars) page can override project -# venue: # a venue object page can override project -# biblio: # a biblio object with various fields page can override project -numbering: - enumerator: "1.%s" ---- - +++ {"part": "abstract"} Heterogeneous agent models with multiple decisions are often solved using inefficient grid search methods that require many evaluations and are slow. This paper provides a novel method for solving such models using an extension of the Endogenous Grid Method (EGM) that uses Gaussian Process Regression (GPR) to interpolate functions on unstructured grids. First, I propose an intuitive and strategic procedure for decomposing a problem into subproblems which allows the use of efficient solution methods. Second, using an exogenous grid of post-decision states and solving for an endogenous grid of pre-decision states that obey a first-order condition greatly speeds up the solution process. Third, since the resulting endogenous grid can often be non-rectangular at best and unstructured at worst, GPR provides an efficient and accurate method for interpolating the value, marginal value, and decision functions. Applied sequentially to each decision within the problem, the method is able to solve heterogeneous agent models with multiple decisions in a fraction of the time and with less computational resources than are required by standard methods currently used. Software to reproduce these methods is available under the [`Econ-ARK/HARK`](https://econ-ark.org/) project for the `python` programming language. -+++ - +++ {"part": "acknowledgements"} I would like to thank Chris Carroll, Matthew White, and Simon Scheidegger for their helpful comments and suggestions. The remaining errors are my own. All figures and other numerical results were produced using the [`Econ-ARK/HARK`](https://econ-ark.org/) toolkit {cite:p}`Carroll2018`. Additional libraries used in the production of this paper include but are not limited to: [`scipy`](https://www.scipy.org/) {cite:p}`Virtanen2020`, [`numpy`](https://www.numpy.org/) {cite:p}`Harris2020`, [`numba`](https://numba.pydata.org/) {cite:p}`Lam2015`, [`cupy`](https://cupy.dev/) {cite:p}`Okuta2017`, [`scikit-learn`](https://scikit-learn.org/) {cite:p}`Pedregosa2011`, [`pytorch`](https://pytorch.org/) {cite:p}`Paszke2019`, and [`gpytorch`](https://gpytorch.ai/) {cite:p}`Gardner2018` diff --git a/content/paper/2_method.md b/content/paper/2_method.md index d512d6e3..63294ec2 100644 --- a/content/paper/2_method.md +++ b/content/paper/2_method.md @@ -1,25 +1,3 @@ ---- -# title: The Sequential Endogenous Grid Method # a string (max 500 chars) page & project -# description: # a string (max 500 chars) page & project -short_title: Method # a string (max 40 chars) page & project -# name: # a string (max 500 chars) page & project -# tags: # a list of strings page only -# thumbnail: # a link to a local or remote image page only -# subtitle: # a string (max 500 chars) page only -# date: # a valid date formatted string page can override project -# authors: # a list of author objects page can override project -# doi: # a valid DOI, either URL or id page can override project -# arxiv: # a valid arXiv reference, either URL or id page can override project -# open_access: # boolean (true/false) page can override project -# license: # a license object or a string page can override project -# github: # a valid GitHub URL or owner/reponame page can override project -# binder: # any valid URL page can override project -# subject: # a string (max 40 chars) page can override project -# venue: # a venue object page can override project -# biblio: # a biblio object with various fields page can override project -numbering: - enumerator: "2.%s" ---- (method)= diff --git a/content/paper/3_multdim.md b/content/paper/3_multdim.md index 2b82011a..d3e098d0 100644 --- a/content/paper/3_multdim.md +++ b/content/paper/3_multdim.md @@ -1,27 +1,5 @@ ---- -# title: The Sequential Endogenous Grid Method # a string (max 500 chars) page & project -# description: # a string (max 500 chars) page & project -short_title: MultDim # a string (max 40 chars) page & project -# name: # a string (max 500 chars) page & project -# tags: # a list of strings page only -# thumbnail: # a link to a local or remote image page only -# subtitle: # a string (max 500 chars) page only -# date: # a valid date formatted string page can override project -# authors: # a list of author objects page can override project -# doi: # a valid DOI, either URL or id page can override project -# arxiv: # a valid arXiv reference, either URL or id page can override project -# open_access: # boolean (true/false) page can override project -# license: # a license object or a string page can override project -# github: # a valid GitHub URL or owner/reponame page can override project -# binder: # any valid URL page can override project -# subject: # a string (max 40 chars) page can override project -# venue: # a venue object page can override project -# biblio: # a biblio object with various fields page can override project -numbering: - enumerator: "3.%s" ---- - (multdim)= + # The EGM$^n$ in Higher Dimensions The problem in [Section %s](#method) demonstrates the simplicity of solving problems sequentially. However, as constructed, the problem has only one state variable and one post-decision state variable per stage. Can EGM$^n$ be used to solve higher dimensional problems? In short, yes, but it requires additional thought on interpolation. @@ -31,21 +9,21 @@ The problem in [Section %s](#method) demonstrates the simplicity of solving prob For a demonstration, we now turn to the problem of a worker saving up for retirement. This worker must consume, save, and deposit resources into a tax-advantaged account that can not be liquidated until retirement. In the recursive problem, the worker begins a new period with a liquid account of market resources $\mRat_{t}$ and an illiquid account of retirement savings $\nRat_{t}$. The worker maximizes their utility by choosing consumption $\cRat_{t}$ and pension deposit $\dRat_{t}$. The pension deposit is set aside on a retirement account that is exposed to a risky return, while their post-consumption liquid assets accrue risk-free interest every period. The worker additionally receives an income that faces a permanent ($\PGro_{t+1}$) and a transitory ($\tShkEmp_{t+1}$) shock every period. At the age of 65, the worker is retired and their assets are liquidated, at which point the state reduces to one liquid account of market resources. The worker's recursive problem is: \begin{equation} - \begin{split} - \vFunc_{t}(\mRat_{t}, \nRat_{t}) & = \max_{\cRat_{t}, \dRat_{t}} \util(\cRat_{t}) + \DiscFac \Ex_{t} - \left[ \PGro_{t+1}^{1-\CRRA} \vFunc_{t+1}(\mRat_{t+1}, \nRat_{t+1}) \right] \\ - & \text{s.t.} \quad \cRat_{t} \ge 0, \quad \dRat_{t} \ge 0 \\ - \aRat_{t} & = \mRat_{t} - \cRat_{t} - \dRat_{t} \\ - \bRat_{t} & = \nRat_{t} + \dRat_{t} + g(\dRat_{t}) \\ - \mRat_{t+1} & = \aRat_{t} \Rfree / \PGro_{t+1} + \tShkEmp_{t+1} \\ - \nRat_{t+1} & = \bRat_{t} \Risky_{t+1} / / \PGro_{t+1} - \end{split} +\begin{split} +\vFunc*{t}(\mRat*{t}, \nRat*{t}) & = \max*{\cRat*{t}, \dRat*{t}} \util(\cRat*{t}) + \DiscFac \Ex*{t} +\left[ \PGro_{t+1}^{1-\CRRA} \vFunc_{t+1}(\mRat_{t+1}, \nRat_{t+1}) \right] \\ +& \text{s.t.} \quad \cRat*{t} \ge 0, \quad \dRat*{t} \ge 0 \\ +\aRat*{t} & = \mRat*{t} - \cRat*{t} - \dRat*{t} \\ +\bRat*{t} & = \nRat*{t} + \dRat*{t} + g(\dRat*{t}) \\ +\mRat*{t+1} & = \aRat*{t} \Rfree / \PGro*{t+1} + \tShkEmp*{t+1} \\ +\nRat*{t+1} & = \bRat*{t} \Risky*{t+1} / / \PGro*{t+1} +\end{split} \end{equation} where \begin{equation} - \gFunc(\dRat) = \xFer \log(1+\dRat). +\gFunc(\dRat) = \xFer \log(1+\dRat). \end{equation} This problem can subsequently be broken down into 3 stages: a pension deposit stage, a consumption stage, and an income shock stage. @@ -55,34 +33,34 @@ This problem can subsequently be broken down into 3 stages: a pension deposit st In the deposit stage, the worker begins with market resources and a retirement savings account. The worker must maximize their value of liquid wealth $\lRat_{t}$ and retirement balance $\bRat_{t}$ by choosing a pension deposit $\dRat_{t}$, which must be positive. The retirement balance $\bRat$ is the cash value of their retirement account plus their pension deposit and an additional amount $g(\dRat_{t})$ that provides an incentive to save for retirement. As we'll see, this additional term will allow us to use the Endogenous Grid Method to solve this subproblem. \begin{equation} - \begin{split} - \vFunc_{t}(\mRat_{t}, \nRat_{t}) & = \max_{\dRat_{t}} \vOpt_{t}(\lRat_{t}, \bRat_{t}) \\ - & \text{s.t.} \quad \dRat_{t} \ge 0 \\ - \lRat_{t} & = \mRat_{t} - \dRat_{t} \\ - \bRat_{t} & = \nRat_{t} + \dRat_{t} + g(\dRat_{t}) - \end{split} +\begin{split} +\vFunc*{t}(\mRat*{t}, \nRat*{t}) & = \max*{\dRat*{t}} \vOpt*{t}(\lRat*{t}, \bRat*{t}) \\ +& \text{s.t.} \quad \dRat*{t} \ge 0 \\ +\lRat*{t} & = \mRat*{t} - \dRat*{t} \\ +\bRat*{t} & = \nRat*{t} + \dRat*{t} + g(\dRat*{t}) +\end{split} \end{equation} After making their pension decision, the worker begins their consumption stage with liquid wealth $\lRat_{t}$ and retirement balance $\bRat_{t}$. From their liquid wealth, the worker must choose a level of consumption to maximize utility and continuation value $\wFunc_{t}$. After consumption, the worker is left with post-decision states that represent liquid assets $\aRat_{t}$ and retirement balance $\bRat_{t}$, which passes through this problem unaffected because it can't be liquidated until retirement. \begin{equation} - \begin{split} - \vOpt_{t}(\lRat_{t}, \bRat_{t}) & = \max_{\cRat_{t}} \util(\cRat_{t}) + \DiscFac \wFunc_{t}(\aRat_{t}, \bRat_{t}) \\ - & \text{s.t.} \quad \cRat_{t} \ge 0 \\ - \aRat_{t} & = \lRat_{t} - \cRat_{t} - \end{split} +\begin{split} +\vOpt*{t}(\lRat*{t}, \bRat*{t}) & = \max*{\cRat*{t}} \util(\cRat*{t}) + \DiscFac \wFunc*{t}(\aRat*{t}, \bRat*{t}) \\ +& \text{s.t.} \quad \cRat*{t} \ge 0 \\ +\aRat*{t} & = \lRat*{t} - \cRat\_{t} +\end{split} \end{equation} Finally, the post-decision value function $\wFunc_{t}$ represents the value of both liquid and illiquid account balances before the realization of uncertainty regarding the risky return and income shocks. Since we are dealing with a normalized problem, this stage handles the normalization of state variables and value functions into the next period. \begin{equation} - \begin{split} - \wFunc_{t}(\aRat_{t}, \bRat_{t}) & = \Ex_{t} - \left[ \PGro_{t+1}^{1-\CRRA} \vFunc_{t+1}(\mRat_{t+1}, \mRat_{t+1}) \right] \\ - & \text{s.t.} \quad \aRat_{t} \ge 0, \quad \bRat_{t} \ge 0 \\ - \mRat_{t+1} & = \aRat_{t} \Rfree / \PGro_{t+1} + \tShkEmp_{t+1} \\ - \nRat_{t+1} & = \bRat_{t} \Risky_{t+1} / \PGro_{t+1} - \end{split} +\begin{split} +\wFunc*{t}(\aRat*{t}, \bRat*{t}) & = \Ex*{t} +\left[ \PGro_{t+1}^{1-\CRRA} \vFunc_{t+1}(\mRat_{t+1}, \mRat_{t+1}) \right] \\ +& \text{s.t.} \quad \aRat*{t} \ge 0, \quad \bRat*{t} \ge 0 \\ +\mRat*{t+1} & = \aRat*{t} \Rfree / \PGro*{t+1} + \tShkEmp*{t+1} \\ +\nRat*{t+1} & = \bRat*{t} \Risky*{t+1} / \PGro*{t+1} +\end{split} \end{equation} The advantage of conceptualizing this subproblem as a separate stage is that we can construct a function $\wFunc_{t}$ and use it in the prior optimization problems without having to worry about stochastic optimization and taking expectations repeatedly. @@ -98,53 +76,53 @@ In the deposit stage, both the state variables and post-decision variables are d First, we can rewrite the pension deposit problem more compactly: \begin{equation} - \vFunc_{t}(\mRat_{t}, \nRat_{t}) = \max_{\dRat_{t}} - \vOpt_{t}(\mRat_{t} - \dRat_{t}, \nRat_{t} + \dRat_{t} + \gFunc(\dRat_{t})) +\vFunc*{t}(\mRat*{t}, \nRat*{t}) = \max*{\dRat*{t}} +\vOpt*{t}(\mRat*{t} - \dRat*{t}, \nRat*{t} + \dRat*{t} + \gFunc(\dRat\_{t})) \end{equation} The first-order condition is \begin{equation} - \vOpt_{t}^{\lRat}(\lRat_{t}, \bRat_{t})(-1) + - \vOpt_{t}^{\bRat}(\lRat_{t}, \bRat_{t})(1+\gFunc'(\dRat_{t})) = 0. +\vOpt*{t}^{\lRat}(\lRat*{t}, \bRat*{t})(-1) + +\vOpt*{t}^{\bRat}(\lRat*{t}, \bRat*{t})(1+\gFunc'(\dRat\_{t})) = 0. \end{equation} Rearranging this equation gives \begin{equation} - \gFunc'(\dRat_{t}) = \frac{\vOpt_{t}^{\lRat}(\lRat_{t}, - \bRat_{t})}{\vOpt_{t}^{\bRat}(\lRat_{t}, \bRat_{t})} - 1 +\gFunc'(\dRat*{t}) = \frac{\vOpt*{t}^{\lRat}(\lRat*{t}, +\bRat*{t})}{\vOpt*{t}^{\bRat}(\lRat*{t}, \bRat\_{t})} - 1 \end{equation} where \begin{equation} - \gFunc'(\dRat) = - \frac{\xFer}{1+\dRat} \qquad \gFunc'^{-1}(y) = \xFer/y - 1 +\gFunc'(\dRat) = +\frac{\xFer}{1+\dRat} \qquad \gFunc'^{-1}(y) = \xFer/y - 1 \end{equation} Given that $\gFunc'(\dRat)$ exists and is invertible, we can find \begin{equation} - \dEndFunc_{t}(\lRat_{t}, \bRat_{t}) = \gFunc'^{-1}\left( - \frac{\vOpt_{t}^{\lRat}(\lRat_{t}, - \bRat_{t})}{\vOpt_{t}^{\bRat}(\lRat_{t}, - \bRat_{t})} - 1 \right) +\dEndFunc*{t}(\lRat*{t}, \bRat*{t}) = \gFunc'^{-1}\left( +\frac{\vOpt*{t}^{\lRat}(\lRat*{t}, +\bRat*{t})}{\vOpt*{t}^{\bRat}(\lRat*{t}, +\bRat\_{t})} - 1 \right) \end{equation} Using this, we can back out $\nRat_{t}$ as \begin{equation} - \nEndFunc_{t}(\lRat_{t}, \bRat_{t}) = \bRat_{t} - - \dEndFunc_{t}(\lRat_{t}, \bRat_{t}) - \gFunc(\dEndFunc_{t}(\lRat_{t}, - \bRat_{t})) +\nEndFunc*{t}(\lRat*{t}, \bRat*{t}) = \bRat*{t} - +\dEndFunc*{t}(\lRat*{t}, \bRat*{t}) - \gFunc(\dEndFunc*{t}(\lRat*{t}, +\bRat*{t})) \end{equation} and $\mRat_{t}$ as \begin{equation} - \mEndFunc_{t}(\lRat_{t}, \bRat_{t}) = \lRat_{t} + - \dEndFunc_{t}(\lRat_{t}, \bRat_{t}) +\mEndFunc*{t}(\lRat*{t}, \bRat*{t}) = \lRat*{t} + +\dEndFunc*{t}(\lRat*{t}, \bRat\_{t}) \end{equation} In sum, given an exogenous grid $(\lRat_{t}, \bRat_{t})$ we obtain the triple $\left(\mEndFunc_{t}(\lRat_{t}, \bRat_{t}), \nEndFunc_{t}(\lRat_{t}, \bRat_{t}), \dEndFunc_{t}(\lRat_{t}, \bRat_{t})\right)$, which we can use to create an interpolator for the decision rule $\dRat_{t}$. @@ -152,12 +130,12 @@ In sum, given an exogenous grid $(\lRat_{t}, \bRat_{t})$ we obtain the triple $\ To close the solution method, the envelope conditions are \begin{equation} - \begin{split} - \vFunc_{t}^{\mRat}(\mRat_{t}, \nRat_{t}) & = - \vOpt_{t}^{\lRat}(\lRat_{t}, \bRat_{t}) \\ - \vFunc_{t}^{\nRat}(\mRat_{t}, \nRat_{t}) & = - \vOpt_{t}^{\bRat}(\lRat_{t}, \bRat_{t}) - \end{split} +\begin{split} +\vFunc*{t}^{\mRat}(\mRat*{t}, \nRat*{t}) & = +\vOpt*{t}^{\lRat}(\lRat*{t}, \bRat*{t}) \\ +\vFunc*{t}^{\nRat}(\mRat*{t}, \nRat*{t}) & = +\vOpt*{t}^{\bRat}(\lRat*{t}, \bRat*{t}) +\end{split} \end{equation} ## Unstructured Grid Interpolation @@ -169,7 +147,7 @@ To close the solution method, the envelope conditions are A regular, rectilinear exogenous grid of pension balances after deposit $\bRat_{t}$ and liquid assets after consumption $\lRat_{t}$. ``` -As in [Section %s](#method), the resulting endogenous grid is not rectilinear, and in this more complex problem it is not even a regular grid. We can see in [Figure %s](#fig:exog) that starting from a regular and rectilinear exogenous grid of liquid assets post-consumption $\lRat_{t}$ and pension balances post-deposit $\bRat_{t}$, we obtain [Figure %s](#fig:endog) which shows an irregular and unstructured endogenous grid of market resources $\mRat_{t}$ and pension balances pre-deposit $\nRat_{t}$. +As in [Section %s](#method), the resulting endogenous grid is not rectilinear, and in this more complex problem it is not even a regular grid. We can see in [Figure %s](#fig:exog) that starting from a regular and rectilinear exogenous grid of liquid assets post-consumption $\lRat_{t}$ and pension balances post-deposit $\bRat_{t}$, we obtain [Figure %s](#fig:endog) which shows an irregular and unstructured endogenous grid of market resources $\mRat_{t}$ and pension balances pre-deposit $\nRat_{t}$. ```{figure} ../figures/PensionEndogenousGrid.* :name: fig:endog diff --git a/content/paper/4_multinterp.md b/content/paper/4_multinterp.md index bfa58a2e..21634615 100644 --- a/content/paper/4_multinterp.md +++ b/content/paper/4_multinterp.md @@ -1,25 +1,3 @@ ---- -# title: The Sequential Endogenous Grid Method # a string (max 500 chars) page & project -# description: # a string (max 500 chars) page & project -short_title: MultInterp # a string (max 40 chars) page & project -# name: # a string (max 500 chars) page & project -# tags: # a list of strings page only -# thumbnail: # a link to a local or remote image page only -# subtitle: # a string (max 500 chars) page only -# date: # a valid date formatted string page can override project -# authors: # a list of author objects page can override project -# doi: # a valid DOI, either URL or id page can override project -# arxiv: # a valid arXiv reference, either URL or id page can override project -# open_access: # boolean (true/false) page can override project -# license: # a license object or a string page can override project -# github: # a valid GitHub URL or owner/reponame page can override project -# binder: # any valid URL page can override project -# subject: # a string (max 40 chars) page can override project -# venue: # a venue object page can override project -# biblio: # a biblio object with various fields page can override project -numbering: - enumerator: "4.%s" ---- (multinterp)= # Multivariate Interpolation on Unstructured Grids diff --git a/content/paper/5_conditions.md b/content/paper/5_conditions.md index 299848ae..fd75d6ca 100644 --- a/content/paper/5_conditions.md +++ b/content/paper/5_conditions.md @@ -1,27 +1,5 @@ ---- -# title: The Sequential Endogenous Grid Method # a string (max 500 chars) page & project -# description: # a string (max 500 chars) page & project -short_title: Conditions # a string (max 40 chars) page & project -# name: # a string (max 500 chars) page & project -# tags: # a list of strings page only -# thumbnail: # a link to a local or remote image page only -# subtitle: # a string (max 500 chars) page only -# date: # a valid date formatted string page can override project -# authors: # a list of author objects page can override project -# doi: # a valid DOI, either URL or id page can override project -# arxiv: # a valid arXiv reference, either URL or id page can override project -# open_access: # boolean (true/false) page can override project -# license: # a license object or a string page can override project -# github: # a valid GitHub URL or owner/reponame page can override project -# binder: # any valid URL page can override project -# subject: # a string (max 40 chars) page can override project -# venue: # a venue object page can override project -# biblio: # a biblio object with various fields page can override project -numbering: - enumerator: "5.%s" ---- - (conditions)= + # Conditions for using the Sequential Endogenous Grid Method ## Splitting the problem into subproblems @@ -49,22 +27,22 @@ Now that we have split the problem into conceptual subproblems, it is important The consumption subproblem would be two-dimensional instead of one-dimensional, adding more complexity, \begin{equation} - \begin{split} - \vFunc(\bRat, \tShkEmp) & = \max_{\cRat} \uFunc(\cRat) + \vOpt(\bRat', \tShkEmp) \\ - & \text{s.t.}\\ - \bRat' & = \bRat - \cRat \ge - \tShkEmp - \end{split} +\begin{split} +\vFunc(\bRat, \tShkEmp) & = \max\_{\cRat} \uFunc(\cRat) + \vOpt(\bRat', \tShkEmp) \\ +& \text{s.t.}\\ +\bRat' & = \bRat - \cRat \ge - \tShkEmp +\end{split} \end{equation} while the labor-leisure subproblem would have an additional constraint \begin{equation} - \begin{split} - \vOpt(\bRat', \tShkEmp) & = \max_{\leisure} \h(\leisure) + \vEnd(\aRat) \\ - & \text{s.t.} \\ - 0 & \le \leisure \le 1 \\ - \aRat & = \bRat' + \tShkEmp(1 - \leisure) \ge 0. - \end{split} +\begin{split} +\vOpt(\bRat', \tShkEmp) & = \max\_{\leisure} \h(\leisure) + \vEnd(\aRat) \\ +& \text{s.t.} \\ +0 & \le \leisure \le 1 \\ +\aRat & = \bRat' + \tShkEmp(1 - \leisure) \ge 0. +\end{split} \end{equation} Therefore, strategic ordering of subproblems can greatly simplify the solution process and reduce computational the burden. @@ -88,24 +66,24 @@ Once we have strategically split the problem into subproblems, we can use the En A generic subproblem with a differentiable and invertible utility function can be characterized as follows: \begin{equation} - \begin{split} - \VFunc(\xRat) & = \max_{\yRat \in \PGro(\xRat)} \UFunc(\xRat, \yRat) + \DiscFac \WFunc(\aRat) \\ - & \text{s.t.} \\ - \aRat & = \TFunc(\xRat,\yRat) - \end{split} +\begin{split} +\VFunc(\xRat) & = \max\_{\yRat \in \PGro(\xRat)} \UFunc(\xRat, \yRat) + \DiscFac \WFunc(\aRat) \\ +& \text{s.t.} \\ +\aRat & = \TFunc(\xRat,\yRat) +\end{split} \end{equation} For an interior solution, the first-order condition is thus \begin{equation} - \UFunc'_{\yRat}(\xRat, \yRat) + \DiscFac \WFunc'(\aRat)\TFunc'_{\yRat}(\xRat,\yRat) = 0 +\UFunc'_{\yRat}(\xRat, \yRat) + \DiscFac \WFunc'(\aRat)\TFunc'_{\yRat}(\xRat,\yRat) = 0 \end{equation} If, as we assumed, the utility function is differentiable and invertible, then the Endogenous Grid Method consists of \begin{equation} - \yRat = \left(\UFunc'_{\yRat}(\xRat, \yRat)\right)^{-1} - \left[ -\DiscFac \WFunc'(\aRat)\TFunc'_{\yRat}(\xRat,\yRat)\right] +\yRat = \left(\UFunc'_{\yRat}(\xRat, \yRat)\right)^{-1} +\left[ -\DiscFac \WFunc'(\aRat)\TFunc'_{\yRat}(\xRat,\yRat)\right] \end{equation} By using an exogenous grid of the post-decision state $\aRat$, we can solve for the optimal decision rule $\yRat$ at each point on the grid. This is the Endogenous Grid Method step. @@ -115,21 +93,21 @@ By using an exogenous grid of the post-decision state $\aRat$, we can solve for If the generic subproblem has no separable utility, but instead has a differentiable and invertible transition, then the Endogenous Grid Method can still be used. \begin{equation} - \begin{split} - \VFunc(\xRat) & = \max_{\yRat \in \PGro(\xRat)} \WFunc(\aRat) \\ - & \text{s.t.} \\ - \aRat & = \TFunc(\xRat,\yRat) - \end{split} +\begin{split} +\VFunc(\xRat) & = \max\_{\yRat \in \PGro(\xRat)} \WFunc(\aRat) \\ +& \text{s.t.} \\ +\aRat & = \TFunc(\xRat,\yRat) +\end{split} \end{equation} Here, the first-order condition is \begin{equation} - \WFunc'(\aRat)\TFunc'_{\yRat}(\xRat,\yRat) = 0 +\WFunc'(\aRat)\TFunc'\_{\yRat}(\xRat,\yRat) = 0 \end{equation} and the Endogenous Grid Method step is \begin{equation} - \yRat = \left(\TFunc'_{\yRat}(\xRat,\yRat)\right)^{-1} \left[ 1 / \WFunc'(\aRat)\right] +\yRat = \left(\TFunc'\_{\yRat}(\xRat,\yRat)\right)^{-1} \left[ 1 / \WFunc'(\aRat)\right] \end{equation} diff --git a/content/paper/6_conclusion.md b/content/paper/6_conclusion.md index e1102551..9ddbac77 100644 --- a/content/paper/6_conclusion.md +++ b/content/paper/6_conclusion.md @@ -1,27 +1,5 @@ ---- -# title: The Sequential Endogenous Grid Method # a string (max 500 chars) page & project -# description: # a string (max 500 chars) page & project -short_title: Conclusion # a string (max 40 chars) page & project -# name: # a string (max 500 chars) page & project -# tags: # a list of strings page only -# thumbnail: # a link to a local or remote image page only -# subtitle: # a string (max 500 chars) page only -# date: # a valid date formatted string page can override project -# authors: # a list of author objects page can override project -# doi: # a valid DOI, either URL or id page can override project -# arxiv: # a valid arXiv reference, either URL or id page can override project -# open_access: # boolean (true/false) page can override project -# license: # a license object or a string page can override project -# github: # a valid GitHub URL or owner/reponame page can override project -# binder: # any valid URL page can override project -# subject: # a string (max 40 chars) page can override project -# venue: # a venue object page can override project -# biblio: # a biblio object with various fields page can override project -numbering: - enumerator: "6.%s" ---- - (conclusion)= + # Conclusion % Summarize the method: Begin your conclusion by summarizing the new computational method you developed or proposed. Provide a brief overview of the key features of the method and how it differs from existing methods. @@ -31,7 +9,6 @@ This paper introduces a novel method for solving dynamic stochastic optimization EGM$^n$ is similar to the Nested Endogenous Grid Method (NEGM)[^NEGM] and the Generalized Endogenous Grid Method (G2EGM)[^G2EGM] in that it can solve problems with multiple decisions, but it differs from these methods in that by choosing the subproblems strategically, we can take advantage of multiple sequential EGM steps to solve complex multidimensional models in a fast and efficient manner. Additionally, the use of machine learning tools such as the GPR overcomes bottlenecks seen in unstructured interpolation using Delauany triangulation and other similar methods. [^NEGM]: {cite:t}`Druedahl2021`. - [^G2EGM]: {cite:t}`Druedahl2017`. % Evaluate the method: Evaluate the strengths and limitations of the new computational method you developed or proposed. Discuss how the method compares to existing methods in terms of accuracy, efficiency, and ease of use. diff --git a/content/paper/7_appendix.md b/content/paper/7_appendix.md index 34882ac2..e6cfcc76 100644 --- a/content/paper/7_appendix.md +++ b/content/paper/7_appendix.md @@ -1,26 +1,3 @@ ---- -# title: The Sequential Endogenous Grid Method # a string (max 500 chars) page & project -# description: # a string (max 500 chars) page & project -short_title: Appendix # a string (max 40 chars) page & project -# name: # a string (max 500 chars) page & project -# tags: # a list of strings page only -# thumbnail: # a link to a local or remote image page only -# subtitle: # a string (max 500 chars) page only -# date: # a valid date formatted string page can override project -# authors: # a list of author objects page can override project -# doi: # a valid DOI, either URL or id page can override project -# arxiv: # a valid arXiv reference, either URL or id page can override project -# open_access: # boolean (true/false) page can override project -# license: # a license object or a string page can override project -# github: # a valid GitHub URL or owner/reponame page can override project -# binder: # any valid URL page can override project -# subject: # a string (max 40 chars) page can override project -# venue: # a venue object page can override project -# biblio: # a biblio object with various fields page can override project -numbering: - enumerator: "A.%s" ---- - (appendix)= # Appendix: Solving the illustrative G2EGM model with EGM$^n$ diff --git a/content/public/SequentialEGMn.pdf b/content/public/SequentialEGMn.pdf index a9dce0b0..b164ad03 100644 Binary files a/content/public/SequentialEGMn.pdf and b/content/public/SequentialEGMn.pdf differ diff --git a/myst.yml b/myst.yml index ed42d960..2bc5ee22 100644 --- a/myst.yml +++ b/myst.yml @@ -1,6 +1,6 @@ version: 1 site: - template: book-theme + template: article-theme options: logo: content/public/econ-ark-logo.png logo_text: Econ-ARK @@ -34,16 +34,18 @@ site: url: https://quantmacro.org - title: Slides url: https://alanlujan91.github.io/SequentialEGM/slides - actions: - - title: Download paper - url: content/public/SequentialEGMn.pdf - static: true + # actions: + # - title: Download paper + # url: content/public/SequentialEGMn.pdf + # static: true domains: - alanlujan91.curve.space favicon: public/econ-ark-logo-small.png project: - title: "EGMⁿ: The Sequential Endogenous Grid Method" + title: 'EGMⁿ: The Sequential Endogenous Grid Method' short_title: EGMⁿ + banner: banner.png + thumbnail: thumbnail.png authors: - name: Alan Lujan corresponding: false @@ -93,11 +95,12 @@ project: NEGM: Nested Endogenous Grid Method G2EGM: Generalized Endogenous Grid Method DCEGM: Discrete Choice Endogenous Grid Method + WGI: Warped Grid Interpolation math: '\CARA': '\alpha' '\CRRA': '\rho' '\PtyLab': '\mathrm{Z}' - '\ptyLab': "z" + '\ptyLab': 'z' '\TaxComb': '\mathcal{T}' '\Prob': '\mathbb{P}' '\DiePrb': '\mathsf{D}' @@ -121,9 +124,9 @@ project: '\cVec': '\vec{\mathrm{\cNrm}}' '\mVec': '\vec{\mathrm{m}}' '\yVec': '\vec{\mathrm{\yNrm}}' - '\Inc': "Y" - '\inc': "y" - '\PInc': "P" + '\Inc': 'Y' + '\inc': 'y' + '\PInc': 'P' '\AFunc': '\mathrm{A}' '\aFunc': '\mathrm{a}' '\BFunc': '\mathrm{B}' @@ -209,20 +212,20 @@ project: '\kPriceAfterITC': '\mathscr{P}' '\PostITC': '\cancel{\zeta}' '\pDead': '\mathfrak{D}' - '\TaxPaid': "T" + '\TaxPaid': 'T' '\WMid': '\BLev' '\wMid': '\bLev' '\Wmid': '\BRat' '\wmid': '\bRat' '\Dvdnd': '\mathbf{D}' - '\dvdnd': "d" + '\dvdnd': 'd' '\edvdnd': '\grave{\dvdnd}' '\hEnd': '\mathfrak{h}' - '\GovSpend': "X" - '\govSpend': "x" + '\GovSpend': 'X' + '\govSpend': 'x' '\xpend': '\xi' '\expend': '\xi' - '\TEnd': "T" + '\TEnd': 'T' '\VEnd': '\mathfrak{V}' '\vEnd': '\mathfrak{v}' '\WEnd': '\ALev' @@ -246,7 +249,7 @@ project: '\PermShkStd': '\sigma_{\PermShk}' '\TranShkStd': '\sigma_{\TranShk}' '\prud': '\eta' - '\tFwd': "n" + '\tFwd': 'n' '\aE': '\aRat^{e}' '\BE': '\BRat^{e}' '\bE': '\bRat^{e}' @@ -259,8 +262,8 @@ project: '\Rfree': '\mathsf{R}' '\rfree': '\mathsf{r}' '\TaxFree': '\cancel{\Tax}' - '\Age': "Z" - '\age': "z" + '\Age': 'Z' + '\age': 'z' '\Wage': '\mathsf{W}' '\wage': '\mathsf{w}' '\bTargE': '\check{b}^{e}' @@ -272,23 +275,23 @@ project: '\yTargE': '\check{y}^{e}' '\ME': '\MRat^{e}' '\mE': '\mRat^{e}' - '\TermTime': "T" + '\TermTime': 'T' '\ShkMeanOne': '\Theta' '\PopE': '\mathcal{E}' - '\popE': "e" + '\popE': 'e' '\labShare': '\nu' '\leiShare': '\zeta' '\kapShare': '\alpha' '\riskyshare': '\varsigma' '\Retire': '\mathbb{R}' - '\WPre': "K" - '\wPre': "k" - '\Leisure': "Z" - '\leisure': "z" + '\WPre': 'K' + '\wPre': 'k' + '\Leisure': 'Z' + '\leisure': 'z' '\SE': '\SRat^{e}' '\sE': '\sRat^{e}' - '\BRatE': "{B}^{e}" - '\bRatE': "{b}^{e}" + '\BRatE': '{B}^{e}' + '\bRatE': '{b}^{e}' '\CRatE': '\CRat^{e}' '\cRatE': '\cRat^{e}' '\DiscRate': '\vartheta' @@ -303,7 +306,7 @@ project: '\sRatE': '\sRat^{e}' '\srate': '\varsigma' '\urate': '\mho' - '\TaxRate': "t" + '\TaxRate': 't' '\empState': '\xi' '\discRte': '\tau' '\DiscRte': '\vartheta' @@ -318,10 +321,10 @@ project: '\RPRte': '\text{\thorn}_{\rfree}' '\deprRte': '\delta' '\Value': '\mathrm{V}' - '\VE': "{V}^{e}" - '\vE': "{v}^{e}" - '\Save': "S" - '\save': "s" + '\VE': '{V}^{e}' + '\vE': '{v}^{e}' + '\Save': 'S' + '\save': 's' '\RSave': '\underline{\Rfree}' '\rsave': '\underline{\rfree}' '\Abve': '\bar' @@ -388,7 +391,7 @@ project: '\mBalLog': '\BalGroRte{m}' '\EpremLog': '\varphi' '\ShkLogZeroLog': '\cancel{\ShkMeanOneLog}' - '\pLog': "p" + '\pLog': 'p' '\ImpG': '\Im}_{\PGro' '\impg': '\imath}_{\pGro' '\ATarg': '\check{A}' @@ -410,12 +413,12 @@ project: '\yTarg': '\check{y}' '\CGroOverG': '\Upsilon' '\avg': '\bar' - '\h': "h" - '\Wealth': "O" - '\wealth': "o" + '\h': 'h' + '\Wealth': 'O' + '\wealth': 'o' '\Hi': '\hat' '\Chi': '\mathrm{X}' - '\NI': "Z" + '\NI': 'Z' '\TaxUI': '\tau' '\adj': '\mathrm{j}' '\PermGroFacAdj': '\underline{\PermGroFac}' @@ -445,11 +448,11 @@ project: '\tshk': '\xi' '\Work': '\mathbb{W}' '\vk': '\lambda' - '\util': "u" + '\util': 'u' '\TranShkAll': '\pmb{\xi}' '\tShkAll': '\xi' - '\WAll': "O" - '\wAll': "o" + '\WAll': 'O' + '\wAll': 'o' '\Lvl': '\mathbf' '\ALvl': '\mathbf{A}' '\aLvl': '\mathbf{a}' @@ -504,47 +507,47 @@ project: '\eprem': '\varphi' '\tHorOfm': '\pmb{n}' '\debtLim': '\mathsf{d}' - '\tTerm': "T" + '\tTerm': 'T' '\vFirm': '\mathrm{e}' - '\ANrm': "A" - '\aNrm': "a" - '\BNrm': "B" - '\bNrm': "b" - '\CNrm': "C" - '\cNrm': "c" + '\ANrm': 'A' + '\aNrm': 'a' + '\BNrm': 'B' + '\bNrm': 'b' + '\CNrm': 'C' + '\cNrm': 'c' '\GPFacNrm': '\APFac_{\PermGroFacAdj}' - '\DNrm': "D" - '\dNrm': "d" - '\ENrm': "E" - '\eNrm': "e" - '\FNrm': "F" - '\fNrm': "f" + '\DNrm': 'D' + '\dNrm': 'd' + '\ENrm': 'E' + '\eNrm': 'e' + '\FNrm': 'F' + '\fNrm': 'f' '\bTrgNrm': '\TargetNrm{\bNrm}' '\mTrgNrm': '\TargetNrm{m}' - '\HNrm': "H" - '\hNrm': "h" - '\INrm': "I" - '\iNrm': "i" - '\JNrm': "J" - '\jNrm': "j" - '\KNrm': "K" - '\kNrm': "k" - '\MNrm': "M" - '\mNrm': "m" - '\PNrm': "P" - '\pNrm': "p" + '\HNrm': 'H' + '\hNrm': 'h' + '\INrm': 'I' + '\iNrm': 'i' + '\JNrm': 'J' + '\jNrm': 'j' + '\KNrm': 'K' + '\kNrm': 'k' + '\MNrm': 'M' + '\mNrm': 'm' + '\PNrm': 'P' + '\pNrm': 'p' '\RNrm': '\mathcal{R}' - '\rNrm': "s" - '\SNrm': "S" - '\sNrm': "s" + '\rNrm': 's' + '\SNrm': 'S' + '\sNrm': 's' '\TargetNrm': '\hat' - '\VNrm': "V" - '\vNrm': "v" - '\xNrm': "x" - '\YNrm': "Y" - '\yNrm': "y" - '\ZNrm': "Z" - '\zNrm': "z" + '\VNrm': 'V' + '\vNrm': 'v' + '\xNrm': 'x' + '\YNrm': 'Y' + '\yNrm': 'y' + '\ZNrm': 'Z' + '\zNrm': 'z' '\Rnorm': '\mathcal{R}' '\rnorm': '\mathit{r}' '\vNorm': '\mathrm{w}' @@ -552,9 +555,9 @@ project: '\wHum': '\hLev' '\Whum': '\HRat' '\whum': '\hRat' - '\Num': "N" - '\VNum': "V" - '\vNum': "v" + '\Num': 'N' + '\VNum': 'V' + '\vNum': 'v' '\Mean': '\mathbb{M}' '\tThen': '\tau' '\valfn': '\mathrm{v}' @@ -604,8 +607,8 @@ project: '\RBoro': '\bar{\Rfree}' '\rboro': '\bar{\rfree}' '\Pareto': '\zeta' - '\Kap': "K" - '\kap': "k" + '\Kap': 'K' + '\kap': 'k' '\EEndMap': '\mathsf{E}' '\TMap': '\mathscr{T}' '\cP': '\cons^{\prime}' @@ -617,7 +620,7 @@ project: '\TShkEmp': '\Theta' '\tShkEmp': '\theta' '\IncUnemp': '\mu' - '\Pop': "L" + '\Pop': 'L' '\cPP': '\cons^{\prime\prime}' '\FPP': '\mathrm{F}^{\prime\prime}' '\fPP': '\mathrm{f}^{\prime\prime}' @@ -638,13 +641,13 @@ project: '\sdr': '\mRat' '\Estdr': '\sigma_{\risky}' '\xFer': '\chi' - '\XFer': "X" - '\nIter': "n" + '\XFer': 'X' + '\nIter': 'n' '\power': '\eta' '\labor': '\ell' '\Labor': '\mathrm{L}' - '\PLabor': "P" - '\Plabor': "P" + '\PLabor': 'P' + '\Plabor': 'P' '\tHor': '\mathsf{n}' '\error': '\epsilon' '\Depr': '\daleth' @@ -653,45 +656,45 @@ project: '\impr': '\imath}_{\rfree' '\EVarr': '\sigma_{\Risky}^{2}' '\Evarr': '\sigma_{\risky}^{2}' - '\Err': "Z" - '\err': "z" + '\Err': 'Z' + '\err': 'z' '\CGroOverR': '\Phi' '\corr': '\varrho' - '\curr': "1" - '\Curr': "t" - '\tCurr': "t" + '\curr': '1' + '\Curr': 't' + '\tCurr': 't' '\PatR': '\text{\pmb{\Thorn}}_{\Rfree}' '\patr': '\text{\thorn}_{\rfree}' '\PDies': '\mathsf{D}' '\pDies': '\mathsf{d}' '\PLives': '\cancel{\PDies}' '\pLives': '\cancel{\pDies}' - '\Stocks': "S" - '\stocks': "s" - '\TaxNetTrans': "Z" - '\taxNetTrans': "z" + '\Stocks': 'S' + '\stocks': 's' + '\TaxNetTrans': 'Z' + '\taxNetTrans': 'z' '\unins': '\zeta' - '\Cons': "C" - '\cons': "c" + '\Cons': 'C' + '\cons': 'c' '\MPS': '\lambda' '\MinMPS': '\pZero^{1/\CRRA} \PatR' '\MaxMPS': '\PatR' '\CGroPS': '\chi' '\Hours': '\mathfrak{H}' '\hours': '\mathfrak{h}' - '\ASS': "A" - '\aSS': "a" - '\cEss': "{c}^{e}" + '\ASS': 'A' + '\aSS': 'a' + '\cEss': '{c}^{e}' '\mEss': '\check{m}^{e}' '\vEss': '\check{v}^{e}' '\MSS': '\breve{M}' '\mSS': '\breve{m}' '\RGross': '\breve{\mathsf{R}}' '\rGross': '\breve{\mathsf{r}}' - '\tSS': "t" - '\effUnits': "X" - '\Surplus': "Z" - '\surplus': "z" + '\tSS': 't' + '\effUnits': 'X' + '\Surplus': 'Z' + '\surplus': 'z' '\TEat': '\TEnd' '\patpGrohat': '\hat{\text{\thorn}}_{\pGro}' '\aMat': '[\mathrm{a}]' @@ -703,57 +706,57 @@ project: '\yMat': '[\mathrm{\yNrm}]' '\Pat': '\text{\pmb{\Thorn}}' '\pat': '\text{\thorn}' - '\ARat': "A" - '\aRat': "a" + '\ARat': 'A' + '\aRat': 'a' '\NFARat': '\NRat' - '\BRat': "B" - '\bRat': "b" - '\CRat': "C" - '\cRat': "c" + '\BRat': 'B' + '\bRat': 'b' + '\CRat': 'C' + '\cRat': 'c' '\ccRat': '\mathsf{c}' - '\dRat': "d" + '\dRat': 'd' '\WEndRat': '\ARat' '\wEndRat': '\aRat' - '\HRat': "H" - '\hRat': "h" - '\IRat': "I" - '\iRat': "i" - '\KRat': "K" - '\kRat': "k" - '\LRat': "L" - '\lRat': "l" - '\WAllRat': "O" - '\wAllRat': "o" - '\MRat': "M" - '\mRat': "m" - '\NRat': "N" - '\nRat': "n" - '\ORat': "O" - '\oRat': "o" - '\pRat': "p" - '\GDPRat': "P" - '\gdpRat': "p" - '\SRat': "S" - '\sRat': "s" - '\VRat': "V" - '\vRat': "v" - '\WRat': "O" - '\wRat': "o" - '\XRat': "X" - '\xRat': "x" - '\YRat': "Y" - '\yRat': "y" - '\ZRat': "Z" - '\zRat': "z" - '\Debt': "D" - '\debt': "d" + '\HRat': 'H' + '\hRat': 'h' + '\IRat': 'I' + '\iRat': 'i' + '\KRat': 'K' + '\kRat': 'k' + '\LRat': 'L' + '\lRat': 'l' + '\WAllRat': 'O' + '\wAllRat': 'o' + '\MRat': 'M' + '\mRat': 'm' + '\NRat': 'N' + '\nRat': 'n' + '\ORat': 'O' + '\oRat': 'o' + '\pRat': 'p' + '\GDPRat': 'P' + '\gdpRat': 'p' + '\SRat': 'S' + '\sRat': 's' + '\VRat': 'V' + '\vRat': 'v' + '\WRat': 'O' + '\wRat': 'o' + '\XRat': 'X' + '\xRat': 'x' + '\YRat': 'Y' + '\yRat': 'y' + '\ZRat': 'Z' + '\zRat': 'z' + '\Debt': 'D' + '\debt': 'd' '\Target': '\check' - '\WNet': "X" - '\wNet': "x" + '\WNet': 'X' + '\wNet': 'x' '\straight': '\Pi' '\weight': '\omega' - '\Habit': "H" - '\habit': "h" + '\Habit': 'H' + '\habit': 'h' '\WMkt': '\MLev' '\wMkt': '\mLev' '\wmkt': '\mLev' @@ -771,34 +774,34 @@ project: '\tinyAmount': '\epsilon' '\WTot': '\mathbf{O}' '\wTot': '\mathbf{o}' - '\Wtot': "O" - '\wtot': "o" + '\Wtot': 'O' + '\wtot': 'o' '\vOpt': '\tilde{\mathfrak{v}}' '\Rport': '\mathbb{R}' '\rport': '\mathbb{r}' '\FDist': '\mathcal{F}' '\fDist': '\mathcal{f}' - '\Next': "t+1" - '\tNext': "t+1" - '\BU': "{B}^{u}" - '\bU': "{b}^{u}" + '\Next': 't+1' + '\tNext': 't+1' + '\BU': '{B}^{u}' + '\bU': '{b}^{u}' '\CU': '\CRat^{u}' '\cU': '\cRat^{u}' '\MPCU': '\MPC^{u}' - '\MU': "{M}^{u}" - '\mU': "{m}^{u}" + '\MU': '{M}^{u}' + '\mU': '{m}^{u}' '\PopU': '\mathcal{U}' '\SU': '\SRat^{u}' '\sU': '\sRat^{u}' '\PatU': '\text{\pmb{\Thorn}}_{\urate}' '\patu': '\text{\thorn}_{\urate}' - '\bRatU': "{b}^{u}" + '\bRatU': '{b}^{u}' '\CRatU': '\CRat^{u}' '\cRatU': '\cRat^{u}' '\SRatU': '\SRat^{u}' '\sRatU': '\sRat^{u}' - '\VU': "{V}^{u}" - '\vU': "{v}^{u}" + '\VU': '{V}^{u}' + '\vU': '{v}^{u}' '\BLevU': '\BLev^{u}' '\bLevU': '\bLev^{u}' '\CLevU': '\CLev^{u}' @@ -809,67 +812,67 @@ project: '\PDV': '\mathbb{P}' '\CPDV': '\text{PDV($C$)}' '\PPDV': '\text{PDV($P$)}' - '\ALev': "A" - '\aLev': "a" + '\ALev': 'A' + '\aLev': 'a' '\NFALev': '\NLev' - '\BLev': "B" - '\bLev': "b" - '\CLev': "C" - '\cLev': "c" - '\DLev': "D" - '\ELev': "E" - '\FLev': "F" - '\fLev': "f" - '\GLev': "G" + '\BLev': 'B' + '\bLev': 'b' + '\CLev': 'C' + '\cLev': 'c' + '\DLev': 'D' + '\ELev': 'E' + '\FLev': 'F' + '\fLev': 'f' + '\GLev': 'G' '\HLev': '\pmb{H}' '\hLev': '\pmb{h}' - '\ILev': "I" - '\iLev': "i" - '\JLev': "J" - '\KLev': "K" - '\kLev': "k" + '\ILev': 'I' + '\iLev': 'i' + '\JLev': 'J' + '\KLev': 'K' + '\kLev': 'k' '\lLev': '\ell' - '\LLev': "L" + '\LLev': 'L' '\WAllLev': '\mathbf{O}' '\wAllLev': '\mathbf{o}' - '\MLev': "M" - '\mLev': "m" - '\NLev': "N" - '\nLev': "n" + '\MLev': 'M' + '\mLev': 'm' + '\NLev': 'N' + '\nLev': 'n' '\oLev': '\pmb{o}' - '\OLev': "O" + '\OLev': 'O' '\pLev': '\pmb{p}' - '\PLev': "P" + '\PLev': 'P' '\GDPLev': '\pmb{P}' '\gdpLev': '\pmb{p}' '\PopLev': '\pmb{N}' - '\QLev': "Q" - '\RLev': "R" - '\SLev': "S" - '\sLev': "s" - '\TLev': "T" - '\ULev': "U" - '\uLev': "u" - '\VLev': "V" - '\vLev': "v" + '\QLev': 'Q' + '\RLev': 'R' + '\SLev': 'S' + '\sLev': 's' + '\TLev': 'T' + '\ULev': 'U' + '\uLev': 'u' + '\VLev': 'V' + '\vLev': 'v' '\wLev': '\pmb{w}' - '\WLev': "W" - '\XLev': "X" - '\xLev': "x" - '\TaxLev': "T" - '\YLev': "Y" - '\yLev': "y" - '\PtyLev': "A" - '\ptyLev': "a" - '\ZLev': "Z" - '\zLev': "z" + '\WLev': 'W' + '\XLev': 'X' + '\xLev': 'x' + '\TaxLev': 'T' + '\YLev': 'Y' + '\yLev': 'y' + '\PtyLev': 'A' + '\ptyLev': 'a' + '\ZLev': 'Z' + '\zLev': 'z' '\Rev': '\Pi' '\rev': '\pi' - '\tPrev': "t-1" - '\Div': "D" + '\tPrev': 't-1' + '\Div': 'D' '\DiscFacLiv': '\underline{\DiscFacRaw}' - '\Inv': "I" - '\inv': "i" + '\Inv': 'I' + '\inv': 'i' '\TaxCombInv': '\mathcal{T}^{-1}' '\EPermShkInv': '\Ex[\PermShk^{-1}]' '\InvEPermShkInv': '\underline{\PermShk}' @@ -882,10 +885,10 @@ project: '\DiscFacRaw': '\beta' '\GPFacRaw': '\APFac_{\PermGroFac}' '\Belw': '\ushort' - '\GovNW': "N" - '\govNW': "n" + '\GovNW': 'N' + '\govNW': 'n' '\cFuncBelow': '\uline{\mathrm{c}}' - '\tNow': "t" + '\tNow': 't' '\cFuncMax': '\bar{\bar{\mathrm{c}}}' '\MPCmax': '\bar{\kappa}' '\MPSmax': '\RPFac' diff --git a/thumbnail.png b/thumbnail.png new file mode 100644 index 00000000..3a5d037b Binary files /dev/null and b/thumbnail.png differ