Added routine computing IRFs of backward looking model.
(cherry picked from commit 647505526a
)
time-shift
parent
ca7f734561
commit
cfd82e28e4
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
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
|
Loading…
Reference in New Issue