23 nov 2022

Modelo de análisis macroeconómico Bayesiano en IRIS

La siguiente entrada muestra como especificar un Modelo de Análisis Macroeconómico Bayesiano para la economía dominicana, disponible como serie de estudio en la pagina del Banco Central de la República Dominicana. Esta aplicación se realiza en IRIS (Macroeconomic Modeling Toolbox) un paquete desarrollado por el Fondo Monetario Internacional.

Posterior a instalar el paquete IRIS y anexarlo al path de MATLAB. En primer lugar es necesario desarrollar el archivo “.model”, que es un script en Matlab donde presentamos las variables, los parámetros y las ecuaciones del modelo. El detalle de esta estructura puede verse en el paper presentado por Franz Hanann y mencionado anteriormente.

!variables
"brecha del producto" y_gap
"brecha de tasa de interes real" r_gap
"inflacion trimestral anualizada" pic
"tasa de politica monetaria" tpm  
"inflacion interanual" picA 
"log pib" y    
"pib potencial" y_pot
"tasa de interes real" r  

!shocks
 
 "choque de brecha del producto" eta_y_gap
 "choque de oferta o costes" eta_pic
 "choque de politica monetaria" eta_tpm
 "choque de pib potencial" eta_y_pot
 
!parameters
 
%brecha del producto
"persistencia de la brecha del producto" bet_1
"componente prospectivo, expectativas" bet_2
"elasticidad de la brecha de tasa, pendiente curba IS" bet_3
 
%curva de Phillips
"inercia inflacionaria" alp_1
"componente prospectivo expectativas" alp_2
"pendiente curva de Phillips" alp_3 %mas pequeno, menos sensible es la inflacion a la brecha

% Regla de Taylor
"persistencia tpm" phi_tpm
"parametro de taylor" phi_pic
"brecha del producto" phi_y_gap
 
% parametros de largo plazo
"meta de tasa" meta_pic
"Tasa de interes neutral" i_neutral
"Tasa de interes real de largo plazo" r_neutral
"Crecimiento potencial" gA_pot
 
!equations
 
 %brecha del producto
 y_gap = bet_1*y_gap{-1}+ bet_2*y_gap{+1}-bet_3*r_gap + eta_y_gap;
   
 %curva de phillips
 pic = alp_1*pic{-1}+alp_2*pic{+1}+alp_3*y_gap+eta_pic;
   
 %regla de politica
 tpm = phi_tpm*tpm{-1}+(1-phi_tpm)*(i_neutral+phi_pic*(picA{-1}-meta_pic)+phi_y_gap*y_gap)+eta_tpm;

   
 % tasa de interes real
 r = tpm - pic{-1};
   
 %brecha de la tasa de interes real
 r_gap = r - r_neutral;
   
 %log pib
 y=y_gap+y_pot;
   
 %log pib pot
 y_pot=y_pot{-1} + eta_y_pot; %+ 0.25*gA_pot 
   
 %inflacion anual
 picA=0.25*(pic+pic{-1}+pic{-2}+pic{-3});

Posteriormente, una vez hayamos generado esta estructura, es necesario definir el valor de los parámetros y correr los programas que resuelven el modelo. Usamos la función Model.fromFile Que carga la estructura del modelo, colocado anteriormente en un scipt de extensión “.model”. Note que posteriormente asignamos el valor de estimación a los parámetros del modelo para posteriormente resolver el estado estacionario del modelo.

%% Clear workspace
clear;
close all;
clc;
%#ok<*NOPTS>
 
%% Load model file and create model object
 
m = Model.fromFile("EcnCerrada.model");
 
%% Assign parameters
 
%brecha del producto
m.bet_1 = 0.5;  %persistencia de la brecha del producto
m.bet_2 = 0.05; %componente prospectivo, expectativas
m.bet_3 = 0.20; %elasticidad de la brecha de tasa, pendiente curba IS
 
%curva de Phillips
m.alp_1 = 0.4;       %inercia inflacionaria
m.alp_2 = (1-m.alp_1); %componente prospectivo, expectativas
m.alp_3 = 0.10;     %pendiente curva de Phillips. mas pequeno, menos sensible es la inflacion a la brecha
 
