diff --git a/notebooks/Uncertainty-and-the-Saving-Rate.ipynb b/notebooks/Uncertainty-and-the-Saving-Rate.ipynb
deleted file mode 100644
index 48589728..00000000
--- a/notebooks/Uncertainty-and-the-Saving-Rate.ipynb
+++ /dev/null
@@ -1,758 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Uncertainty and Saving in Partial Equilibrium\n",
- "\n",
- "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/econ-ark/DemARK/master?filepath=notebooks%2FUncertainty-and-the-Saving-Rate.ipynb)\n",
- "\n",
- "Saving rates vary widely across countries, but there is no consensus about the main causes of those differences.\n",
- "\n",
- "One commonly mentioned factor is differences across countries in the degree of uncertainty that individuals face, which should induce different amounts of precautionary saving.\n",
- "\n",
- "Uncertainty might differ for \"fundamental\" reasons, having to do with, say, the volatility of demand for the goods and services supplied by the country, or might differ as a result of economic policies, such as the strucutre of the social insurance system.\n",
- "\n",
- "A challenge in evaluating the importance of precautionary motives for cross-country saving differences has been a lack of consensus about what measures of uncertainty ought, in principle, to be the right ones to look at in any attempt to measure a relationship between uncertainty and saving.\n",
- "\n",
- "This notebook uses [a standard model](https://econ.jhu.edu/people/ccarroll/papers/cstwMPC) to construct a theoretical benchmark for the relationship of saving to two kinds of uncertainty: Permanent shocks and transitory shocks to income. \n",
- "\n",
- "Conclusions:\n",
- "1. The model implies a close to linear relationship between the variance of either kind of shock (transitory or permanent) and the saving rate\n",
- "2. The _slope_ of that relationship is much steeper for permanent than for transitory shocks\n",
- " * Over ranges of values calibrated to be representative of microeconomically plausible magnitudes\n",
- "\n",
- "Thus, the quantitative theory of precautionary saving says that the principal determinant of precautionary saving should be the magnitude of permanent (or highly persistent) shocks to income.\n",
- "\n",
- "(Because the result was obtained in a partial equilibrium model, the conclusion applies also to attempts to measure the magnitude of precautionary saving across groups of people who face different degrees of uncertainty within a country).\n",
- "\n",
- "@authors: Derin Aksit, Tongli Zhang, Christopher Carroll"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "code_folding": [
- 0,
- 11
- ]
- },
- "outputs": [],
- "source": [
- "# Boring non-HARK setup stuff\n",
- "\n",
- "Generator = True # This notebook can be used as a source for generating derivative notebooks\n",
- "nb_name = 'Uncertainty-and-the-Saving-Rate'\n",
- "\n",
- "# This is a jupytext paired notebook that autogenerates BufferStockTheory.py\n",
- "# which can be executed from a terminal command line via \"ipython BufferStockTheory.py\"\n",
- "# But a terminal does not permit inline figures, so we need to test jupyter vs terminal\n",
- "# Google \"how can I check if code is executed in the ipython notebook\"\n",
- "\n",
- "from IPython import get_ipython # In case it was run from python instead of ipython\n",
- "def in_ipynb():\n",
- " try:\n",
- " if str(type(get_ipython())) == \"\":\n",
- " return True\n",
- " else:\n",
- " return False\n",
- " except NameError:\n",
- " return False\n",
- "\n",
- "# Determine whether to make the figures inline (for spyder or jupyter)\n",
- "# vs whatever is the automatic setting that will apply if run from the terminal\n",
- "if in_ipynb():\n",
- " # %matplotlib inline generates a syntax error when run from the shell\n",
- " # so do this instead\n",
- " get_ipython().run_line_magic('matplotlib', 'inline')\n",
- "else:\n",
- " get_ipython().run_line_magic('matplotlib', 'auto')\n",
- " print('You appear to be running from a terminal')\n",
- " print('By default, figures will appear one by one')\n",
- " print('Close the visible figure in order to see the next one')\n",
- "\n",
- "# Import the plot-figure library matplotlib\n",
- "\n",
- "import matplotlib.pyplot as plt\n",
- "\n",
- "# In order to use LaTeX to manage all text layout in our figures, we import rc settings from matplotlib.\n",
- "from matplotlib import rc\n",
- "plt.rc('font', family='serif')\n",
- "\n",
- "# LaTeX is huge and takes forever to install on mybinder\n",
- "# so if it is not installed then do not use it \n",
- "from distutils.spawn import find_executable\n",
- "iflatexExists=False\n",
- "if find_executable('latex'):\n",
- " iflatexExists=True\n",
- " \n",
- "plt.rc('font', family='serif')\n",
- "plt.rc('text', usetex=iflatexExists)\n",
- "\n",
- "# The warnings package allows us to ignore some harmless but alarming warning messages\n",
- "import warnings\n",
- "warnings.filterwarnings(\"ignore\")\n",
- "\n",
- "import os\n",
- "from copy import copy, deepcopy\n",
- "\n",
- "# Define (and create, if necessary) the figures directory \"Figures\"\n",
- "if Generator:\n",
- " nb_file_path = os.path.dirname(os.path.abspath(nb_name+\".ipynb\")) # Find pathname to this file:\n",
- " FigDir = os.path.join(nb_file_path,\"Figures/\") # LaTeX document assumes figures will be here\n",
- "# FigDir = os.path.join(nb_file_path,\"/tmp/Figures/\") # Uncomment to make figures outside of git path\n",
- " if not os.path.exists(FigDir):\n",
- " os.makedirs(FigDir)\n",
- "\n",
- "from copy import deepcopy\n",
- "from scipy.optimize import golden, brentq\n",
- "from time import time\n",
- "import numpy as np\n",
- "import scipy as sp"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "code_folding": [
- 0
- ]
- },
- "outputs": [],
- "source": [
- "# Import HARK tools and cstwMPC parameter values\n",
- "from HARK.utilities import plotFuncsDer, plotFuncs\n",
- "from HARK.ConsumptionSaving.ConsIndShockModel import PerfForesightConsumerType\n",
- "import HARK.cstwMPC.cstwMPC as cstwMPC\n",
- "import HARK.cstwMPC.SetupParamsCSTW as Params\n",
- "\n",
- "# Double the default value of variance\n",
- "# Params.init_infinite['PermShkStd'] = [i*2 for i in Params.init_infinite['PermShkStd']]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "code_folding": [
- 0
- ],
- "scrolled": false
- },
- "outputs": [],
- "source": [
- "# Setup stuff for general equilibrium version\n",
- "\n",
- "# Set targets for K/Y and the Lorenz curve\n",
- "lorenz_target = cstwMPC.getLorenzShares(Params.SCF_wealth,weights=\n",
- " Params.SCF_weights,percentiles=\n",
- " Params.percentiles_to_match)\n",
- "\n",
- "lorenz_long_data = np.hstack((np.array(0.0),\\\n",
- " cstwMPC.getLorenzShares(Params.SCF_wealth,weights=\\\n",
- " Params.SCF_weights,percentiles=\\\n",
- " np.arange(0.01,1.0,0.01).tolist()),np.array(1.0)))\n",
- "KY_target = 10.26"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "code_folding": [
- 0
- ]
- },
- "outputs": [],
- "source": [
- "# Setup and calibration of the agent types\n",
- "\n",
- "# The parameter values below are taken from\n",
- "# http://econ.jhu.edu/people/ccarroll/papers/cjSOE/#calibration\n",
- "\n",
- "Params.init_cjSOE = Params.init_infinite # Get default values of all parameters\n",
- "# Now change some of the parameters for the individual's problem to those of cjSOE\n",
- "Params.init_cjSOE['CRRA'] = 2\n",
- "Params.init_cjSOE['Rfree'] = 1.04**0.25\n",
- "Params.init_cjSOE['PermGroFac'] = [1.01**0.25] # Indiviual-specific income growth (from experience, e.g.)\n",
- "Params.init_cjSOE['PermGroFacAgg'] = 1.04**0.25 # Aggregate productivity growth \n",
- "Params.init_cjSOE['LivPrb'] = [0.95**0.25] # Matches a short working life \n",
- "\n",
- "PopGroFac_cjSOE = [1.01**0.25] # Irrelevant to the individual's choice; attach later to \"market\" economy object\n",
- "\n",
- "# Instantiate the baseline agent type with the parameters defined above\n",
- "BaselineType = cstwMPC.cstwMPCagent(**Params.init_cjSOE)\n",
- "BaselineType.AgeDstn = np.array(1.0) # Fix the age distribution of agents\n",
- "\n",
- "# Make desired number of agent types (to capture ex-ante heterogeneity)\n",
- "EstimationAgentList = []\n",
- "for n in range(Params.pref_type_count):\n",
- " EstimationAgentList.append(deepcopy(BaselineType))\n",
- " EstimationAgentList[n].seed = n # Give every instance a different seed"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "code_folding": [
- 0
- ]
- },
- "outputs": [],
- "source": [
- "# Make an economy for the consumers to live in\n",
- "\n",
- "EstimationEconomy = cstwMPC.cstwMPCmarket(**Params.init_market)\n",
- "EstimationEconomy.print_parallel_error_once = True # Avoids a bug in the code\n",
- "\n",
- "EstimationEconomy.agents = EstimationAgentList\n",
- "EstimationEconomy.act_T = Params.T_sim_PY # How many periods of history are good enough for \"steady state\""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "code_folding": [
- 0
- ]
- },
- "outputs": [],
- "source": [
- "# Uninteresting parameters that also need to be set \n",
- "EstimationEconomy.KYratioTarget = KY_target\n",
- "EstimationEconomy.LorenzTarget = lorenz_target\n",
- "EstimationEconomy.LorenzData = lorenz_long_data\n",
- "EstimationEconomy.PopGroFac = PopGroFac_cjSOE # Population growth characterizes the entire economy\n",
- "EstimationEconomy.ignore_periods = Params.ignore_periods_PY # Presample periods\n",
- "\n",
- "#Display statistics about the estimated model (or not)\n",
- "EstimationEconomy.LorenzBool = False\n",
- "EstimationEconomy.ManyStatsBool = False\n",
- "EstimationEconomy.TypeWeight = [1.0]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "code_folding": [
- 0
- ],
- "lines_to_next_cell": 2
- },
- "outputs": [],
- "source": [
- "# construct spread_estimate and center_estimate if true, otherwise use the default values\n",
- "Params.do_param_dist=True # Whether to use a distribution of ex-ante heterogeneity\n",
- "\n",
- "# Discount factors assumed to be uniformly distributed around center_pre for spread_pre on either side\n",
- "\n",
- "spread_pre=0.0019501105739768 #result under the default calibration of cjSOE\n",
- "center_pre=1.0065863855906343 #result under the default calibration of cjSOE\n",
- "\n",
- "do_optimizing=False # Set to True to reestimate the distribution of time preference rates\n",
- "\n",
- "if do_optimizing: # If you want to rerun the cstwMPC estimation, change do_optimizing to True\n",
- " # Finite value requires discount factor from combined pure and mortality-induced\n",
- " # discounting to be less than one, so maximum DiscFac is 1/LivPrb\n",
- " DiscFacMax = 1/Params.init_cjSOE['LivPrb'][0] # \n",
- " param_range = [0.995,-0.0001+DiscFacMax] \n",
- " spread_range = [0.00195,0.0205] # \n",
- "\n",
- " if Params.do_param_dist: # If configured to estimate the distribution\n",
- " LorenzBool = True\n",
- " # Run the param-dist estimation\n",
- " paramDistObjective = lambda spread : cstwMPC.findLorenzDistanceAtTargetKY(\n",
- " Economy = EstimationEconomy,\n",
- " param_name = Params.param_name,\n",
- " param_count = Params.pref_type_count,\n",
- " center_range = param_range,\n",
- " spread = spread,\n",
- " dist_type = Params.dist_type) # Distribution of DiscFac\n",
- " t_start = time()\n",
- " \n",
- " spread_estimate = golden(paramDistObjective \n",
- " ,brack=spread_range\n",
- " ,tol=1e-4) \n",
- " center_estimate = EstimationEconomy.center_save\n",
- " t_end = time()\n",
- " else: # Run the param-point estimation only\n",
- " paramPointObjective = lambda center : cstwMPC.getKYratioDifference(Economy = EstimationEconomy,\n",
- " param_name = Params.param_name,\n",
- " param_count = Params.pref_type_count,\n",
- " center = center,\n",
- " spread = 0.0,\n",
- " dist_type = Params.dist_type)\n",
- " t_start = time()\n",
- " center_estimate = brentq(paramPointObjective # Find best point estimate \n",
- " ,param_range[0]\n",
- " ,param_range[1],xtol=1e-6)\n",
- " spread_estimate = 0.0\n",
- " t_end = time()\n",
- " \n",
- " print(spread_estimate)\n",
- " print('****************')\n",
- " print(center_estimate)\n",
- " print('****************')\n",
- "else: # Just use the hard-wired numbers from cstwMPC\n",
- " center_estimate=center_pre\n",
- " spread_estimate=spread_pre"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "code_folding": [
- 0
- ]
- },
- "outputs": [],
- "source": [
- "# Construct the economy at date 0\n",
- "EstimationEconomy.distributeParams( # Construct consumer types whose heterogeneity is in the given parameter\n",
- " 'DiscFac',\n",
- " Params.pref_type_count,# How many different types of consumer are there \n",
- " center_estimate, # Increase patience slightly vs cstwMPC so that maximum saving rate is higher\n",
- " spread_estimate, # How much difference is there across consumers\n",
- " Params.dist_type) # Default is for a uniform distribution"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "code_folding": [
- 0
- ]
- },
- "outputs": [],
- "source": [
- "# Function to calculate the saving rate of a cstw economy\n",
- "def calcSavRte(Economy,ParamToChange,NewVals):\n",
- " '''\n",
- " Calculates the saving rate as income minus consumption divided by income.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " Economy : [cstwMPCmarket] \n",
- " A fully-parameterized instance of a cstwMPCmarket economy\n",
- " ParamToChange : string\n",
- " Name of the parameter that should be varied from the original value in Economy\n",
- " NewVals : [float] or [list]\n",
- " The alternative value (or list of values) that the parameter should take\n",
- "\n",
- " Returns\n",
- " -------\n",
- " savRte : [float]\n",
- " The aggregate saving rate in the last year of the generated history\n",
- " '''\n",
- " for NewVal in NewVals:\n",
- " if ParamToChange in [\"PermShkStd\",\"TranShkStd\"]:\n",
- " ThisVal = [NewVal]\n",
- " else:\n",
- " ThisVal = NewVal # If they asked to change something else, assume it's a scalar\n",
- " \n",
- " for j in range(len(Economy.agents)): # For each agent, set the new parameter value\n",
- " setattr(Economy.agents[j],ParamToChange,ThisVal)\n",
- " cstwMPC.cstwMPCagent.updateIncomeProcess(Economy.agents[j]) \n",
- " \n",
- " Economy.solve()\n",
- " \n",
- " C_NrmNow=[]\n",
- " A_NrmNow=[]\n",
- " M_NrmNow=[]\n",
- " for j in range (len(Economy.agents)): # Combine the results across all the agents\n",
- " C_NrmNow=np.hstack((C_NrmNow,Economy.agents[j].cNrmNow))\n",
- " A_NrmNow=np.hstack((A_NrmNow,Economy.agents[j].aNrmNow))\n",
- " M_NrmNow=np.hstack((M_NrmNow,Economy.agents[j].mNrmNow))\n",
- " CAgg=np.sum(np.hstack(Economy.pLvlNow)*C_NrmNow) # cNrm times pLvl = level of c; sum these for CAgg\n",
- " AAgg=np.sum(np.hstack(Economy.pLvlNow)*A_NrmNow) # Aggregate Assets\n",
- " MAgg=np.sum(np.hstack(Economy.pLvlNow)*M_NrmNow) # Aggregate Market Resources\n",
- " YAgg=np.sum(np.hstack(Economy.pLvlNow)*np.hstack(Economy.TranShkNow)) # Aggregate Labor Income\n",
- " BAgg=MAgg-YAgg # Aggregate \"Bank Balances\" (at beginning of period; before consumption decision)\n",
- " IncAgg=(BaselineType.Rfree-1)*BAgg+YAgg # Interest income plus noninterest income\n",
- " savRte=(IncAgg-CAgg)/IncAgg # Unspent income divided by the level of income\n",
- " return savRte"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "code_folding": [
- 0
- ]
- },
- "outputs": [],
- "source": [
- "# Function to plot relationship between x and y; x is the parameter varied and y is saving rate\n",
- "def plotReg(x,y,xMin,xMax,yMin,yMax,xLbl,yLbl,Title,fileName):\n",
- " # Result_data_path = os.path.join(Folder_path,'SavingVSPermShr_Youth_MPC_15.png')\n",
- " plt.ylabel(yLbl)\n",
- " plt.xlabel(xLbl)\n",
- " plt.title(Title)\n",
- " plt.xlim(xMin,xMax)\n",
- " plt.ylim(yMin,yMax)\n",
- " plt.scatter(x,y)\n",
- " # Draw the linear fitted line\n",
- " m, b = np.polyfit(x, y, 1)\n",
- "# plt.plot(x, m*np.asarray(x) + b, '-')\n",
- " if Generator:\n",
- " plt.savefig(FigDir + nb_name + '-' + fileName + '.png')\n",
- " plt.savefig(FigDir + nb_name + '-' + fileName + '.svg')\n",
- " plt.savefig(FigDir + nb_name + '-' + fileName + '.pdf')\n",
- " slope, intercept, r_value, p_value, std_err = sp.stats.linregress(x,y)\n",
- " print('Slope=' + str(slope) + ', intercept=' + str(intercept) + ', r_value=' + str(r_value) + ', p_value=' + str(p_value)+', std=' + str(std_err))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "code_folding": [
- 0
- ]
- },
- "outputs": [],
- "source": [
- "# Proportion of base value for uncertainty parameter to take (up to 1 = 100 percent)\n",
- "# Do not go above one to avoid having to worry about whether the most patient consumer violates the \n",
- "# Growth Impatience Condition (https://econ.jhu.edu/people/ccarroll/papers/BufferStockTheory/#GIC)\n",
- "bottom=0.5\n",
- "points=np.arange(bottom,1.+0.025,0.025)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {
- "code_folding": [
- 0
- ],
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "# Calculate variance of permanent shock vs saving measures\n",
- "savRteList = []\n",
- "KtoYList = []\n",
- "pVarList = []\n",
- "pVarBase = BaselineType.PermShkStd[0] ** 2\n",
- "for pVar in points * pVarBase:\n",
- " pVarList.append(pVar) # Variance is square of standard deviation\n",
- " pStd = pVar ** 0.5\n",
- "# print(pStd)\n",
- " savRteList.append(calcSavRte(EstimationEconomy,\"PermShkStd\",[pStd]))\n",
- " KtoYList.append(0.25*np.mean(np.array(EstimationEconomy.KtoYnow_hist)[EstimationEconomy.ignore_periods:]))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {
- "code_folding": [
- 0
- ]
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Halving the magnitude of the permanent variance causes target wealth to fall to 0.646\n",
- "of its original value.\n"
- ]
- }
- ],
- "source": [
- "# Calculate how much net worth shrinks when permanent variance is halved \n",
- "ShrinksBy = KtoYList[1]/KtoYList[-1]\n",
- "print('Halving the magnitude of the permanent variance causes target wealth to fall to %1.3f' % ShrinksBy)\n",
- "print('of its original value.')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {
- "code_folding": [
- 0
- ]
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Slope=43.87569286985961, intercept=0.07612904106465898, r_value=0.9957594503438054, p_value=3.715857043912896e-21, std=0.9299464143538145\n"
- ]
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "