From 1b042f01e05f5e6deb3bf078e9a33de3adfd3b3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=28Charybdis=29?= <stephane.adjemian@univ-lemans.fr> Date: Thu, 12 Oct 2017 12:11:30 +0200 Subject: [PATCH] Added new interface for specifying shocks in backward models IRFs. By passing dseries objects to backward_model_irf routine. (cherry picked from commit 366acf5bac82c751dc9bca275410dd252014549d) --- matlab/backward/backward_model_irf.m | 69 +++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/matlab/backward/backward_model_irf.m b/matlab/backward/backward_model_irf.m index 593311a1d..39f8ac551 100644 --- a/matlab/backward/backward_model_irf.m +++ b/matlab/backward/backward_model_irf.m @@ -3,11 +3,11 @@ function [deviations, baseline, irfs] = backward_model_irf(initialcondition, inn % Returns impulse response functions. % % INPUTS -% - initialcondition [dseries] Initial conditions for the endogenous variables, or period 0. -% - innovationbaseline [dseries] Baseline for the future innovations. If empty the baseline scenario is zero for future shocks. -% - 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. +% - initialcondition [dseries] Initial conditions for the endogenous variables, or period 0. +% - innovationbaseline [dseries] Baseline for the future innovations. If empty the baseline scenario is zero for future shocks. +% - listofshocks [cell of strings or dseries] 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] @@ -59,6 +59,39 @@ else transform = varargin{2}; end +% Check third argument. +if ~iscell(listofshocks) + error('Third input argument has to be a cell of string or dseries objects!') +else + if all(cellfun(@ischar, listofshocks)) + deterministicshockflag = false; + elseif all(cellfun(@isdseries, listofshocks)) + deterministicshockflag = true; + else + error('Elements of third input argument must all be char arrays or dseries objects!') + end + if deterministicshockflag + numberofexperiments = length(listofshocks); + exonames = cellstr(M_.exo_names); + initialconditionperiod = initialcondition.dates(end); + for i=1:numberofexperiments + shock = listofshocks{i}; + impulsenames = shock.name; + listofunknownexo = setdiff(impulsenames, exonames); + if ~isempty(listofunknownexo) + disp(listofunknownexo) + error('In experiment n°%s, some of the declared shocks are unknown!', int2str(i)) + end + if initialconditionperiod>=shock.dates(1) + error('In experiment n°%s, the shock period must follow %s!', string(initialconditionperiod)) + end + if shock.nobs>1 + error('Shocks over multiple periods not implemented yet!') + end + end + end +end + baselineflag = false; % Set default values for the baseline paths. % @@ -119,11 +152,20 @@ end for i=1:length(listofshocks) innovations = Innovations; % Add the shock. - j = find(strcmp(listofshocks{i}, exonames)); - if isempty(j) - error('backward_model_irf: Exogenous variable %s is unknown!', listofshocks{i}) + if deterministicshockflag + shock = listofshocks{i}; + timid = shock.dates(1)-initialconditionperiod; + for j=1:shock.vobs + k = find(strcmp(shock.name{i}, exonames)); + innovations(timid,:) = innovations(timid,:) + shock.data(1,j); + end + else + j = find(strcmp(listofshocks{i}, exonames)); + if isempty(j) + error('backward_model_irf: Exogenous variable %s is unknown!', listofshocks{i}) + end + innovations(1,:) = innovations(1,:) + transpose(sigma(:,j)); end - innovations(1,:) = innovations(1,:) + transpose(sigma(:,j)); if options_.linear ysim__1 = simul_backward_linear_model_(initialcondition, periods, DynareOptions, DynareModel, DynareOutput, innovations, nx, ny1, iy1, jdx, model_dynamic); else @@ -141,9 +183,14 @@ for i=1:length(listofshocks) allirfs = dseries(transpose(endo_simul__1), initialcondition.init, endonames(1:M_.orig_endo_nbr), cellstr(DynareModel.endo_names_tex(1:M_.orig_endo_nbr,:))); end % Extract a sub-dseries object - deviations.(listofshocks{i}) = alldeviations{listofvariables{:}}; + if deterministicshockflag + name = sprintf('experiment_%s', int2str(i)); + else + name = listofshocks{i}; + end + deviations.(name) = alldeviations{listofvariables{:}}; if nargout>2 - irfs.(listofshocks{i}) = allirfs{listofvariables{:}}; + irfs.(name) = allirfs{listofvariables{:}}; end end -- GitLab