From cfd82e28e483ff2aaf78c85212fc1c4dd40e95aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Thu, 18 May 2017 13:43:13 +0200 Subject: [PATCH] Added routine computing IRFs of backward looking model. (cherry picked from commit 647505526afe93978c419c9a6dde22b664120ef3) --- matlab/backward/backward_model_irf.m | 112 +++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 matlab/backward/backward_model_irf.m diff --git a/matlab/backward/backward_model_irf.m b/matlab/backward/backward_model_irf.m new file mode 100644 index 000000000..3ee05024b --- /dev/null +++ b/matlab/backward/backward_model_irf.m @@ -0,0 +1,112 @@ +function irfs = backward_model_irf(initialcondition, listofshocks, listofvariables, periods, transform) + +% Returns impulse response functions. +% +% INPUTS +% - initialcondition [dseries] Initial conditions for the endogenous variables. +% - listofshocks [cell of strings] The innovations for which the IRFs need to be computed. +% - listofvariables [cell of strings] The endogenous variables which will be returned. +% - periods [integer] scalar, the number of periods. +% +% OUTPUTS +% - irfs [struct of dseries] +% +% REMARKS +% The names of the fields in the returned structure are given by the name +% of the innovations listed in the second input argument. Each field gather +% the associated paths for endogenous variables listed in the third input +% argument. + + +% Copyright (C) 2017 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 . + +global M_ options_ oo_ + +% Check that the model is actually backward +if M_.maximum_lead + error(['simul_model_irf:: The specified model is not backward looking!']) +end + +% Set the number of innovations and variables for which we want to compute the IRFs. +nx = length(listofshocks); +ny = length(listofvariables); + +% Initialization of the returned argument. Each will be a dseries +% object containing the IRFS for the endogenous variables listed in the +% third input argument. +irfs = struct(); + +% Set default value for the fourth input argument. +if nargin<4 + periods = 40; + notransform = true; +end + +% Set default value for the last input argument (no transformation). +if nargin<5 + notransform = true; +else + notransform = false; +end + +% Get list of all exogenous variables in a cell of strings +exo_names = cellstr(M_.exo_names); + +% Get the list of all exogenous variables in a cell of strings +endo_names = cellstr(M_.endo_names); + +% Set initial condition. +if isdates(initialcondition) + if isempty(M_.endo_histval) + error('backward_model_irf: histval block for setting initial condition is missing!') + end + initialcondition = dseries(transpose(M_.endo_histval), initialcondition, endo_names, cellstr(M_.endo_names_tex)); +end + +% Get the covariance matrix of the shocks. +Sigma = M_.Sigma_e + 1e-14*eye(M_.exo_nbr); +sigma = transpose(chol(Sigma)); + +% Put initial conditions in a vector of doubles +initialconditions = transpose(initialcondition{endo_names{:}}.data); + +% Compute the IRFs (loop over innovations). +for i=1:length(listofshocks) + % Get transition paths induced by the initial condition. + innovations = zeros(periods+1, M_.exo_nbr); + oo__0 = simul_backward_model(initialconditions, periods, options_, M_, oo_, innovations); + % Add the shock. + j = strmatch(listofshocks{i}, exo_names); + if isempty(j) + error('backward_model_irf: Exogenous variable %s is unknown!', listofshocks{i}) + end + innovations(2,:) = transpose(sigma(:,j)); + oo__1 = simul_backward_model(initialconditions, periods, options_, M_, oo_, innovations); + % Transform the endogenous variables + if notransform + endo_simul__0 = oo__0.endo_simul; + endo_simul__1 = oo__1.endo_simul; + else + endo_simul__0 = feval(transform, oo__0.endo_simul); + endo_simul__1 = feval(transform, oo__1.endo_simul); + end + % Instantiate a dseries object (with all the endogenous variables) + allirfs = dseries(transpose(endo_simul__1-endo_simul__0), initialcondition.init, cellstr(M_.endo_names), cellstr(M_.endo_names_tex)); + % Extract a sub-dseries object + irfs.(listofshocks{i}) = allirfs{listofvariables{:}}; +end \ No newline at end of file