OccBin tools: rework codes
parent
2d90ef9890
commit
1b181fca57
|
@ -1,143 +1,169 @@
|
||||||
function [oo_, error_flag] = forecast(options_,M_,oo_,forecast) %,hist_period)
|
function [forecast, error_flag] = forecast(options_,M_,dr,endo_steady_state,exo_steady_state,exo_det_steady_state,forecast_horizon)
|
||||||
%function oo_ = forecast(options_,M_,oo_,forecast)
|
% [forecast, error_flag] = forecast(options_,M_,dr,endo_steady_state,exo_steady_state,exo_det_steady_state,forecast_horizon)
|
||||||
% forecast
|
% Occbin forecasts
|
||||||
|
%
|
||||||
|
% INPUTS
|
||||||
|
% - options_ [structure] Matlab's structure describing the current options
|
||||||
|
% - M_ [structure] Matlab's structure describing the model
|
||||||
|
% - dr_in [structure] model information structure
|
||||||
|
% - endo_steady_state [double] steady state value for endogenous variables
|
||||||
|
% - exo_steady_state [double] steady state value for exogenous variables
|
||||||
|
% - exo_det_steady_state [double] steady state value for exogenous deterministic variables
|
||||||
|
% - forecast_horizon [integer] forecast horizon
|
||||||
|
%
|
||||||
|
% OUTPUTS
|
||||||
|
% - forecast [structure] forecast results
|
||||||
|
% - error_flag [integer] error code
|
||||||
|
%
|
||||||
|
% SPECIAL REQUIREMENTS
|
||||||
|
% none.
|
||||||
|
|
||||||
|
% Copyright © 2022-2023 Dynare Team
|
||||||
|
%
|
||||||
|
% This file is part of Dynare.
|
||||||
|
%
|
||||||
|
% Dynare is free software: you can redistribute it and/or modify
|
||||||
|
% it under the terms of the GNU General Public License as published by
|
||||||
|
% the Free Software Foundation, either version 3 of the License, or
|
||||||
|
% (at your option) any later version.
|
||||||
|
%
|
||||||
|
% Dynare is distributed in the hope that it will be useful,
|
||||||
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
% GNU General Public License for more details.
|
||||||
|
%
|
||||||
|
% You should have received a copy of the GNU General Public License
|
||||||
|
% along with Dynare. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
opts = options_.occbin.forecast;
|
opts = options_.occbin.forecast;
|
||||||
|
|
||||||
options_.occbin.simul.maxit = opts.maxit;
|
options_.occbin.simul.maxit = opts.maxit;
|
||||||
options_.occbin.simul.check_ahead_periods = opts.check_ahead_periods;
|
options_.occbin.simul.check_ahead_periods = opts.check_ahead_periods;
|
||||||
options_.occbin.simul.periods = forecast;
|
options_.occbin.simul.periods = forecast_horizon;
|
||||||
SHOCKS0 = opts.SHOCKS0;
|
shocks_input = opts.SHOCKS0;
|
||||||
if ~isempty(SHOCKS0)
|
|
||||||
if iscell(SHOCKS0)
|
if ~isempty(shocks_input)
|
||||||
for j=1:length(SHOCKS0)
|
n_shocks=size(shocks_input,1);
|
||||||
sname = SHOCKS0{j}{1};
|
if iscell(shocks_input)
|
||||||
inds(j)=strmatch(sname,M_.exo_names);
|
inds=NaN(n_shocks,1);
|
||||||
SHOCKS1(j,:)=SHOCKS0{j}{2};
|
periods=length(shocks_input{1}{2});
|
||||||
|
shock_mat=NaN(n_shocks,periods);
|
||||||
|
for j=1:n_shocks
|
||||||
|
exo_pos=strmatch(shocks_input{j}{1},M_.exo_names,'exact');
|
||||||
|
if isempty(exo_pos)
|
||||||
|
error('occbin.forecast: unknown exogenous shock %s',shocks_input{j}{1})
|
||||||
|
else
|
||||||
|
inds(j)=exo_pos;
|
||||||
|
end
|
||||||
|
if length(shocks_input{j}{2})~=periods
|
||||||
|
error('occbin.forecast: unknown exogenous shock %s',shocks_input{j}{1})
|
||||||
|
else
|
||||||
|
shock_mat(j,:)=shocks_input{j}{2};
|
||||||
|
end
|
||||||
end
|
end
|
||||||
elseif isreal(SHOCKS0)
|
elseif isreal(shocks_input)
|
||||||
SHOCKS1=SHOCKS0;
|
shock_mat=shocks_input;
|
||||||
inds = 1:M_.exo_nbr;
|
inds = (1:M_.exo_nbr)';
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
options_.occbin.simul.endo_init = M_.endo_histval(:,1)-endo_steady_state; %initial condition
|
||||||
|
options_.occbin.simul.init_regime = opts.frcst_regimes;
|
||||||
|
options_.occbin.simul.init_binding_indicator = [];
|
||||||
|
|
||||||
|
shocks_base = zeros(forecast_horizon,M_.exo_nbr);
|
||||||
|
if ~isempty(shocks_input)
|
||||||
|
for j=1:n_shocks
|
||||||
|
shocks_base(:,inds(j))=shock_mat(j,:);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if opts.replic
|
if opts.replic
|
||||||
h = dyn_waitbar(0,'Please wait occbin forecast replic ...');
|
h = dyn_waitbar(0,'Please wait occbin forecast replic ...');
|
||||||
ishock = find(sqrt(diag((M_.Sigma_e))));
|
ishock = find(sqrt(diag((M_.Sigma_e))));
|
||||||
|
options_.occbin.simul.exo_pos=ishock;
|
||||||
effective_exo_nbr= length(ishock);
|
effective_exo_nbr= length(ishock);
|
||||||
effective_exo_names = M_.exo_names(ishock);
|
effective_Sigma_e = M_.Sigma_e(ishock,ishock); % does not take heteroskedastic shocks into account
|
||||||
effective_Sigma_e = M_.Sigma_e(ishock,ishock);
|
|
||||||
[U,S] = svd(effective_Sigma_e);
|
[U,S] = svd(effective_Sigma_e);
|
||||||
|
% draw random shocks
|
||||||
if opts.qmc
|
if opts.qmc
|
||||||
opts.replic =2^(round(log2(opts.replic+1)))-1;
|
opts.replic =2^(round(log2(opts.replic+1)))-1;
|
||||||
SHOCKS_ant = qmc_sequence(forecast*effective_exo_nbr, int64(1), 1, opts.replic)';
|
SHOCKS_add = qmc_sequence(forecast_horizon*effective_exo_nbr, int64(1), 1, opts.replic);
|
||||||
else
|
else
|
||||||
SHOCKS_ant = randn(forecast*effective_exo_nbr,opts.replic)';
|
SHOCKS_add = randn(forecast_horizon*effective_exo_nbr,opts.replic);
|
||||||
end
|
end
|
||||||
zlin0=zeros(forecast,M_.endo_nbr,opts.replic);
|
SHOCKS_add=reshape(SHOCKS_add,effective_exo_nbr,forecast_horizon,opts.replic);
|
||||||
zpiece0=zeros(forecast,M_.endo_nbr,opts.replic);
|
z.linear=NaN(forecast_horizon,M_.endo_nbr,opts.replic);
|
||||||
|
z.piecewise=NaN(forecast_horizon,M_.endo_nbr,opts.replic);
|
||||||
|
error_flag=true(opts.replic,1);
|
||||||
|
simul_SHOCKS=NaN(forecast_horizon,M_.exo_nbr,opts.replic);
|
||||||
for iter=1:opts.replic
|
for iter=1:opts.replic
|
||||||
|
options_.occbin.simul.SHOCKS = shocks_base+transpose(U*sqrt(S)*SHOCKS_add(:,:,iter));
|
||||||
if ~isempty(SHOCKS0)
|
|
||||||
for j=1:length(SHOCKS0)
|
|
||||||
SHOCKS(:,inds(j))=SHOCKS1(j,:);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
error_flagx=1;
|
|
||||||
% while error_flagx,
|
|
||||||
% SHOCKS=transpose(sqrt(diag(diag(effective_Sigma_e)))*(reshape(SHOCKS_ant(iter,:),forecast,effective_exo_nbr))');
|
|
||||||
SHOCKS=transpose(U*sqrt(S)*(reshape(SHOCKS_ant(iter,:),forecast,effective_exo_nbr))');
|
|
||||||
% SHOCKS=transpose(U*sqrt(S)*randn(forecast,M_.exo_nbr)'); %realized shocks
|
|
||||||
options_.occbin.simul.endo_init = M_.endo_histval(:,1)-oo_.steady_state;
|
|
||||||
options_.occbin.simul.init_regime = opts.frcst_regimes;
|
|
||||||
options_.occbin.simul.init_binding_indicator = [];
|
|
||||||
options_.occbin.simul.exo_pos=ishock;
|
|
||||||
options_.occbin.simul.SHOCKS = SHOCKS;
|
|
||||||
options_.occbin.simul.waitbar=0;
|
options_.occbin.simul.waitbar=0;
|
||||||
[~, out] = occbin.solver(M_,options_,oo_.dr,oo_.steady_state,oo_.exo_steady_state,oo_.exo_det_steady_state);
|
[~, out] = occbin.solver(M_,options_,dr,endo_steady_state,exo_steady_state,exo_det_steady_state);
|
||||||
zlin0(:,:,iter)=out.linear;
|
|
||||||
zpiece0(:,:,iter)=out.piecewise;
|
|
||||||
ys=out.ys;
|
|
||||||
frcst_regime_history(iter,:)=out.regime_history;
|
|
||||||
error_flag(iter)=out.error_flag;
|
error_flag(iter)=out.error_flag;
|
||||||
error_flagx = error_flag(iter);
|
if ~error_flag(iter)
|
||||||
% end
|
z.linear(:,:,iter)=out.linear;
|
||||||
simul_SHOCKS(:,:,iter) = SHOCKS;
|
z.piecewise(:,:,iter)=out.piecewise;
|
||||||
|
frcst_regime_history(iter,:)=out.regime_history;
|
||||||
if error_flag(iter) && debug_flag
|
error_flag(iter)=out.error_flag;
|
||||||
% display('no solution')
|
simul_SHOCKS(:,:,iter) = shocks_base;
|
||||||
|
else
|
||||||
% keyboard;
|
if options_.debug
|
||||||
save no_solution SHOCKS zlin0 zpiece0 iter frcst_regime_history
|
save('Occbin_forecast_debug','simul_SHOCKS','z','iter','frcst_regime_history','error_flag','out','shocks_base')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
dyn_waitbar(iter/opts.replic,h,['OccBin MC forecast replic ',int2str(iter),'/',int2str(opts.replic)])
|
dyn_waitbar(iter/opts.replic,h,['OccBin MC forecast replic ',int2str(iter),'/',int2str(opts.replic)])
|
||||||
end
|
end
|
||||||
dyn_waitbar_close(h);
|
dyn_waitbar_close(h);
|
||||||
save temp zlin0 zpiece0 simul_SHOCKS error_flag
|
if options_.debug
|
||||||
|
save('Occbin_forecast_debug','simul_SHOCKS','z','iter','frcst_regime_history','error_flag')
|
||||||
|
end
|
||||||
inx=find(error_flag==0);
|
inx=find(error_flag==0);
|
||||||
zlin0=zlin0(:,:,inx);
|
z.linear=z.linear(:,:,inx);
|
||||||
zpiece0=zpiece0(:,:,inx);
|
z.piecewise=z.piecewise(:,:,inx);
|
||||||
zlin = mean(zlin0,3);
|
z.min.piecewise = min(z.piecewise,[],3);
|
||||||
zpiece = mean(zpiece0,3);
|
z.max.piecewise = max(z.piecewise,[],3);
|
||||||
zpiecemin = min(zpiece0,[],3);
|
z.min.linear = min(z.linear,[],3);
|
||||||
zpiecemax = max(zpiece0,[],3);
|
z.max.linear = max(z.linear,[],3);
|
||||||
zlinmin = min(zlin0,[],3);
|
|
||||||
zlinmax = max(zlin0,[],3);
|
field_names={'linear','piecewise'};
|
||||||
|
post_mean=NaN(forecast_horizon,1);
|
||||||
for i=1:M_.endo_nbr
|
post_median=NaN(forecast_horizon,1);
|
||||||
for j=1:forecast
|
post_var=NaN(forecast_horizon,1);
|
||||||
[post_mean(j,1), post_median(j,1), post_var(j,1), hpd_interval(j,:), post_deciles(j,:)] = posterior_moments(squeeze(zlin0(j,i,:)),options_.forecasts.conf_sig);
|
hpd_interval=NaN(forecast_horizon,2);
|
||||||
|
post_deciles=NaN(forecast_horizon,9);
|
||||||
|
for field_iter=1:2
|
||||||
|
for i=1:M_.endo_nbr
|
||||||
|
for j=1:forecast_horizon
|
||||||
|
[post_mean(j,1), post_median(j,1), post_var(j,1), hpd_interval(j,:), post_deciles(j,:)] = posterior_moments(squeeze(z.(field_names{field_iter})(j,i,:)),options_.forecasts.conf_sig);
|
||||||
|
end
|
||||||
|
forecast.(field_names{field_iter}).Mean.(M_.endo_names{i})=post_mean;
|
||||||
|
forecast.(field_names{field_iter}).Median.(M_.endo_names{i})=post_median;
|
||||||
|
forecast.(field_names{field_iter}).Var.(M_.endo_names{i})=post_var;
|
||||||
|
forecast.(field_names{field_iter}).HPDinf.(M_.endo_names{i})=hpd_interval(:,1);
|
||||||
|
forecast.(field_names{field_iter}).HPDsup.(M_.endo_names{i})=hpd_interval(:,2);
|
||||||
|
forecast.(field_names{field_iter}).Deciles.(M_.endo_names{i})=post_deciles;
|
||||||
|
forecast.(field_names{field_iter}).Min.(M_.endo_names{i})=z.min.(field_names{field_iter})(:,i);
|
||||||
|
forecast.(field_names{field_iter}).Max.(M_.endo_names{i})=z.max.(field_names{field_iter})(:,i);
|
||||||
end
|
end
|
||||||
oo_.occbin.linear_forecast.Mean.(M_.endo_names{i})=post_mean;
|
|
||||||
oo_.occbin.linear_forecast.Median.(M_.endo_names{i})=post_median;
|
|
||||||
oo_.occbin.linear_forecast.Var.(M_.endo_names{i})=post_var;
|
|
||||||
oo_.occbin.linear_forecast.HPDinf.(M_.endo_names{i})=hpd_interval(:,1);
|
|
||||||
oo_.occbin.linear_forecast.HPDsup.(M_.endo_names{i})=hpd_interval(:,2);
|
|
||||||
oo_.occbin.linear_forecast.Deciles.(M_.endo_names{i})=post_deciles;
|
|
||||||
oo_.occbin.linear_forecast.Min.(M_.endo_names{i})=zlinmin(:,i);
|
|
||||||
oo_.occbin.linear_forecast.Max.(M_.endo_names{i})=zlinmax(:,i);
|
|
||||||
for j=1:forecast
|
|
||||||
[post_mean(j,1), post_median(j,1), post_var(j,1), hpd_interval(j,:), post_deciles(j,:)] = posterior_moments(squeeze(zpiece0(j,i,:)),options_.forecasts.conf_sig);
|
|
||||||
end
|
|
||||||
oo_.occbin.forecast.Mean.(M_.endo_names{i})=post_mean;
|
|
||||||
oo_.occbin.forecast.Median.(M_.endo_names{i})=post_median;
|
|
||||||
oo_.occbin.forecast.Var.(M_.endo_names{i})=post_var;
|
|
||||||
oo_.occbin.forecast.HPDinf.(M_.endo_names{i})=hpd_interval(:,1);
|
|
||||||
oo_.occbin.forecast.HPDsup.(M_.endo_names{i})=hpd_interval(:,2);
|
|
||||||
oo_.occbin.forecast.Deciles.(M_.endo_names{i})=post_deciles;
|
|
||||||
oo_.occbin.forecast.Min.(M_.endo_names{i})=zpiecemin(:,i);
|
|
||||||
oo_.occbin.forecast.Max.(M_.endo_names{i})=zpiecemax(:,i);
|
|
||||||
% eval([M_.endo_names{i},'_ss=zdatass(i);']);
|
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
SHOCKS = zeros(forecast,M_.exo_nbr);
|
|
||||||
if ~isempty(SHOCKS0)
|
|
||||||
for j=1:length(SHOCKS0)
|
|
||||||
SHOCKS(:,inds(j))=SHOCKS1(j,:);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
options_.occbin.simul.endo_init = M_.endo_histval(:,1)-oo_.steady_state;
|
|
||||||
options_.occbin.simul.init_regime = opts.frcst_regimes;
|
|
||||||
options_.occbin.simul.init_violvecbool = [];
|
|
||||||
options_.occbin.simul.irfshock = M_.exo_names;
|
options_.occbin.simul.irfshock = M_.exo_names;
|
||||||
options_.occbin.simul.SHOCKS = SHOCKS;
|
options_.occbin.simul.SHOCKS = shocks_base;
|
||||||
[~, out] = occbin.solver(M_,options_,oo_.dr,oo_.steady_state,oo_.exo_steady_state,oo_.exo_det_steady_state);
|
[~, out] = occbin.solver(M_,options_,dr,endo_steady_state,exo_steady_state,exo_det_steady_state);
|
||||||
|
error_flag=out.error_flag;
|
||||||
|
if out.error_flag
|
||||||
|
fprintf('occbin.forecast: forecast simulation failed.')
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
|
||||||
zlin=out.linear;
|
|
||||||
zpiece=out.piecewise;
|
|
||||||
frcst_regime_history=out.regime_history;
|
frcst_regime_history=out.regime_history;
|
||||||
error_flag=out.error_flag;
|
error_flag=out.error_flag;
|
||||||
for i=1:M_.endo_nbr
|
for i=1:M_.endo_nbr
|
||||||
oo_.occbin.linear_forecast.Mean.(M_.endo_names{i})= zlin(:,i);
|
forecast.linear.Mean.(M_.endo_names{i})= out.linear(:,i);
|
||||||
oo_.occbin.forecast.Mean.(M_.endo_names{i})= zpiece(:,i);
|
forecast.piecewise.Mean.(M_.endo_names{i})= out.piecewise(:,i);
|
||||||
oo_.occbin.forecast.HPDinf.(M_.endo_names{i})= nan;
|
|
||||||
oo_.occbin.forecast.HPDsup.(M_.endo_names{i})= nan;
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
oo_.occbin.forecast.regimes=frcst_regime_history;
|
forecast.regimes=frcst_regime_history;
|
||||||
|
|
|
@ -1,140 +1,124 @@
|
||||||
function [oo_] = irf(M_,oo_,options_)
|
function irfs = irf(M_,oo_,options_)
|
||||||
|
% irfs = irf(M_,oo_,options_)
|
||||||
|
% Calls a minimizer
|
||||||
|
%
|
||||||
|
% INPUTS
|
||||||
|
% - M_ [structure] Matlab's structure describing the model
|
||||||
|
% - oo_ [structure] Matlab's structure containing the results
|
||||||
|
% - options_ [structure] Matlab's structure describing the current options
|
||||||
|
%
|
||||||
|
% OUTPUTS
|
||||||
|
% - irfs [structure] IRF results
|
||||||
|
%
|
||||||
|
% SPECIAL REQUIREMENTS
|
||||||
|
% none.
|
||||||
|
%
|
||||||
|
%
|
||||||
|
% Copyright © 2022-2023 Dynare Team
|
||||||
|
%
|
||||||
|
% This file is part of Dynare.
|
||||||
|
%
|
||||||
|
% Dynare is free software: you can redistribute it and/or modify
|
||||||
|
% it under the terms of the GNU General Public License as published by
|
||||||
|
% the Free Software Foundation, either version 3 of the License, or
|
||||||
|
% (at your option) any later version.
|
||||||
|
%
|
||||||
|
% Dynare is distributed in the hope that it will be useful,
|
||||||
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
% GNU General Public License for more details.
|
||||||
|
%
|
||||||
|
% You should have received a copy of the GNU General Public License
|
||||||
|
% along with Dynare. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
shocknames = options_.occbin.irf.exo_names;
|
shocknames = options_.occbin.irf.exo_names;
|
||||||
shocksigns = options_.occbin.irf.shocksigns;
|
shocksigns = options_.occbin.irf.shocksigns; %'pos','neg'
|
||||||
shocksize = options_.occbin.irf.shocksize;
|
shocksize = options_.occbin.irf.shocksize;
|
||||||
t0 = options_.occbin.irf.t0;
|
t_0 = options_.occbin.irf.t0;
|
||||||
|
|
||||||
|
%% set simulation options based on IRF options
|
||||||
options_.occbin.simul.init_regime = options_.occbin.irf.init_regime;
|
options_.occbin.simul.init_regime = options_.occbin.irf.init_regime;
|
||||||
options_.occbin.simul.check_ahead_periods = options_.occbin.irf.check_ahead_periods;
|
options_.occbin.simul.check_ahead_periods = options_.occbin.irf.check_ahead_periods;
|
||||||
options_.occbin.simul.maxit = options_.occbin.irf.maxit;
|
options_.occbin.simul.maxit = options_.occbin.irf.maxit;
|
||||||
options_.occbin.simul.periods = options_.irf;
|
options_.occbin.simul.periods = options_.irf;
|
||||||
|
|
||||||
% Run inital conditions + other shocks
|
%% Run initial conditions + other shocks
|
||||||
if t0 == 0
|
if t_0 == 0
|
||||||
shocks0= zeros(options_.occbin.simul.periods+1,M_.exo_nbr);
|
shocks_base = zeros(options_.occbin.simul.periods+1,M_.exo_nbr);
|
||||||
options_.occbin.simul.endo_init = [];
|
options_.occbin.simul.endo_init = [];
|
||||||
else
|
else
|
||||||
% girf conditional to smoothed states in t0 and shocks in t0+1
|
if ~isfield(oo_.occbin,'smoother')
|
||||||
shocks0= [oo_.occbin.smoother.etahat(:,t0+1)'; zeros(options_.occbin.simul.periods,M_.exo_nbr)];
|
error('occbin.irfs: smoother must be run before requesting GIRFs based on smoothed results')
|
||||||
options_.occbin.simul.SHOCKS=shocks0;
|
end
|
||||||
options_.occbin.simul.endo_init = oo_.occbin.smoother.alphahat(oo_.dr.inv_order_var,t0);
|
% GIRF conditional on smoothed states in t_0 and shocks in t_0+1
|
||||||
|
shocks_base= [oo_.occbin.smoother.etahat(:,t_0+1)'; zeros(options_.occbin.simul.periods,M_.exo_nbr)];
|
||||||
|
options_.occbin.simul.SHOCKS=shocks_base;
|
||||||
|
options_.occbin.simul.endo_init = oo_.occbin.smoother.alphahat(oo_.dr.inv_order_var,t_0);
|
||||||
end
|
end
|
||||||
options_.occbin.simul.SHOCKS=shocks0;
|
options_.occbin.simul.SHOCKS=shocks_base;
|
||||||
[~, out0] = occbin.solver(M_,options_,oo_.dr,oo_.steady_state,oo_.exo_steady_state,oo_.exo_det_steady_state);
|
|
||||||
zlin0 = out0.linear;
|
|
||||||
zpiece0 = out0.piecewise;
|
|
||||||
|
|
||||||
% Select shocks of interest
|
[~, out_base] = occbin.solver(M_,options_,oo_.dr,oo_.steady_state,oo_.exo_steady_state,oo_.exo_det_steady_state);
|
||||||
jexo_all =zeros(size(shocknames,1),1);
|
if out_base.error_flag
|
||||||
|
error('occbin.irfs: could not compute the solution')
|
||||||
|
end
|
||||||
|
|
||||||
|
irfs.linear = struct();
|
||||||
|
irfs.piecewise = struct();
|
||||||
|
|
||||||
|
% Get indices of shocks of interest
|
||||||
|
exo_index =zeros(size(shocknames,1),1);
|
||||||
for i=1:length(shocknames)
|
for i=1:length(shocknames)
|
||||||
jexo_all(i) = strmatch(shocknames{i},M_.exo_names,'exact');
|
exo_index(i) = strmatch(shocknames{i},M_.exo_names,'exact');
|
||||||
end
|
end
|
||||||
|
|
||||||
oo_.occbin.linear_irfs = struct();
|
% cs=get_lower_cholesky_covariance(M_.Sigma_e,options_.add_tiny_number_to_cholesky);
|
||||||
oo_.occbin.irfs = struct();
|
% irf_shocks_indx = getIrfShocksIndx(M_, options_);
|
||||||
|
|
||||||
% Set shock size
|
% Set shock size
|
||||||
if isempty(shocksize)
|
if isempty(shocksize)
|
||||||
% if isfield(oo_.posterior_mode.shocks_std,M_.exo_names{jexo})
|
shocksize = sqrt(diag(M_.Sigma_e(exo_index,exo_index)));
|
||||||
shocksize = sqrt(diag(M_.Sigma_e(jexo_all,jexo_all))); %oo_.posterior_mode.shocks_std.(M_.exo_names{jexo});
|
|
||||||
if any(shocksize < 1.e-9)
|
if any(shocksize < 1.e-9)
|
||||||
shocksize(shocksize < 1.e-9) = 0.01;
|
shocksize(shocksize < 1.e-9) = 0.01;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if numel(shocksize)==1
|
if numel(shocksize)==1
|
||||||
shocksize=repmat(shocksize,[length(shocknames),1]);
|
shocksize=repmat(shocksize,[length(shocknames),1]);
|
||||||
end
|
end
|
||||||
|
|
||||||
% Run IRFs
|
% Run IRFs
|
||||||
for counter = 1:length(jexo_all)
|
for sign_iter=1:length(shocksigns)
|
||||||
|
for IRF_counter = 1:length(exo_index)
|
||||||
jexo = jexo_all(counter);
|
jexo = exo_index(IRF_counter);
|
||||||
|
if ~options_.noprint && options_.debug
|
||||||
if ~options_.noprint
|
fprintf('occbin.irf: Producing GIRFs for shock %s. Simulation %d out of %d. \n',M_.exo_names{jexo},IRF_counter,size(exo_index,1));
|
||||||
fprintf('Producing GIRFs for shock %s. Simulation %d out of %d. \n',M_.exo_names{jexo},counter,size(jexo_all,1));
|
end
|
||||||
end
|
shocks1=shocks_base;
|
||||||
|
if ismember('pos',shocksigns{sign_iter})
|
||||||
if ismember('pos',shocksigns)
|
shocks1(1,jexo)=shocks_base(1,jexo)+shocksize(IRF_counter);
|
||||||
% (+) shock
|
elseif ismember('neg',shocksigns{sign_iter})
|
||||||
shocks1=shocks0;
|
shocks1(1,jexo)=shocks_base(1,jexo)-shocksize(IRF_counter);
|
||||||
shocks1(1,jexo)=shocks0(1,jexo)+shocksize(counter);
|
end
|
||||||
if t0 == 0
|
options_.occbin.simul.SHOCKS=shocks1;
|
||||||
options_.occbin.simul.SHOCKS=shocks1;
|
if t_0 == 0
|
||||||
options_.occbin.simul.endo_init = [];
|
options_.occbin.simul.endo_init = [];
|
||||||
[~, out_pos] = occbin.solver(M_,options_,oo_.dr,oo_.steady_state,oo_.exo_steady_state,oo_.exo_det_steady_state);
|
|
||||||
else
|
else
|
||||||
options_.occbin.simul.SHOCKS=shocks1;
|
options_.occbin.simul.endo_init = oo_.occbin.smoother.alphahat(oo_.dr.inv_order_var,t_0);
|
||||||
options_.occbin.simul.endo_init = oo_.occbin.smoother.alphahat(oo_.dr.inv_order_var,t0);
|
|
||||||
[~, out_pos] = occbin.solver(M_,options_,oo_.dr,oo_.steady_state,oo_.exo_steady_state,oo_.exo_det_steady_state);
|
|
||||||
end
|
end
|
||||||
if out_pos.error_flag
|
[~, out_sim] = occbin.solver(M_,options_,oo_.dr,oo_.steady_state,oo_.exo_steady_state,oo_.exo_det_steady_state);
|
||||||
warning('Occbin error.')
|
if out_sim.error_flag
|
||||||
return
|
warning('occbin.irfs: simulation failed')
|
||||||
|
skip
|
||||||
end
|
end
|
||||||
zlin_pos = out_pos.linear;
|
|
||||||
zpiece_pos = out_pos.piecewise;
|
|
||||||
% Substract inital conditions + other shocks
|
% Substract inital conditions + other shocks
|
||||||
zlin_pos_diff = zlin_pos-zlin0;
|
zdiff.linear.(shocksigns{sign_iter}) = out_sim.linear-out_base.linear;
|
||||||
zpiece_pos_diff = zpiece_pos-zpiece0;
|
zdiff.piecewise.(shocksigns{sign_iter}) = out_sim.piecewise-out_base.piecewise;
|
||||||
end
|
|
||||||
|
for j_endo=1:M_.endo_nbr
|
||||||
if ismember('neg',shocksigns)
|
if ismember('pos',shocksigns)
|
||||||
% (-) shock
|
irfs.piecewise.([M_.endo_names{j_endo} '_' M_.exo_names{jexo} '_' shocksigns{sign_iter}]) = zdiff.piecewise.(shocksigns{sign_iter})(:,j_endo);
|
||||||
shocks_1=shocks0;
|
irfs.linear.([M_.endo_names{j_endo} '_' M_.exo_names{jexo} '_' shocksigns{sign_iter}]) = zdiff.linear.(shocksigns{sign_iter})(:,j_endo);
|
||||||
shocks_1(1,jexo)=shocks0(1,jexo)-shocksize(counter);
|
end
|
||||||
if t0 == 0
|
|
||||||
options_.occbin.simul.SHOCKS=shocks_1;
|
|
||||||
options_.occbin.simul.endo_init = [];
|
|
||||||
[~, out_neg] = occbin.solver(M_,options_,oo_.dr,oo_.steady_state,oo_.exo_steady_state,oo_.exo_det_steady_state);
|
|
||||||
else
|
|
||||||
options_.occbin.simul.SHOCKS=shocks_1;
|
|
||||||
options_.occbin.simul.endo_init = oo_.occbin.smoother.alphahat(oo_.dr.inv_order_var,t0);
|
|
||||||
[~, out_neg] = occbin.solver(M_,options_,oo_.dr,oo_.steady_state,oo_.exo_steady_state,oo_.exo_det_steady_state);
|
|
||||||
end
|
end
|
||||||
if out_neg.error_flag
|
|
||||||
warning('Occbin error.')
|
|
||||||
return
|
|
||||||
end
|
|
||||||
zlin_neg = out_neg.linear;
|
|
||||||
zpiece_neg = out_neg.piecewise;
|
|
||||||
zlin_neg_diff = zlin_neg-zlin0;
|
|
||||||
zpiece_neg_diff = zpiece_neg-zpiece0;
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
% Save
|
|
||||||
if ~isfield(oo_.occbin,'linear_irfs')
|
|
||||||
oo_.occbin.linear_irfs = struct();
|
|
||||||
end
|
|
||||||
if ~isfield(oo_.occbin,'irfs')
|
|
||||||
oo_.occbin.irfs = struct();
|
|
||||||
end
|
|
||||||
|
|
||||||
for jendo=1:M_.endo_nbr
|
|
||||||
% oo_.occbin.irfs.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '1']) = zpiece_pos (:,jendo);
|
|
||||||
% oo_.occbin.irfs.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '_1']) = zpiece_neg (:,jendo);
|
|
||||||
% oo_.occbin.linear_irfs.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '1']) = zlin_pos (:,jendo);
|
|
||||||
% oo_.occbin.linear_irfs.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '_1']) = zlin_neg(:,jendo);
|
|
||||||
|
|
||||||
if ismember('pos',shocksigns)
|
|
||||||
oo_.occbin.irfs.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '_pos']) = zpiece_pos_diff (:,jendo);
|
|
||||||
oo_.occbin.linear_irfs.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '_pos']) = zlin_pos_diff (:,jendo);
|
|
||||||
end
|
|
||||||
|
|
||||||
if ismember('neg',shocksigns)
|
|
||||||
oo_.occbin.irfs.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '_neg']) = zpiece_neg_diff (:,jendo);
|
|
||||||
oo_.occbin.linear_irfs.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '_neg']) = zlin_neg_diff (:,jendo);
|
|
||||||
end
|
|
||||||
|
|
||||||
% %
|
|
||||||
% oo_.occbin.irfs0.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '1']) = zpiece0(:,jendo);
|
|
||||||
% oo_.occbin.linear_irfs0.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '1']) = zlin0(:,jendo);
|
|
||||||
% oo_.occbin.irfs0.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '_1']) = zpiece0(:,jendo);
|
|
||||||
% oo_.occbin.linear_irfs0.([M_.endo_names{jendo} '_' M_.exo_names{jexo} '_1']) = zlin0(:,jendo);
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,34 +1,74 @@
|
||||||
function plot_irfs(M_,oo_,options_,irf3,irf4)
|
function plot_irfs(M_,irfs,options_,var_list)
|
||||||
|
% plot_irfs(M_,irfs,options_,var_list)
|
||||||
|
%
|
||||||
|
% INPUTS
|
||||||
|
% - M_ [structure] Matlab's structure describing the model
|
||||||
|
% - irfs [structure] IRF results
|
||||||
|
% - options_ [structure] Matlab's structure describing the current options
|
||||||
|
% - var_list [character array] list of endogenous variables specified
|
||||||
|
%
|
||||||
|
% OUTPUTS
|
||||||
|
% none
|
||||||
|
%
|
||||||
|
% SPECIAL REQUIREMENTS
|
||||||
|
% none.
|
||||||
|
|
||||||
shocknames = options_.occbin.plot_irf.exo_names;
|
% Copyright © 2022-2023 Dynare Team
|
||||||
simulname = options_.occbin.plot_irf.simulname;
|
%
|
||||||
if isempty(simulname)
|
% This file is part of Dynare.
|
||||||
simulname_ = simulname;
|
%
|
||||||
else
|
% Dynare is free software: you can redistribute it and/or modify
|
||||||
simulname_ = [ simulname '_' ];
|
% it under the terms of the GNU General Public License as published by
|
||||||
|
% the Free Software Foundation, either version 3 of the License, or
|
||||||
|
% (at your option) any later version.
|
||||||
|
%
|
||||||
|
% Dynare is distributed in the hope that it will be useful,
|
||||||
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
% GNU General Public License for more details.
|
||||||
|
%
|
||||||
|
% You should have received a copy of the GNU General Public License
|
||||||
|
% along with Dynare. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
if (isfield(options_,'irf_shocks')==0)
|
||||||
|
shock_names = M_.exo_names;
|
||||||
|
else
|
||||||
|
shock_names = options_.irf_shocks;
|
||||||
end
|
end
|
||||||
vars_irf = options_.occbin.plot_irf.endo_names;
|
|
||||||
endo_names_long = options_.occbin.plot_irf.endo_names_long;
|
simul_name = options_.occbin.plot_irf.simulname;
|
||||||
|
if isempty(simul_name)
|
||||||
|
save_name = simul_name;
|
||||||
|
else
|
||||||
|
save_name = [ simul_name '_' ];
|
||||||
|
end
|
||||||
|
|
||||||
|
if isempty(var_list)
|
||||||
|
var_list = M_.endo_names(1:M_.orig_endo_nbr);
|
||||||
|
end
|
||||||
|
|
||||||
|
[i_var, ~, index_uniques] = varlist_indices(var_list, M_.endo_names);
|
||||||
|
vars_irf=var_list(index_uniques);
|
||||||
|
|
||||||
endo_scaling_factor = options_.occbin.plot_irf.endo_scaling_factor;
|
endo_scaling_factor = options_.occbin.plot_irf.endo_scaling_factor;
|
||||||
length_irf = options_.occbin.plot_irf.tplot;
|
length_irf = options_.irf;
|
||||||
if isempty(length_irf)
|
|
||||||
length_irf = options_.irf;
|
|
||||||
end
|
|
||||||
|
|
||||||
irflocation_lin = oo_.occbin.linear_irfs;
|
steps_irf = 1;
|
||||||
irflocation_piece = oo_.occbin.irfs;
|
|
||||||
|
|
||||||
|
|
||||||
steps_irf = 1;
|
|
||||||
warning('off','all')
|
|
||||||
|
|
||||||
DirectoryName = CheckPath('graphs',M_.dname);
|
DirectoryName = CheckPath('graphs',M_.dname);
|
||||||
|
latexFolder = CheckPath('latex',M_.dname);
|
||||||
|
if options_.TeX && any(strcmp('eps',cellstr(options_.graph_format)))
|
||||||
|
fidTeX = fopen([latexFolder '/' M_.fname '_occbin_irfs.tex'],'w');
|
||||||
|
fprintf(fidTeX,'%% TeX eps-loader file generated by occbin.plot_irfs.m (Dynare).\n');
|
||||||
|
fprintf(fidTeX,['%% ' datestr(now,0) '\n']);
|
||||||
|
fprintf(fidTeX,' \n');
|
||||||
|
end
|
||||||
|
|
||||||
iexo=[];
|
iexo=[];
|
||||||
for i=1:size(shocknames,1)
|
for var_iter=1:size(shock_names,1)
|
||||||
itemp = strmatch(shocknames{i},M_.exo_names,'exact');
|
itemp = strmatch(shock_names{var_iter},M_.exo_names,'exact');
|
||||||
if isempty(itemp)
|
if isempty(itemp)
|
||||||
error(['Shock ',shocknames{i},' is not defined!'])
|
error(['Shock ',shock_names{var_iter},' is not defined!'])
|
||||||
else
|
else
|
||||||
iexo=[iexo, itemp];
|
iexo=[iexo, itemp];
|
||||||
end
|
end
|
||||||
|
@ -38,104 +78,102 @@ ncols = options_.occbin.plot_irf.ncols;
|
||||||
nrows = options_.occbin.plot_irf.nrows;
|
nrows = options_.occbin.plot_irf.nrows;
|
||||||
npan = ncols*nrows;
|
npan = ncols*nrows;
|
||||||
|
|
||||||
plot_grid = options_.occbin.plot_irf.grid;
|
shocksigns = options_.occbin.plot_irf.shocksigns;
|
||||||
shocksigns = options_.occbin.plot_irf.shocksigns;
|
threshold = options_.impulse_responses.plot_threshold;
|
||||||
threshold = options_.occbin.plot_irf.threshold;
|
|
||||||
|
|
||||||
% Add steady_state
|
|
||||||
if options_.occbin.plot_irf.add_steadystate
|
|
||||||
add_stst = options_.occbin.plot_irf.add_steadystate;
|
|
||||||
else
|
|
||||||
add_stst = 0;
|
|
||||||
end
|
|
||||||
for sss = 1:numel(shocksigns)
|
|
||||||
|
|
||||||
shocksign = shocksigns{sss};
|
|
||||||
|
|
||||||
for j=1:size(shocknames,1)
|
|
||||||
%shocknames = M_.exo_names{j};
|
|
||||||
|
|
||||||
|
for shock_sign_iter = 1:numel(shocksigns)
|
||||||
|
shocksign = shocksigns{shock_sign_iter};
|
||||||
|
if strcmp(shocksign,'pos')
|
||||||
|
plot_title_sign='positive';
|
||||||
|
elseif strcmp(shocksign,'neg')
|
||||||
|
plot_title_sign='negative';
|
||||||
|
else
|
||||||
|
error('Unknown shock sign %s',shocksign);
|
||||||
|
end
|
||||||
|
|
||||||
|
for shock_iter=1:size(shock_names,1)
|
||||||
j1 = 0;
|
j1 = 0;
|
||||||
isub = 0;
|
isub = 0;
|
||||||
ifig = 0;
|
ifig = 0;
|
||||||
|
|
||||||
% Variables
|
% Variables
|
||||||
% ----------------------
|
for var_iter = 1:length(vars_irf)
|
||||||
for i = 1:length(vars_irf)
|
|
||||||
|
|
||||||
j1=j1+1;
|
j1=j1+1;
|
||||||
if mod(j1,npan)==1
|
if mod(j1,npan)==1
|
||||||
% vector corresponds to [left bottom width height]. 680 and 678 for the left and bottom elements correspond to the default values used by MATLAB while creating a figure and width, .
|
% vector corresponds to [left bottom width height]. 680 and 678 for the left and bottom elements correspond to the default values used by MATLAB while creating a figure and width, .
|
||||||
hfig = dyn_figure(options_.nodisplay,'name',['OccbinIRFs ' shocknames{j} ' ' simulname ' ' shocksign],'PaperPositionMode', 'auto','PaperType','A4','PaperOrientation','portrait','renderermode','auto','position',[10 10 950 650]);
|
screensize = get( groot, 'Screensize' );
|
||||||
|
hfig = dyn_figure(options_.nodisplay,'name',['OccBin IRFs to ' plot_title_sign ' ' shock_names{shock_iter} ' shock ' simul_name],'OuterPosition' ,[50 50 min(1000,screensize(3)-50) min(750,screensize(4)-50)]);
|
||||||
ifig=ifig+1;
|
ifig=ifig+1;
|
||||||
isub=0;
|
isub=0;
|
||||||
end
|
end
|
||||||
isub=isub+1;
|
isub=isub+1;
|
||||||
|
|
||||||
if isempty(endo_scaling_factor)
|
if isempty(endo_scaling_factor)
|
||||||
exofactor = 1;
|
exofactor = 1;
|
||||||
else
|
|
||||||
exofactor = endo_scaling_factor{i};
|
|
||||||
end
|
|
||||||
|
|
||||||
subplot(nrows,ncols,isub)
|
|
||||||
irf_field = strcat(vars_irf{i,1},'_',shocknames{j},'_',shocksign);
|
|
||||||
|
|
||||||
irfvalues = irflocation_lin.(irf_field);
|
|
||||||
if add_stst
|
|
||||||
irfvalues = irfvalues + get_mean(vars_irf{i,1});
|
|
||||||
end
|
|
||||||
|
|
||||||
irfvalues(abs(irfvalues) <threshold) = 0;
|
|
||||||
|
|
||||||
plot(irfvalues(1:steps_irf:length_irf)*exofactor,'linewidth',2);
|
|
||||||
hold on
|
|
||||||
|
|
||||||
irfvalues = irflocation_piece.(irf_field);
|
|
||||||
if add_stst
|
|
||||||
irfvalues = irfvalues + get_mean(vars_irf{i,1});
|
|
||||||
end
|
|
||||||
irfvalues(abs(irfvalues) <threshold) = 0;
|
|
||||||
plot(irfvalues(1:steps_irf:length_irf)*exofactor,'r--','linewidth',2);
|
|
||||||
|
|
||||||
hold on
|
|
||||||
plot(irfvalues(1:steps_irf:length_irf)*0,'k-','linewidth',1.5);
|
|
||||||
% Optional additional IRFs
|
|
||||||
if nargin > 10
|
|
||||||
irfvalues = irf3.(irf_field) ;
|
|
||||||
irfvalues(abs(irfvalues) <threshold) = 0;
|
|
||||||
plot(irfvalues(1:steps_irf:length_irf)*exofactor,'k:','linewidth',2);
|
|
||||||
end
|
|
||||||
if nargin > 11
|
|
||||||
irfvalues = irf4.(irf_field) ;
|
|
||||||
irfvalues(abs(irfvalues) <threshold) = 0;
|
|
||||||
plot(irfvalues(1:steps_irf:length_irf)*exofactor,'g-.','linewidth',2);
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
if plot_grid
|
|
||||||
grid on
|
|
||||||
end
|
|
||||||
|
|
||||||
xlim([1 (length_irf/steps_irf)]);
|
|
||||||
|
|
||||||
% title
|
|
||||||
if isempty(endo_names_long)
|
|
||||||
title(regexprep(vars_irf{i},'_',' '))
|
|
||||||
else
|
else
|
||||||
title(endo_names_long{i})
|
exofactor = endo_scaling_factor{var_iter};
|
||||||
end
|
end
|
||||||
|
|
||||||
|
subplot(nrows,ncols,isub)
|
||||||
|
irf_field = strcat(vars_irf{var_iter},'_',shock_names{shock_iter},'_',shocksign);
|
||||||
|
|
||||||
|
%%linear IRFs
|
||||||
|
if ~isfield(irfs.linear,irf_field)
|
||||||
|
warning('occbin.plot_irfs: no linear IRF for %s to %s detected',vars_irf{var_iter,1},shock_names{shock_iter})
|
||||||
|
else
|
||||||
|
irfvalues = irfs.linear.(irf_field);
|
||||||
|
irfvalues(abs(irfvalues) <threshold) = 0;
|
||||||
|
if options_.occbin.plot_irf.add_steadystate
|
||||||
|
irfvalues = irfvalues + get_mean(vars_irf{var_iter,1});
|
||||||
|
end
|
||||||
|
max_irf_length_1=min(length_irf,length(irfvalues));
|
||||||
|
plot(irfvalues(1:steps_irf:max_irf_length_1)*exofactor,'linewidth',2);
|
||||||
|
end
|
||||||
|
hold on
|
||||||
|
|
||||||
|
if ~isfield(irfs.piecewise,irf_field)
|
||||||
|
warning('occbin.plot_irfs: no piecewise linear IRF for %s to %s detected',vars_irf{var_iter,1},shock_names{shock_iter})
|
||||||
|
else
|
||||||
|
irfvalues = irfs.piecewise.(irf_field);
|
||||||
|
irfvalues(abs(irfvalues) <threshold) = 0;
|
||||||
|
if options_.occbin.plot_irf.add_steadystate
|
||||||
|
irfvalues = irfvalues + get_mean(vars_irf{var_iter,1});
|
||||||
|
end
|
||||||
|
max_irf_length_2=min(length_irf,length(irfvalues));
|
||||||
|
plot(irfvalues(1:steps_irf:max_irf_length_2)*exofactor,'r--','linewidth',2);
|
||||||
|
end
|
||||||
|
|
||||||
|
plot(irfvalues(1:steps_irf:max(max_irf_length_1,max_irf_length_2))*0,'k-','linewidth',1.5);
|
||||||
|
|
||||||
|
if options_.occbin.plot_irf.grid
|
||||||
|
grid on
|
||||||
|
end
|
||||||
|
xlim([1 max(max_irf_length_1,max_irf_length_2)]);
|
||||||
|
if options_.TeX
|
||||||
|
title(['$' M_.endo_names_tex{i_var(var_iter)}, '$'],'Interpreter','latex')
|
||||||
|
else
|
||||||
|
title(M_.endo_names{i_var(var_iter)},'Interpreter','none')
|
||||||
|
end
|
||||||
% Annotation Box + save figure
|
% Annotation Box + save figure
|
||||||
% ----------------------
|
% ----------------------
|
||||||
if mod(j1,npan)==0 || (mod(j1,npan)~=0 && i==length(vars_irf))
|
if mod(j1,npan)==0 || (mod(j1,npan)~=0 && var_iter==length(vars_irf))
|
||||||
annotation('textbox', [0.1,0,0.35,0.05],'String', 'Linear','Color','Blue','horizontalalignment','center','interpreter','none');
|
annotation('textbox', [0.1,0,0.35,0.05],'String', 'Linear','Color','Blue','horizontalalignment','center','interpreter','none');
|
||||||
annotation('textbox', [0.55,0,0.35,0.05],'String', 'Piecewise','Color','Red','horizontalalignment','center','interpreter','none');
|
annotation('textbox', [0.55,0,0.35,0.05],'String', 'Piecewise','Color','Red','horizontalalignment','center','interpreter','none');
|
||||||
dyn_saveas(hfig,[DirectoryName,filesep,M_.fname,'_irf_occbin_',simulname_,shocknames{j},'_',shocksign,'_',int2str(ifig)],options_.nodisplay,options_.graph_format);
|
dyn_saveas(hfig,[DirectoryName,filesep,M_.fname,'_irf_occbin_',save_name,shock_names{shock_iter},'_',shocksign,'_',int2str(ifig)],options_.nodisplay,options_.graph_format);
|
||||||
|
if options_.TeX && any(strcmp('eps',cellstr(options_.graph_format)))
|
||||||
|
fprintf(fidTeX,'\\begin{figure}[H]\n');
|
||||||
|
fprintf(fidTeX,'\\centering \n');
|
||||||
|
fprintf(fidTeX,'\\includegraphics[width=%2.2f\\textwidth]{%s_irf_occbin_%s}\n',options_.figures.textwidth*min((j1-1)/ncols,1),...
|
||||||
|
[DirectoryName '/' ,M_.fname],[save_name,shock_names{shock_iter},'_',shocksign,'_',int2str(ifig)]);
|
||||||
|
fprintf(fidTeX,'\\caption{OccBin IRFs to %s shock to %s}\n',plot_title_sign,shock_names{shock_iter});
|
||||||
|
fprintf(fidTeX,'\\label{Fig:occbin_irfs:%s}\n',[save_name,shock_names{shock_iter},'_',shocksign,'_',int2str(ifig)]);
|
||||||
|
fprintf(fidTeX,'\\end{figure}\n');
|
||||||
|
fprintf(fidTeX,'\n');
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
warning('on','all')
|
if options_.TeX && any(strcmp('eps',cellstr(options_.graph_format)))
|
||||||
|
fprintf(fidTeX,'%% End Of TeX file.');
|
||||||
|
fclose(fidTeX);
|
||||||
end
|
end
|
|
@ -1,4 +1,26 @@
|
||||||
function plot_regimes(regimes,M_,options_)
|
function plot_regimes(regimes,M_,options_)
|
||||||
|
% plot_regimes(regimes,M_,options_)
|
||||||
|
% Inputs:
|
||||||
|
% - regimes [structure] OccBin regime information
|
||||||
|
% - M_ [structure] Matlab's structure describing the model
|
||||||
|
% - options_ [structure] Matlab's structure containing the options
|
||||||
|
|
||||||
|
% Copyright © 2021-2023 Dynare Team
|
||||||
|
%
|
||||||
|
% This file is part of Dynare.
|
||||||
|
%
|
||||||
|
% Dynare is free software: you can redistribute it and/or modify
|
||||||
|
% it under the terms of the GNU General Public License as published by
|
||||||
|
% the Free Software Foundation, either version 3 of the License, or
|
||||||
|
% (at your option) any later version.
|
||||||
|
%
|
||||||
|
% Dynare is distributed in the hope that it will be useful,
|
||||||
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
% GNU General Public License for more details.
|
||||||
|
%
|
||||||
|
% You should have received a copy of the GNU General Public License
|
||||||
|
% along with Dynare. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
nperiods = size(regimes,2);
|
nperiods = size(regimes,2);
|
||||||
nconstr = length(fieldnames(regimes(1)))/2;
|
nconstr = length(fieldnames(regimes(1)))/2;
|
||||||
|
@ -13,9 +35,15 @@ else
|
||||||
end
|
end
|
||||||
|
|
||||||
GraphDirectoryName = CheckPath('graphs',M_.dname);
|
GraphDirectoryName = CheckPath('graphs',M_.dname);
|
||||||
|
fhandle = dyn_figure(options_.nodisplay,'Name',[M_.fname ': OccBin regimes']);
|
||||||
|
|
||||||
fhandle = dyn_figure(options_.nodisplay,'Name',[M_.fname ' occbin regimes']);
|
latexFolder = CheckPath('latex',M_.dname);
|
||||||
|
if options_.TeX && any(strcmp('eps',cellstr(options_.graph_format)))
|
||||||
|
fidTeX = fopen([latexFolder '/' M_.fname '_occbin_regimes.tex'],'w');
|
||||||
|
fprintf(fidTeX,'%% TeX eps-loader file generated by occbin.plot_regimes.m (Dynare).\n');
|
||||||
|
fprintf(fidTeX,['%% ' datestr(now,0) '\n']);
|
||||||
|
fprintf(fidTeX,' \n');
|
||||||
|
end
|
||||||
|
|
||||||
for k=1:nconstr
|
for k=1:nconstr
|
||||||
subplot(nconstr,1,k)
|
subplot(nconstr,1,k)
|
||||||
|
@ -36,12 +64,23 @@ for k=1:nconstr
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
title(['regime ' int2str(k)])
|
xlim([1 nperiods])
|
||||||
xlabel('historic period')
|
title(['Regime ' int2str(k)])
|
||||||
ylabel('regime expected start')
|
xlabel('Historic period')
|
||||||
|
ylabel('Regime: expected start')
|
||||||
end
|
end
|
||||||
annotation('textbox',[.25,0,.15,.05],'String','Unbinding','Color','blue');
|
annotation('textbox',[.25,0,.15,.05],'String','Slack','Color','blue');
|
||||||
annotation('textbox',[.65,0,.15,.05],'String','Binding','Color','red');
|
annotation('textbox',[.65,0,.2,.05],'String','Binding','Color','red');
|
||||||
|
|
||||||
|
|
||||||
dyn_saveas(fhandle,[GraphDirectoryName, filesep, M_.fname '_occbin_regimes'],options_.nodisplay,options_.graph_format);
|
dyn_saveas(fhandle,[GraphDirectoryName, filesep, M_.fname '_occbin_regimes'],options_.nodisplay,options_.graph_format);
|
||||||
|
|
||||||
|
if options_.TeX && any(strcmp('eps',cellstr(options_.graph_format)))
|
||||||
|
fprintf(fidTeX,'\\begin{figure}[H]\n');
|
||||||
|
fprintf(fidTeX,'\\centering \n');
|
||||||
|
fprintf(fidTeX,'\\includegraphics[width=%2.2f\\textwidth]{%s_occbin_regimes}\n',options_.figures.textwidth,[GraphDirectoryName '/' M_.fname]);
|
||||||
|
fprintf(fidTeX,'\\caption{OccBin: regime evolution over time.}\n');
|
||||||
|
fprintf(fidTeX,'\\label{Fig:occbin_regimes}\n');
|
||||||
|
fprintf(fidTeX,'\\end{figure}\n');
|
||||||
|
fprintf(fidTeX,'\n');
|
||||||
|
fclose(fidTeX);
|
||||||
|
end
|
||||||
|
|
|
@ -55,9 +55,7 @@ if ismember(flag,{'forecast','all'})
|
||||||
options_occbin_.forecast.maxit=30;
|
options_occbin_.forecast.maxit=30;
|
||||||
options_occbin_.forecast.qmc=0;
|
options_occbin_.forecast.qmc=0;
|
||||||
options_occbin_.forecast.replic=0;
|
options_occbin_.forecast.replic=0;
|
||||||
options_occbin_.forecast.sepath=0;
|
|
||||||
options_occbin_.forecast.SHOCKS0=[];
|
options_occbin_.forecast.SHOCKS0=[];
|
||||||
options_occbin_.forecast.treepath=1; % number of branches
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if ismember(flag,{'irf','all'})
|
if ismember(flag,{'irf','all'})
|
||||||
|
@ -98,17 +96,12 @@ end
|
||||||
|
|
||||||
if ismember(flag,{'plot_irf','all'})
|
if ismember(flag,{'plot_irf','all'})
|
||||||
options_occbin_.plot_irf.add_steadystate = 0;
|
options_occbin_.plot_irf.add_steadystate = 0;
|
||||||
options_occbin_.plot_irf.exo_names = [];
|
|
||||||
options_occbin_.plot_irf.endo_names = M_.endo_names;
|
|
||||||
options_occbin_.plot_irf.endo_names_long = [];
|
|
||||||
options_occbin_.plot_irf.endo_scaling_factor = [];
|
options_occbin_.plot_irf.endo_scaling_factor = [];
|
||||||
options_occbin_.plot_irf.grid = true;
|
options_occbin_.plot_irf.grid = true;
|
||||||
options_occbin_.plot_irf.ncols = 3;
|
options_occbin_.plot_irf.ncols = 3;
|
||||||
options_occbin_.plot_irf.nrows = 3;
|
options_occbin_.plot_irf.nrows = 3;
|
||||||
options_occbin_.plot_irf.shocksigns = {'pos','neg'};
|
options_occbin_.plot_irf.shocksigns = {'pos','neg'};
|
||||||
options_occbin_.plot_irf.simulname='';
|
options_occbin_.plot_irf.simulname='';
|
||||||
options_occbin_.plot_irf.threshold = 10^-6;
|
|
||||||
options_occbin_.plot_irf.tplot = [];
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if ismember(flag,{'plot_shock_decomp','all'})
|
if ismember(flag,{'plot_shock_decomp','all'})
|
||||||
|
|
|
@ -13,66 +13,66 @@
|
||||||
|
|
||||||
// ----------------- Defintions -----------------------------------------//
|
// ----------------- Defintions -----------------------------------------//
|
||||||
var
|
var
|
||||||
c //1 Consumption
|
c $c$ (long_name='Consumption')
|
||||||
n //2 Labor
|
n (long_name='Labor')
|
||||||
y //5 Output
|
y $y$ (long_name='Output')
|
||||||
yf //6 Final goods
|
yf (long_name='Final goods')
|
||||||
yg //11 Output growth gap
|
yg (long_name='Output growth gap')
|
||||||
w //12 Real wage rate
|
w (long_name='Real wage rate')
|
||||||
wf //13 Flexible real wage
|
wf (long_name='Flexible real wage')
|
||||||
pigap //15 Inflation rate -> pi(t)/pibar = pigap
|
pigap (long_name='Inflation rate -> pi(t)/pibar = pigap')
|
||||||
inom ${i^{nom}}$ //16 Nominal interest rate
|
inom ${i^{nom}}$ (long_name='Nominal interest rate')
|
||||||
inomnot //17 Notional interest rate
|
inomnot (long_name='Notional interest rate')
|
||||||
mc //19 Real marginal cost
|
mc (long_name='Real marginal cost')
|
||||||
lam ${\lambda}$ //20 Inverse marginal utility of wealth
|
lam ${\lambda}$ (long_name='Inverse marginal utility of wealth')
|
||||||
g //21 Growth shock
|
g (long_name='Growth shock')
|
||||||
s //22 Risk premium shock
|
s (long_name='Risk premium shock')
|
||||||
mp //23 Monetary policy shock
|
mp (long_name='Monetary policy shock')
|
||||||
pi ${\pi}$ //24 Observed inflation
|
pi ${\pi}$ (long_name='Observed inflation')
|
||||||
@#if !(small_model)
|
@#if !(small_model)
|
||||||
x //3 Investment
|
x (long_name='Investment')
|
||||||
k //4 Capital
|
k (long_name='Capital')
|
||||||
u //7 Utilization cost
|
u (long_name='Utilization cost')
|
||||||
ups //8 Utilization choice
|
ups (long_name='Utilization choice')
|
||||||
wg //9 Real wage growth gap
|
wg (long_name='Real wage growth gap')
|
||||||
xg //10 Investment growth
|
xg (long_name='Investment growth')
|
||||||
rk //14 Real rental rate
|
rk (long_name='Real rental rate')
|
||||||
q //18 Tobins q
|
q (long_name='Tobins q')
|
||||||
@#endif
|
@#endif
|
||||||
;
|
;
|
||||||
varexo
|
varexo
|
||||||
epsg ${\varepsilon_g}$ // Productivity growth shock
|
epsg ${\varepsilon_g}$ (long_name='Productivity growth shock')
|
||||||
epsi // Notional interest rate shock
|
epsi (long_name='Notional interest rate shock')
|
||||||
epss // Risk premium shock
|
epss (long_name='Risk premium shock')
|
||||||
;
|
;
|
||||||
parameters
|
parameters
|
||||||
// Calibrated Parameters
|
// Calibrated Parameters
|
||||||
beta $\beta$ // Discount factor
|
beta $\beta$ (long_name='Discount factor')
|
||||||
chi // Labor disutility scale
|
chi (long_name='Labor disutility scale')
|
||||||
thetap // Elasticity of subs. between intermediate goods
|
thetap (long_name='Elasticity of subs. between intermediate goods')
|
||||||
thetaw // Elasticity of subs. between labor types
|
thetaw (long_name='Elasticity of subs. between labor types')
|
||||||
nbar // Steady state labor
|
nbar (long_name='Steady state labor')
|
||||||
eta // Inverse frish elasticity of labor supply
|
eta (long_name='Inverse frish elasticity of labor supply')
|
||||||
delta // Depreciation
|
delta (long_name='Depreciation')
|
||||||
alpha // Capital share
|
alpha (long_name='Capital share')
|
||||||
gbar // Mean growth rate
|
gbar (long_name='Mean growth rate')
|
||||||
pibar // Inflation target
|
pibar (long_name='Inflation target')
|
||||||
inombar // Steady gross nom interest rate
|
inombar (long_name='Steady gross nom interest rate')
|
||||||
inomlb // Effective lower bound on gross nominal interest rate
|
inomlb (long_name='Effective lower bound on gross nominal interest rate')
|
||||||
sbar // Average risk premium
|
sbar (long_name='Average risk premium')
|
||||||
// Parameters for DGP and Estimated parameters
|
// Parameters for DGP and Estimated parameters
|
||||||
varphip // Rotemberg price adjustment cost
|
varphip (long_name='Rotemberg price adjustment cost')
|
||||||
varphiw // Rotemberg wage adjustment cost
|
varphiw (long_name='Rotemberg wage adjustment cost')
|
||||||
h // Habit persistence
|
h (long_name='Habit persistence')
|
||||||
rhos // Persistence
|
rhos (long_name='Persistence')
|
||||||
rhoi // Persistence
|
rhoi (long_name='Persistence')
|
||||||
sigz // Standard deviation technology
|
sigz (long_name='Standard deviation technology')
|
||||||
sigs // Standard deviation risk premia
|
sigs (long_name='Standard deviation risk premia')
|
||||||
sigi // Standard deviation mon pol
|
sigi (long_name='Standard deviation mon pol')
|
||||||
phipi // Inflation responsiveness
|
phipi (long_name='Inflation responsiveness')
|
||||||
phiy // Output responsiveness
|
phiy (long_name='Output responsiveness')
|
||||||
nu // Investment adjustment cost
|
nu (long_name='Investment adjustment cost')
|
||||||
sigups // Utilization
|
sigups (long_name='Utilization')
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
@ -316,36 +316,34 @@ varobs yg inom pi;
|
||||||
|
|
||||||
// forecast starting from period 42, zero shocks (default)
|
// forecast starting from period 42, zero shocks (default)
|
||||||
smoother2histval(period=42);
|
smoother2histval(period=42);
|
||||||
[oo, error_flag] = occbin.forecast(options_,M_,oo_,8);
|
[forecast, error_flag] = occbin.forecast(options_,M_,oo_.dr,oo_.steady_state,oo_.exo_steady_state,oo_.exo_det_steady_state,8);
|
||||||
// forecast with stochastic shocks
|
// forecast with stochastic shocks
|
||||||
options_.occbin.forecast.qmc=true;
|
options_.occbin.forecast.qmc=true;
|
||||||
options_.occbin.forecast.replic=127;
|
options_.occbin.forecast.replic=127;
|
||||||
[oo1, error_flag] = occbin.forecast(options_,M_,oo_,8);
|
[forecast1, error_flag] = occbin.forecast(options_,M_,oo_.dr,oo_.steady_state,oo_.exo_steady_state,oo_.exo_det_steady_state,8);
|
||||||
|
|
||||||
|
figure('Name','OccBin: Forecasts')
|
||||||
|
subplot(2,1,1)
|
||||||
|
plot(1:8,forecast.piecewise.Mean.inom,'b-',1:8,forecast1.piecewise.Mean.inom,'r--')
|
||||||
|
subplot(2,1,2)
|
||||||
|
plot(1:8,forecast.piecewise.Mean.y,'b-',1:8,forecast1.piecewise.Mean.y,'r--')
|
||||||
|
|
||||||
// GIRF given states in 42 and shocks in 43
|
// GIRF given states in 42 and shocks in 43
|
||||||
t0=42;
|
t0=42;
|
||||||
options_.occbin.irf.exo_names=M_.exo_names;
|
options_.occbin.irf.exo_names=M_.exo_names;
|
||||||
options_.occbin.irf.t0=t0;
|
options_.occbin.irf.t0=t0;
|
||||||
oo_ = occbin.irf(M_,oo_,options_);
|
oo_.occbin.irfs = occbin.irf(M_,oo_,options_);
|
||||||
|
|
||||||
vars_irf = {
|
var_list_ = {'c','n','y','pigap','inom','inomnot'};
|
||||||
'c', 'consumption'
|
|
||||||
'n', 'labor'
|
|
||||||
'y', 'output'
|
|
||||||
'pigap', 'inflation rate'
|
|
||||||
'inom', 'interest rate'
|
|
||||||
'inomnot', 'shadow rate'
|
|
||||||
};
|
|
||||||
|
|
||||||
options_.occbin.plot_irf.exo_names = M_.exo_names;
|
|
||||||
options_.occbin.plot_irf.endo_names = vars_irf(:,1);
|
|
||||||
options_.occbin.plot_irf.endo_names_long = vars_irf(:,2);
|
|
||||||
// if you want to scale ...
|
// if you want to scale ...
|
||||||
// options_occbin_.plot_irf.endo_scaling_factor = vars_irf(:,3);
|
// options_occbin_.plot_irf.endo_scaling_factor = vars_irf(:,3);
|
||||||
options_.occbin.plot_irf.simulname = ['t0_' int2str(t0)];
|
options_.occbin.plot_irf.simulname = ['t0_' int2str(t0)];
|
||||||
options_.occbin.plot_irf.tplot = min(40,options_.irf);
|
options_.irf=40;
|
||||||
occbin.plot_irfs(M_,oo_,options_);
|
occbin.plot_irfs(M_,oo_.occbin.irfs,options_,var_list_);
|
||||||
|
var_list_={};
|
||||||
|
options_.occbin.plot_irf.simulname = ['t0_' int2str(t0) '_full'];
|
||||||
|
occbin.plot_irfs(M_,oo_.occbin.irfs,options_,var_list_);
|
||||||
oo0=oo_;
|
oo0=oo_;
|
||||||
// use smoother_redux
|
// use smoother_redux
|
||||||
estimation(
|
estimation(
|
||||||
|
@ -374,7 +372,7 @@ varobs yg inom pi;
|
||||||
consider_all_endogenous,heteroskedastic_filter,filter_step_ahead=[1],smoothed_state_uncertainty);
|
consider_all_endogenous,heteroskedastic_filter,filter_step_ahead=[1],smoothed_state_uncertainty);
|
||||||
|
|
||||||
// show initial condition effect of IF
|
// show initial condition effect of IF
|
||||||
figure,
|
figure('Name','OccBin: Smoothed shocks')
|
||||||
subplot(221)
|
subplot(221)
|
||||||
plot([oo0.SmoothedShocks.epsg oo_.SmoothedShocks.epsg]), title('epsg')
|
plot([oo0.SmoothedShocks.epsg oo_.SmoothedShocks.epsg]), title('epsg')
|
||||||
subplot(222)
|
subplot(222)
|
||||||
|
@ -382,7 +380,7 @@ varobs yg inom pi;
|
||||||
subplot(223)
|
subplot(223)
|
||||||
plot([oo0.SmoothedShocks.epss oo_.SmoothedShocks.epss]), title('epss')
|
plot([oo0.SmoothedShocks.epss oo_.SmoothedShocks.epss]), title('epss')
|
||||||
legend('PKF','IF')
|
legend('PKF','IF')
|
||||||
figure,
|
figure('Name','OccBin: Smoothed Variables')
|
||||||
subplot(221)
|
subplot(221)
|
||||||
plot([oo0.SmoothedVariables.inom oo_.SmoothedVariables.inom]), title('inom')
|
plot([oo0.SmoothedVariables.inom oo_.SmoothedVariables.inom]), title('inom')
|
||||||
subplot(222)
|
subplot(222)
|
||||||
|
|
Loading…
Reference in New Issue