RBC model: simple vs advanced calibration using modularization and changing types

How to calibrate the parameters of the RBC model in a sophisticated way using Dynare’s preprocessing capabilities.

This video is part of a series of videos on the baseline Real Business Cycle model and its implementation in Dynare. In this video I show how to calibrate the model parameters in a sophisticated way using Dynare’s preprocessing capabilities. First, we cover some general ideas and tips how to calibrate the parameters of a DSGE model, focusing on the RBC model with leisure. Then I show how to accomplish this in Dynare either directly or, a more advanced way, by modularizing your mod file and changing the type of variables and parameters. Once you start working with large-scale models, this modularization technique will make your models much more tractable.

Video

Timestamps

General ideas and tips

Simple (but not powerful) implementation in Dynare in parameters block

Advanced (and powerful) implementation in Dynare using modularization, change_type, save_params_and_steady_state

Outro & References

Slides

Presentation

Codes

rbc_nonlinear_symdecls.inc

var
  y     ${Y}$        (long_name='output')
  c     ${C}$        (long_name='consumption')
  k     ${K}$        (long_name='capital')
  l     ${L}$        (long_name='labor')
  a     ${A}$        (long_name='productivity')
  r     ${R}$        (long_name='interest Rate')
  w     ${W}$        (long_name='wage')
  iv    ${I}$        (long_name='investment')
  mc    ${MC}$       (long_name='marginal Costs')
  @#if STEADY
  wl_y iv_y k_y
  @#endif
;

model_local_variable
  uc    ${U_t^C}$
  ucp   ${E_t U_{t+1}^C}$
  ul    ${U_t^L}$
  fk    ${f_t^K}$
  fl    ${f_t^L}$
;

varexo
  epsa  ${\varepsilon^A}$   (long_name='Productivity Shock')
;

parameters
  BETA  ${\beta}$  (long_name='Discount Factor')
  DELTA ${\delta}$ (long_name='Depreciation Rate')
  GAMMA ${\gamma}$ (long_name='Consumption Utility Weight')
  PSI   ${\psi}$   (long_name='Labor Disutility Weight')
  @#if LOGUTILITY != 1
  ETAC  ${\eta^C}$ (long_name='Risk Aversion')
  ETAL  ${\eta^L}$ (long_name='Inverse Frisch Elasticity')
  @#endif
  ALPHA ${\alpha}$ (long_name='Output Elasticity of Capital')
  RHOA  ${\rho^A}$ (long_name='Discount Factor')
;

rbc_nonlinear_modeqs.inc

model;
%marginal utility of consumption and labor
@#if LOGUTILITY == 1
  #uc  = GAMMA*c^(-1);
  #ucp  = GAMMA*c(+1)^(-1);
  #ul = -PSI*(1-l)^(-1);
@#else
  #uc  = GAMMA*c^(-ETAC);
  #ucp  = GAMMA*c(+1)^(-ETAC);
  #ul = -PSI*(1-l)^(-ETAL);
@#endif

%marginal products of production
#fk = ALPHA*y/k(-1);
#fl = (1-ALPHA)*y/l;

[name='intertemporal optimality (Euler)']
uc = BETA*ucp*(1-DELTA+r(+1));
[name='labor supply']
w = -ul/uc;
[name='capital accumulation']
k = (1-DELTA)*k(-1) + iv;
[name='market clearing']
y = c + iv;
[name='production function']
y = a*k(-1)^ALPHA*l^(1-ALPHA);
[name='marginal costs']
mc = 1;
[name='labor demand']
w = mc*fl;
[name='capital demand']
r = mc*fk;
[name='total factor productivity']
log(a) = RHOA*log(a(-1)) + epsa;

@#if STEADY
wl_y = w*l/y;
iv_y = iv/y;
k_y  = k(-1)/y;
@#endif    
end;

rbc_nonlinear_steady1.mod

@#define LOGUTILITY = 0
@#define STEADY = 1

@#include "rbc_nonlinear_symdecls.inc"
@#include "rbc_nonlinear_modeqs.inc"


% -------------------------- %
% Easiest Model: log utility %
% -------------------------- %
ALPHA = 0.33;
BETA  = 0.99;
DELTA = 0.025;
RHOA  = 0.9;
GAMMA = 1;
PSI   = 1;
ETAC  = 1;
ETAL  = 1;

steady_state_model;
a = 1;
mc = 1;
r = 1/BETA + DELTA -1;
K_L = (mc*ALPHA*a/r)^(1/(1-ALPHA));
w = mc*(1-ALPHA)*a*K_L^ALPHA;
IV_L = DELTA*K_L;
Y_L = a*(K_L)^ALPHA;
C_L = Y_L - IV_L;
l = GAMMA/PSI*C_L^(-1)*w/(1+GAMMA/PSI*C_L^(-1)*w);
c  = C_L*l;
y  = Y_L*l;
iv = IV_L*l;
k  = K_L*l;
wl_y = w*l/y;
iv_y = iv/y;
k_y = k/y;
end;

steady;
save_params_and_steady_state('rbc_nonlinear_steady1.txt');

rbc_nonlinear_steady2.mod

@#define LOGUTILITY = 0
@#define STEADY = 1

@#include "rbc_nonlinear_symdecls.inc"
change_type(parameters) l wl_y iv_y k_y;
change_type(var) PSI ALPHA DELTA BETA;

@#include "rbc_nonlinear_modeqs.inc"

load_params_and_steady_state('rbc_nonlinear_steady1.txt');

set_param_value('ETAC',2);
set_param_value('ETAL',1.5);

set_param_value('l',1/3);
set_param_value('wl_y',0.65);
set_param_value('iv_y',0.25);
set_param_value('k_y',10);

steady;
save_params_and_steady_state('rbc_nonlinear_steady2.txt');

rbc_nonlinear_final.mod

@#define LOGUTILITY = 0
@#define STEADY = 0

@#include "rbc_nonlinear_symdecls.inc"
@#include "rbc_nonlinear_modeqs.inc"

load_params_and_steady_state('rbc_nonlinear_steady2.txt');

steady;

shocks;
var epsa = 0.001;
end;

stoch_simul(order=1);