% Regla de Taylor
m.phi_tpm = 0.7; %persistencia tpm
m.phi_pic = 1.5; %a mayor, mayor es la respuesta de la polibica a la infalcion. parametro de taylor (tema: este se puede estimar)
m.phi_y_gap = 0.5; %brecha del producto

% parametros de largo plazo
m.meta_pic = 4; %meta de tasa
m.i_neutral = 6; %promedio de la tasa entre 2013-2019
m.r_neutral = m.i_neutral-m.meta_pic; %tasa de interes real de largo plazo
m.gA_pot = 5.1;
 
%% Compute steady state
% * Calculate (stationary) steady state for given parameters
% * Make sure it is a valid steady state
% * Print a steady state table
 
m = steady(m);
checkSteady(m);
 
%% Show a steady state table
 
table(m, ["steadyLevel", "description"])
 
%% Calculate first-order solution matrices
%
% Run `solve()` to calculate a first-order expansion of the model
% equations around the steady state, and finds a first-order
% rational-expectations solution. The solution matrices (state-space
% matrices) are stored within the model object; they are examined in
% <know_all_about_solution>. The availability of a first-order solution is
% indicated the model object is displayed.
 
m = solve(m)

Ahora se generan la estructura de data para simular choques y recuperar impulso respuesta.  Aquí asignamos valores a los choques (d2.eta_tpm(1:5) = 1;) para posteriormente ver la repuesta del sistema a esta perturbación. Finalmente estudiamos gráficamente la respuesta de 4 variables ('y_gap', 'r_gap', 'y', 'pic') a este tipo de perturbación. Observándose, como es natural que los choques mas persistente tienen a tener un efecto mayor en la evolución de las variables.


%% Find steady state
% * Create a steady-state database
% * Enter a productivity shock
% * Display the input time series for the shock on the screen
 
d0 = steadydb(m, 1:40)
d = d0;
d.eta_tpm(1) = 1;
disp(d.eta_tpm);
 
%% Choque en la tasa de politica monetaria
d1 = d;
d1 = sstatedb(m, 1:40);
d1.eta_tpm(1) = 1;
disp(d1.eta_tpm)

s1 = simulate(m, d1, 1:40); %simula impulso respuesta choque
 
%choque mas persistente.
% Parte de un escenario nuevo
d2 = d;
d2.eta_tpm(1:5) = 1;
s2 = simulate(m, d2, 1:40);
 
% Gráfico de la variable de interes
s = s1 & s2;
dbplot(s, 0:40, {'y_gap', 'r_gap', 'y', 'pic'}, 'Tight=', true);
 
le = visual.hlegend('bottom', 'No Persistente', 'Persistente');
title(le, 'Choque tpm'); 

Podemos generar el mismo choque, pero en un contexto de mayor persistencia de la inflación, por lo que, modificamos el valor del coeficiente asociado a la persistencia. AL hacer esta modificación en el nivel de persistencia, es importante tener en cuenta el valor de otros coeficientes. Primero clonamos el modelo anterior, modificamos los parámetros y luego pasados a identificar el estado estacionario y solución del modelo en un nuevo objeto. Finalmente, simulamos el choque sobre este nuevo objeto.

m1 = m;

m1.alp_1 = m.alp_1*1.2;
m1.alp_2 = (1-m1.alp_1);
m1 = steady(m1);
m1 = solve(m1)
d3 = sstatedb(m1, 1:40);
d3.eta_tpm(1) = 1;
s3 = simulate(m1, d3, 1:40);
 
% Gráfico de la variable de interes
s = s1 & s3;
dbplot(s, 0:40, {'y_gap', 'r_gap', 'y', 'pic'}, 'Tight=', true);
 
le = visual.hlegend('bottom', 'No Persistente', 'Persistente');
title(le, 'Choque tpm');
 
% Comparar estados
table( ...
    [m, m1], ["steadyLevel", "steadyChange", "form", "description"] ...
    , "writeTable", "steady.xlsx" ...
)

Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...