Merge branch 'master' into 'master'
utilities + plot shock decompositions + init condition decompositions See merge request Dynare/dynare!1655time-shift
commit
e2f91abcaf
|
@ -0,0 +1,47 @@
|
||||||
|
|
||||||
|
function y0 = get_irf(exo,varargin)
|
||||||
|
% function x = get_irf(exoname, vname1, vname2, ...)
|
||||||
|
% returns IRF to individual exogenous for a list of variables and adds the
|
||||||
|
% steady state
|
||||||
|
%
|
||||||
|
% INPUTS:
|
||||||
|
% exo: exo variable name
|
||||||
|
% vname1, vname2, ... : list of variable names
|
||||||
|
%
|
||||||
|
% OUTPUTS
|
||||||
|
% x: irf matrix [time x number of variables]
|
||||||
|
%
|
||||||
|
% SPECIAL REQUIREMENTS
|
||||||
|
% none
|
||||||
|
|
||||||
|
% Copyright (C) 2019 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_ oo_
|
||||||
|
|
||||||
|
ys_ = [oo_.steady_state];
|
||||||
|
y0=zeros(length(oo_.irfs.([varargin{1} '_' exo]))+1,length(varargin));
|
||||||
|
|
||||||
|
|
||||||
|
[i_var,nvar] = varlist_indices(varargin,M_.endo_names);
|
||||||
|
|
||||||
|
|
||||||
|
for j=1:nvar
|
||||||
|
% mfys = strmatch(varargin{j},lgy_,'exact');
|
||||||
|
y0(:,j)=[0; oo_.irfs.([ varargin{j} '_' exo ])']+ys_(i_var(j));
|
||||||
|
end
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
function y0 = get_mean(varargin)
|
||||||
|
% function x = get_mean(vname1, vname2, <order>)
|
||||||
|
% returns the steady-state of a variable identified by its name
|
||||||
|
%
|
||||||
|
% INPUTS:
|
||||||
|
% vname1, vname2, ... : list of variable names
|
||||||
|
% order: if integer 1 or 2, optionally last input can trigger the order
|
||||||
|
% at which steady state is computed
|
||||||
|
%
|
||||||
|
% OUTPUTS
|
||||||
|
% x: steady state values
|
||||||
|
%
|
||||||
|
% SPECIAL REQUIREMENTS
|
||||||
|
% none
|
||||||
|
|
||||||
|
% Copyright (C) 2019 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_ oo_ options_
|
||||||
|
|
||||||
|
if ~isempty(regexp(varargin{end},'\d','ONCE')) && isempty(regexp(varargin{end},'\D','ONCE'))
|
||||||
|
order=eval(varargin{end});
|
||||||
|
else
|
||||||
|
order=1;
|
||||||
|
end
|
||||||
|
if order==1
|
||||||
|
ys_ = oo_.steady_state;
|
||||||
|
ys_ = evaluate_steady_state(ys_,M_,options_,oo_,1);
|
||||||
|
elseif order==2
|
||||||
|
ys_ = oo_.dr.ys;
|
||||||
|
ys_(oo_.dr.order_var)=ys_(oo_.dr.order_var)+oo_.dr.ghs2./2;
|
||||||
|
else
|
||||||
|
return
|
||||||
|
end
|
||||||
|
lgy_ = M_.endo_names;
|
||||||
|
|
||||||
|
mfys=nan(length(varargin),1);
|
||||||
|
for j=1:length(varargin)
|
||||||
|
mfys(j) = find(strcmp(varargin{j},lgy_));
|
||||||
|
end
|
||||||
|
|
||||||
|
y0 = ys_(mfys);
|
|
@ -0,0 +1,39 @@
|
||||||
|
function x = get_shock_stderr_by_name(exoname)
|
||||||
|
% function x = get_shock_stderr_by_name(exoname)
|
||||||
|
% returns the value of a shock identified by its name
|
||||||
|
%
|
||||||
|
% INPUTS:
|
||||||
|
% exoname: shock name
|
||||||
|
%
|
||||||
|
% OUTPUTS
|
||||||
|
% x: shock value
|
||||||
|
%
|
||||||
|
% SPECIAL REQUIREMENTS
|
||||||
|
% none
|
||||||
|
|
||||||
|
% Copyright (C) 2019 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_
|
||||||
|
|
||||||
|
i = find(strcmp(exoname,M_.exo_names));
|
||||||
|
|
||||||
|
if isempty(i)
|
||||||
|
error(['Can''t find shock ', exoname])
|
||||||
|
end
|
||||||
|
|
||||||
|
x = sqrt(M_.Sigma_e(i,i));
|
|
@ -0,0 +1,46 @@
|
||||||
|
|
||||||
|
function y0 = get_smooth(varargin)
|
||||||
|
% function x = get_smooth(vname1, vname2, )
|
||||||
|
% returns smoothed variables or shocks identified by their name
|
||||||
|
%
|
||||||
|
% INPUTS:
|
||||||
|
% vname1, vname2, ... : list of variable/shock names
|
||||||
|
%
|
||||||
|
% OUTPUTS
|
||||||
|
% x: smoothed variables [T x number of variables]
|
||||||
|
%
|
||||||
|
% SPECIAL REQUIREMENTS
|
||||||
|
% none
|
||||||
|
|
||||||
|
% Copyright (C) 2019 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 oo_
|
||||||
|
|
||||||
|
SmoothedVariables=[struct2cell(oo_.SmoothedVariables); struct2cell(oo_.SmoothedShocks)];
|
||||||
|
my_field_names = [fieldnames(oo_.SmoothedVariables); fieldnames(oo_.SmoothedShocks)];
|
||||||
|
isvar=zeros(length(SmoothedVariables),1);
|
||||||
|
for jf = 1:length(SmoothedVariables)
|
||||||
|
isvar(jf)=~(isstruct(SmoothedVariables{jf}));
|
||||||
|
end
|
||||||
|
SmoothedVariables=cell2struct(SmoothedVariables(logical(isvar)),my_field_names(logical(isvar)));
|
||||||
|
|
||||||
|
|
||||||
|
y0=zeros(length(SmoothedVariables.(varargin{1})),length(varargin));
|
||||||
|
for j=1:length(varargin)
|
||||||
|
y0(:,j)=SmoothedVariables.(varargin{j});
|
||||||
|
end
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
function y0 = get_update(varargin)
|
||||||
|
% function x = get_update(vname1, vname2, )
|
||||||
|
% returns updated variables identified by their name
|
||||||
|
%
|
||||||
|
% INPUTS:
|
||||||
|
% vname1, vname2, ... : list of variable names
|
||||||
|
%
|
||||||
|
% OUTPUTS
|
||||||
|
% x: smoothed variables [T x number of variables]
|
||||||
|
%
|
||||||
|
% SPECIAL REQUIREMENTS
|
||||||
|
% none
|
||||||
|
|
||||||
|
% Copyright (C) 2019 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 oo_
|
||||||
|
|
||||||
|
y0=zeros(length(oo_.UpdatedVariables.(varargin{1})),length(varargin));
|
||||||
|
for j=1:length(varargin)
|
||||||
|
y0(:,j)=oo_.UpdatedVariables.(varargin{j});
|
||||||
|
end
|
||||||
|
|
|
@ -100,8 +100,8 @@ for j=1:nvar
|
||||||
comp_nbr=18;
|
comp_nbr=18;
|
||||||
end
|
end
|
||||||
|
|
||||||
d0(1,:)=[{'Decomposition'} cellstr(labels(1:comp_nbr,:))' {'Smoot Var'}];
|
d0(1,:)=[{'Decomposition'} cellstr(labels(1:comp_nbr,:))' {'Smoot Var'} {'Steady State'}];
|
||||||
d0=[d0; num2cell([x' z1'])];
|
d0=[d0; num2cell([x' z1' ]), [num2cell(SteadyState(i_var(j))); cell(size(z1,2)-1,1)]];
|
||||||
LastRow=size(d0,1);
|
LastRow=size(d0,1);
|
||||||
if use_shock_groups
|
if use_shock_groups
|
||||||
d0(LastRow+2,1)={'Legend.'};
|
d0(LastRow+2,1)={'Legend.'};
|
||||||
|
|
|
@ -158,7 +158,7 @@ if realtime_ && isstruct(oo_) && isfield(oo_, 'realtime_shock_decomposition')
|
||||||
myopts.plot_shock_decomp.realtime=1;
|
myopts.plot_shock_decomp.realtime=1;
|
||||||
myopts.plot_shock_decomp.vintage=i;
|
myopts.plot_shock_decomp.vintage=i;
|
||||||
% retrieve quarterly shock decomp
|
% retrieve quarterly shock decomp
|
||||||
z = plot_shock_decomposition(M_,oo_,myopts,[]);
|
[z, ~] = plot_shock_decomposition(M_,oo_,myopts,[]);
|
||||||
zdim = size(z);
|
zdim = size(z);
|
||||||
z = z(i_var,:,:);
|
z = z(i_var,:,:);
|
||||||
if isstruct(aux)
|
if isstruct(aux)
|
||||||
|
@ -185,13 +185,14 @@ if realtime_ && isstruct(oo_) && isfield(oo_, 'realtime_shock_decomposition')
|
||||||
if qvintage_>i-4 && qvintage_<i
|
if qvintage_>i-4 && qvintage_<i
|
||||||
myopts.plot_shock_decomp.vintage=qvintage_;
|
myopts.plot_shock_decomp.vintage=qvintage_;
|
||||||
% retrieve quarterly shock decomp
|
% retrieve quarterly shock decomp
|
||||||
z = plot_shock_decomposition(M_,oo_,myopts,[]);
|
[z, ~] = plot_shock_decomposition(M_,oo_,myopts,[]);
|
||||||
z(:,:,end+1:zdim(3))=nan; % fill with nan's remaining time points to reach Q4
|
z(:,:,end+1:zdim(3))=nan; % fill with nan's remaining time points to reach Q4
|
||||||
z = z(i_var,:,:);
|
z = z(i_var,:,:);
|
||||||
if isstruct(aux)
|
if isstruct(aux)
|
||||||
if ischar(aux0.y)
|
if ischar(aux0.y)
|
||||||
% retrieve quarterly shock decomp for aux variable
|
% retrieve quarterly shock decomp for aux variable
|
||||||
[y_aux, steady_state_aux] = plot_shock_decomposition(M_,oo_,myopts,aux0.y);
|
[y_aux, steady_state_aux] = plot_shock_decomposition(M_,oo_,myopts,aux0.y);
|
||||||
|
y_aux(:,:,end+1:zdim(3))=nan; % fill with nan's remaining time points to reach Q4
|
||||||
aux.y=y_aux;
|
aux.y=y_aux;
|
||||||
aux.yss=steady_state_aux;
|
aux.yss=steady_state_aux;
|
||||||
end
|
end
|
||||||
|
@ -202,6 +203,7 @@ if realtime_ && isstruct(oo_) && isfield(oo_, 'realtime_shock_decomposition')
|
||||||
|
|
||||||
end
|
end
|
||||||
oo_.annualized_realtime_forecast_shock_decomposition.(['yr_' int2str(yr)]) = z(:,:,end-nfrcst:end);
|
oo_.annualized_realtime_forecast_shock_decomposition.(['yr_' int2str(yr)]) = z(:,:,end-nfrcst:end);
|
||||||
|
oo_.annualized_realtime_forecast_shock_decomposition.pool(:,:,yr+1) = squeeze(z(:,:,end-nfrcst+1));
|
||||||
if init>nfrcst
|
if init>nfrcst
|
||||||
oo_.annualized_realtime_conditional_shock_decomposition.(['yr_' int2str(yr-nfrcst)]) = ...
|
oo_.annualized_realtime_conditional_shock_decomposition.(['yr_' int2str(yr-nfrcst)]) = ...
|
||||||
oo_.annualized_realtime_shock_decomposition.pool(:,:,yr-nfrcst:end) - ...
|
oo_.annualized_realtime_shock_decomposition.pool(:,:,yr-nfrcst:end) - ...
|
||||||
|
@ -223,8 +225,12 @@ if realtime_ && isstruct(oo_) && isfield(oo_, 'realtime_shock_decomposition')
|
||||||
oo_.annualized_realtime_forecast_shock_decomposition.(['yr_' int2str(yr-my_forecast_)])(:,end,1:my_forecast_+1);
|
oo_.annualized_realtime_forecast_shock_decomposition.(['yr_' int2str(yr-my_forecast_)])(:,end,1:my_forecast_+1);
|
||||||
oo_.annualized_realtime_conditional_shock_decomposition.(['yr_' int2str(yr-my_forecast_)])(:,end,:) = ...
|
oo_.annualized_realtime_conditional_shock_decomposition.(['yr_' int2str(yr-my_forecast_)])(:,end,:) = ...
|
||||||
oo_.annualized_realtime_shock_decomposition.pool(:,end,yr-my_forecast_:yr);
|
oo_.annualized_realtime_shock_decomposition.pool(:,end,yr-my_forecast_:yr);
|
||||||
|
oo_.annualized_realtime_conditional_shock_decomposition.pool(:,:,yr-my_forecast_+1) = ...
|
||||||
|
oo_.annualized_realtime_conditional_shock_decomposition.(['yr_' int2str(yr-my_forecast_)])(:,:,2);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
oo_.annualized_realtime_conditional_shock_decomposition.pool(:,:,yr-nfrcst+1) = ...
|
||||||
|
oo_.annualized_realtime_conditional_shock_decomposition.(['yr_' int2str(yr-nfrcst)])(:,:,2);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
% ztmp=oo_.realtime_shock_decomposition.pool(:,:,21:29)-oo_.realtime_forecast_shock_decomposition.time_21;
|
% ztmp=oo_.realtime_shock_decomposition.pool(:,:,21:29)-oo_.realtime_forecast_shock_decomposition.time_21;
|
||||||
|
@ -251,14 +257,14 @@ if realtime_ && isstruct(oo_) && isfield(oo_, 'realtime_shock_decomposition')
|
||||||
if vintage_
|
if vintage_
|
||||||
z = oo_.annualized_realtime_conditional_shock_decomposition.(['yr_' int2str(floor(vintage_/4))]);
|
z = oo_.annualized_realtime_conditional_shock_decomposition.(['yr_' int2str(floor(vintage_/4))]);
|
||||||
else
|
else
|
||||||
error();
|
z = oo_.annualized_realtime_conditional_shock_decomposition.pool;
|
||||||
end
|
end
|
||||||
|
|
||||||
case 3 % forecast
|
case 3 % forecast
|
||||||
if vintage_
|
if vintage_
|
||||||
z = oo_.annualized_realtime_forecast_shock_decomposition.(['yr_' int2str(floor(vintage_/4))]);
|
z = oo_.annualized_realtime_forecast_shock_decomposition.(['yr_' int2str(floor(vintage_/4))]);
|
||||||
else
|
else
|
||||||
error()
|
z = oo_.annualized_realtime_forecast_shock_decomposition.pool;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -67,4 +67,4 @@ options.plot_shock_decomp.colormap = MAP;
|
||||||
options.plot_shock_decomp.endo_names = mydata.endo_names;
|
options.plot_shock_decomp.endo_names = mydata.endo_names;
|
||||||
options.plot_shock_decomp.endo_names_tex = mydata.endo_names_tex;
|
options.plot_shock_decomp.endo_names_tex = mydata.endo_names_tex;
|
||||||
|
|
||||||
plot_shock_decomposition(M,oo,options,var_list_);
|
plot_shock_decomposition(M,oo,options,{var_list_});
|
||||||
|
|
|
@ -148,6 +148,11 @@ for j=1:nvar
|
||||||
ax=axes('Position',[0.1 0.1 0.6 0.8],'box','on');
|
ax=axes('Position',[0.1 0.1 0.6 0.8],'box','on');
|
||||||
% plot(ax,x(2:end),z1(end,:),'k-','LineWidth',2)
|
% plot(ax,x(2:end),z1(end,:),'k-','LineWidth',2)
|
||||||
% axis(ax,[xmin xmax ymin ymax]);
|
% axis(ax,[xmin xmax ymin ymax]);
|
||||||
|
if strcmp('aoa',DynareOptions.plot_shock_decomp.type)
|
||||||
|
bgap = 0.15;
|
||||||
|
else
|
||||||
|
bgap = 0;
|
||||||
|
end
|
||||||
hold on;
|
hold on;
|
||||||
for i=1:gend
|
for i=1:gend
|
||||||
i_1 = i-1;
|
i_1 = i-1;
|
||||||
|
@ -156,10 +161,10 @@ for j=1:nvar
|
||||||
for k = 1:comp_nbr
|
for k = 1:comp_nbr
|
||||||
zz = z1(k,i);
|
zz = z1(k,i);
|
||||||
if zz > 0
|
if zz > 0
|
||||||
fill([x(i) x(i) x(i+1) x(i+1)]+(1/freq/2),[yp yp+zz yp+zz yp],k);
|
fill([x(i)+bgap x(i)+bgap x(i+1)-bgap x(i+1)-bgap]+(1/freq/2),[yp yp+zz yp+zz yp],k);
|
||||||
yp = yp+zz;
|
yp = yp+zz;
|
||||||
else
|
else
|
||||||
fill([x(i) x(i) x(i+1) x(i+1)]+(1/freq/2),[ym ym+zz ym+zz ym],k);
|
fill([x(i)+bgap x(i)+bgap x(i+1)-bgap x(i+1)-bgap]+(1/freq/2),[ym ym+zz ym+zz ym],k);
|
||||||
ym = ym+zz;
|
ym = ym+zz;
|
||||||
end
|
end
|
||||||
hold on;
|
hold on;
|
||||||
|
@ -220,7 +225,7 @@ for j=1:nvar
|
||||||
c = uicontextmenu;
|
c = uicontextmenu;
|
||||||
hl.UIContextMenu=c;
|
hl.UIContextMenu=c;
|
||||||
browse_menu = uimenu(c,'Label','Browse group');
|
browse_menu = uimenu(c,'Label','Browse group');
|
||||||
expand_menu = uimenu(c,'Label','Expand group','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' deblank(mydata.plot_shock_decomp.orig_varlist{j}) ''',' int2str(i) ')']);
|
expand_menu = uimenu(c,'Label','Expand group','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' mydata.plot_shock_decomp.orig_varlist{j} ''',' int2str(i) ')']);
|
||||||
set(expand_menu,'UserData',mydata,'Tag',['group' int2str(i)]);
|
set(expand_menu,'UserData',mydata,'Tag',['group' int2str(i)]);
|
||||||
for jmember = mydata.shock_group.shocks
|
for jmember = mydata.shock_group.shocks
|
||||||
uimenu('parent',browse_menu,'Label',char(jmember))
|
uimenu('parent',browse_menu,'Label',char(jmember))
|
||||||
|
@ -252,6 +257,7 @@ for j=1:nvar
|
||||||
dyn_saveas(fhandle,[DynareOptions.plot_shock_decomp.filepath, filesep, DynareModel.fname,preamble_figname,endo_names{i_var(j)},fig_mode1,fig_name],DynareOptions.plot_shock_decomp.nodisplay,DynareOptions.plot_shock_decomp.graph_format);
|
dyn_saveas(fhandle,[DynareOptions.plot_shock_decomp.filepath, filesep, DynareModel.fname,preamble_figname,endo_names{i_var(j)},fig_mode1,fig_name],DynareOptions.plot_shock_decomp.nodisplay,DynareOptions.plot_shock_decomp.graph_format);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
%% write LaTeX-Footer
|
%% write LaTeX-Footer
|
||||||
|
|
|
@ -24,7 +24,7 @@ function []=graph_decomp_detail(z,shock_names,endo_names,i_var,initial_date,Dyna
|
||||||
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
% GNU General Public License for more details.
|
% GNU General Public License for more details.
|
||||||
%
|
%xf
|
||||||
% You should have received a copy of the GNU General Public License
|
% You should have received a copy of the GNU General Public License
|
||||||
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
@ -36,6 +36,7 @@ fig_mode='';
|
||||||
fig_mode1='';
|
fig_mode1='';
|
||||||
% fig_name='';
|
% fig_name='';
|
||||||
% screen_shocks=0;
|
% screen_shocks=0;
|
||||||
|
initval = DynareOptions.plot_shock_decomp.initval;
|
||||||
use_shock_groups = DynareOptions.plot_shock_decomp.use_shock_groups;
|
use_shock_groups = DynareOptions.plot_shock_decomp.use_shock_groups;
|
||||||
if use_shock_groups
|
if use_shock_groups
|
||||||
shock_groups = DynareModel.shock_groups.(use_shock_groups);
|
shock_groups = DynareModel.shock_groups.(use_shock_groups);
|
||||||
|
@ -59,6 +60,11 @@ if isfield(opts_decomp,'init_cond_decomp')
|
||||||
else
|
else
|
||||||
init_cond_decomp = 0;
|
init_cond_decomp = 0;
|
||||||
end
|
end
|
||||||
|
if isfield(opts_decomp,'min_nrows')
|
||||||
|
min_nrows = opts_decomp.min_nrows ;
|
||||||
|
else
|
||||||
|
max_nrows = 6;
|
||||||
|
end
|
||||||
screen_shocks = opts_decomp.screen_shocks;
|
screen_shocks = opts_decomp.screen_shocks;
|
||||||
if ~isempty(DynareOptions.plot_shock_decomp.use_shock_groups) || comp_nbr<=18
|
if ~isempty(DynareOptions.plot_shock_decomp.use_shock_groups) || comp_nbr<=18
|
||||||
screen_shocks=0;
|
screen_shocks=0;
|
||||||
|
@ -138,9 +144,13 @@ end
|
||||||
ncol=3;
|
ncol=3;
|
||||||
nrow=ceil(comp_nbr/ncol);
|
nrow=ceil(comp_nbr/ncol);
|
||||||
ntotrow = nrow;
|
ntotrow = nrow;
|
||||||
nrow = min(ntotrow, 6);
|
nrow = min(ntotrow, max_nrows);
|
||||||
nfigs = ceil(ntotrow/nrow);
|
nfigs = ceil(ntotrow/nrow);
|
||||||
labels = char(char(shock_names),'Initial values');
|
if initval
|
||||||
|
labels = char(char(shock_names),'All shocks');
|
||||||
|
else
|
||||||
|
labels = char(char(shock_names),'Initial values');
|
||||||
|
end
|
||||||
if ~(screen_shocks && comp_nbr>18)
|
if ~(screen_shocks && comp_nbr>18)
|
||||||
screen_shocks=0;
|
screen_shocks=0;
|
||||||
end
|
end
|
||||||
|
@ -150,7 +160,11 @@ for j=1:nvar
|
||||||
z1 = squeeze(z(i_var(j),:,:));
|
z1 = squeeze(z(i_var(j),:,:));
|
||||||
if screen_shocks,
|
if screen_shocks,
|
||||||
[~, isort] = sort(mean(abs(z1(1:end-2,:)')), 'descend');
|
[~, isort] = sort(mean(abs(z1(1:end-2,:)')), 'descend');
|
||||||
labels = char(char(shock_names(isort(1:16))),'Others', 'Initial values');
|
if initval
|
||||||
|
labels = char(char(shock_names(isort(1:16))),'Others', 'All shocks');
|
||||||
|
else
|
||||||
|
labels = char(char(shock_names(isort(1:16))),'Others', 'Initial values');
|
||||||
|
end
|
||||||
zres = sum(z1(isort(17:end),:),1);
|
zres = sum(z1(isort(17:end),:),1);
|
||||||
z1 = [z1(isort(1:16),:); zres; z1(comp_nbr0:end,:)];
|
z1 = [z1(isort(1:16),:); zres; z1(comp_nbr0:end,:)];
|
||||||
comp_nbr=18;
|
comp_nbr=18;
|
||||||
|
@ -221,7 +235,7 @@ for j=1:nvar
|
||||||
c = uicontextmenu;
|
c = uicontextmenu;
|
||||||
hax.UIContextMenu=c;
|
hax.UIContextMenu=c;
|
||||||
browse_menu = uimenu(c,'Label','Browse group');
|
browse_menu = uimenu(c,'Label','Browse group');
|
||||||
expand_menu = uimenu(c,'Label','Expand group','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' deblank(mydata.plot_shock_decomp.orig_varlist{j}) ''',' int2str(ic) ')']);
|
expand_menu = uimenu(c,'Label','Expand group','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' mydata.plot_shock_decomp.orig_varlist{j} ''',' int2str(ic) ')']);
|
||||||
set(expand_menu,'UserData',mydata,'Tag',['group' int2str(ic)]);
|
set(expand_menu,'UserData',mydata,'Tag',['group' int2str(ic)]);
|
||||||
for jmember = mydata.shock_group.shocks
|
for jmember = mydata.shock_group.shocks
|
||||||
uimenu('parent',browse_menu,'Label',char(jmember))
|
uimenu('parent',browse_menu,'Label',char(jmember))
|
||||||
|
|
|
@ -62,8 +62,10 @@ if isempty(varlist)
|
||||||
varlist = M_.endo_names(1:M_.orig_endo_nbr);
|
varlist = M_.endo_names(1:M_.orig_endo_nbr);
|
||||||
end
|
end
|
||||||
|
|
||||||
[i_var, nvar, index_uniques] = varlist_indices(varlist, M_.endo_names);
|
if ~isequal(varlist,0)
|
||||||
varlist = varlist(index_uniques);
|
[i_var, nvar, index_uniques] = varlist_indices(varlist, M_.endo_names);
|
||||||
|
varlist = varlist(index_uniques);
|
||||||
|
end
|
||||||
|
|
||||||
% number of variables
|
% number of variables
|
||||||
endo_nbr = M_.endo_nbr;
|
endo_nbr = M_.endo_nbr;
|
||||||
|
@ -83,7 +85,16 @@ if isempty(parameter_set)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if ~isfield(oo_,'initval_decomposition')
|
if ~isfield(oo_,'initval_decomposition') || isequal(varlist,0)
|
||||||
|
if isfield(oo_,'shock_decomposition_info') && isfield(oo_.shock_decomposition_info,'i_var')
|
||||||
|
if isfield (oo_,'realtime_conditional_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'realtime_forecast_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'realtime_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'conditional_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'shock_decomposition')
|
||||||
|
error('initval_decomposition::squeezed shock decompositions are already stored in oo_')
|
||||||
|
end
|
||||||
|
end
|
||||||
options_.selected_variables_only = 0; %make sure all variables are stored
|
options_.selected_variables_only = 0; %make sure all variables are stored
|
||||||
options_.plot_priors=0;
|
options_.plot_priors=0;
|
||||||
[oo,M,~,~,Smoothed_Variables_deviation_from_mean] = evaluate_smoother(parameter_set,varlist,M_,oo_,options_,bayestopt_,estim_params_);
|
[oo,M,~,~,Smoothed_Variables_deviation_from_mean] = evaluate_smoother(parameter_set,varlist,M_,oo_,options_,bayestopt_,estim_params_);
|
||||||
|
@ -129,27 +140,30 @@ if ~isfield(oo_,'initval_decomposition')
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
oo_.initval_decomposition = z;
|
oo_.initval_decomposition = z;
|
||||||
end
|
end
|
||||||
% if ~options_.no_graph.shock_decomposition
|
|
||||||
oo=oo_;
|
|
||||||
oo.shock_decomposition = oo_.initval_decomposition;
|
|
||||||
if ~isempty(init2shocks)
|
|
||||||
init2shocks = M_.init2shocks.(init2shocks);
|
|
||||||
n=size(init2shocks,1);
|
|
||||||
for i=1:n
|
|
||||||
j=strmatch(init2shocks{i}{1},M_.endo_names,'exact');
|
|
||||||
oo.shock_decomposition(:,end-1,:)=oo.shock_decomposition(:,j,:)+oo.shock_decomposition(:,end-1,:);
|
|
||||||
oo.shock_decomposition(:,j,:)=0;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
M_.exo_names = M_.endo_names;
|
|
||||||
M_.exo_nbr = M_.endo_nbr;
|
|
||||||
options_.plot_shock_decomp.realtime=0;
|
|
||||||
options_.plot_shock_decomp.screen_shocks=1;
|
|
||||||
options_.plot_shock_decomp.use_shock_groups = '';
|
|
||||||
options_.plot_shock_decomp.init_cond_decomp = 1; % private flag to plotting utilities
|
|
||||||
|
|
||||||
plot_shock_decomposition(M_,oo,options_,varlist);
|
% when varlist==0, we only store results in oo_ and do not make any plot
|
||||||
% end
|
if ~isequal(varlist,0)
|
||||||
|
|
||||||
|
% if ~options_.no_graph.shock_decomposition
|
||||||
|
oo=oo_;
|
||||||
|
oo.shock_decomposition = oo_.initval_decomposition;
|
||||||
|
if ~isempty(init2shocks)
|
||||||
|
init2shocks = M_.init2shocks.(init2shocks);
|
||||||
|
n=size(init2shocks,1);
|
||||||
|
for i=1:n
|
||||||
|
j=strmatch(init2shocks{i}{1},M_.endo_names,'exact');
|
||||||
|
oo.shock_decomposition(:,end-1,:)=oo.shock_decomposition(:,j,:)+oo.shock_decomposition(:,end-1,:);
|
||||||
|
oo.shock_decomposition(:,j,:)=0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
M_.exo_names = M_.endo_names;
|
||||||
|
M_.exo_nbr = M_.endo_nbr;
|
||||||
|
options_.plot_shock_decomp.realtime=0;
|
||||||
|
options_.plot_shock_decomp.screen_shocks=1;
|
||||||
|
options_.plot_shock_decomp.use_shock_groups = '';
|
||||||
|
options_.plot_shock_decomp.init_cond_decomp = 1; % private flag to plotting utilities
|
||||||
|
|
||||||
|
plot_shock_decomposition(M_,oo,options_,varlist);
|
||||||
|
end
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
function [z, steady_state] = plot_shock_decomposition(M_,oo_,options_,varlist)
|
function [out, steady_state] = plot_shock_decomposition(M_,oo_,options_,varlist)
|
||||||
% function plot_shock_decomposition(M_,oo_,options_,varlist)
|
% function plot_shock_decomposition(M_,oo_,options_,varlist)
|
||||||
% Plots the results of shock_decomposition
|
% Plots the results of shock_decomposition
|
||||||
%
|
%
|
||||||
|
@ -31,9 +31,23 @@ function [z, steady_state] = plot_shock_decomposition(M_,oo_,options_,varlist)
|
||||||
options_.nodisplay = options_.plot_shock_decomp.nodisplay;
|
options_.nodisplay = options_.plot_shock_decomp.nodisplay;
|
||||||
options_.graph_format = options_.plot_shock_decomp.graph_format;
|
options_.graph_format = options_.plot_shock_decomp.graph_format;
|
||||||
|
|
||||||
|
if ~isfield(oo_,'shock_decomposition_info')
|
||||||
|
oo_.shock_decomposition_info = struct();
|
||||||
|
end
|
||||||
|
if ~isfield(oo_,'plot_shock_decomposition_info')
|
||||||
|
oo_.plot_shock_decomposition_info = struct();
|
||||||
|
end
|
||||||
|
|
||||||
|
out=oo_;
|
||||||
% indices of endogenous variables
|
% indices of endogenous variables
|
||||||
if isempty(varlist)
|
exist_varlist = 1;
|
||||||
varlist = M_.endo_names(1:M_.orig_endo_nbr);
|
if size(varlist,1) == 0
|
||||||
|
exist_varlist = 0;
|
||||||
|
if size( M_.endo_names,1) >= M_.orig_endo_nbr
|
||||||
|
varlist = M_.endo_names(1:M_.orig_endo_nbr);
|
||||||
|
else
|
||||||
|
varlist = M_.endo_names;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if isfield(options_.plot_shock_decomp,'init2shocks') % private trap for uimenu calls
|
if isfield(options_.plot_shock_decomp,'init2shocks') % private trap for uimenu calls
|
||||||
|
@ -45,10 +59,66 @@ if ~isempty(init2shocks)
|
||||||
init2shocks=M_.init2shocks.(init2shocks);
|
init2shocks=M_.init2shocks.(init2shocks);
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if isfield(oo_.shock_decomposition_info,'i_var') && (M_.endo_nbr>=M_.orig_endo_nbr)
|
||||||
|
M_.endo_names = M_.endo_names(oo_.shock_decomposition_info.i_var,:);
|
||||||
|
M_.endo_names_tex = M_.endo_names_tex(oo_.shock_decomposition_info.i_var,:);
|
||||||
|
M_.endo_nbr = length( oo_.shock_decomposition_info.i_var );
|
||||||
|
end
|
||||||
|
try
|
||||||
|
[i_var,nvar,index_uniques] = varlist_indices(varlist,M_.endo_names);
|
||||||
|
catch ME
|
||||||
|
if isfield(oo_.shock_decomposition_info,'i_var')
|
||||||
|
warning('shock decomp results for some input variable was not stored: I recompute all decompositions')
|
||||||
|
M_ = evalin('base','M_');
|
||||||
|
bayestopt_ = evalin('base','bayestopt_');
|
||||||
|
estim_params_ = evalin('base','estim_params_');
|
||||||
|
options_.no_graph.shock_decomposition=1; % force nograph in computing decompositions!
|
||||||
|
oo_.shock_decomposition_info = rmfield(oo_.shock_decomposition_info,'i_var');
|
||||||
|
var_list_ = char();
|
||||||
|
disp('recomputing shock decomposition ...')
|
||||||
|
[oo_,M_]= shock_decomposition(M_,oo_,options_,var_list_,bayestopt_,estim_params_);
|
||||||
|
if isfield(oo_,'realtime_shock_decomposition') || options_.plot_shock_decomp.realtime
|
||||||
|
disp('recomputing realtime shock decomposition ...')
|
||||||
|
oo_ = realtime_shock_decomposition(M_,oo_,options_,var_list_,bayestopt_,estim_params_);
|
||||||
|
end
|
||||||
|
if isfield(oo_,'initval_decomposition')
|
||||||
|
disp('recomputing initval shock decomposition ...')
|
||||||
|
oo_ = initial_condition_decomposition(M_,oo_,options_,0,bayestopt_,estim_params_);
|
||||||
|
end
|
||||||
|
[i_var,nvar,index_uniques] = varlist_indices(varlist,M_.endo_names);
|
||||||
|
out = oo_;
|
||||||
|
else
|
||||||
|
rethrow(ME)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
[i_var, ~, index_uniques] = varlist_indices(varlist, M_.endo_names);
|
|
||||||
varlist = varlist(index_uniques);
|
varlist = varlist(index_uniques);
|
||||||
|
|
||||||
|
if ~isfield(out.shock_decomposition_info,'i_var') && exist_varlist
|
||||||
|
if ~isfield(out.plot_shock_decomposition_info,'i_var')
|
||||||
|
out.plot_shock_decomposition_info.i_var = i_var;
|
||||||
|
else
|
||||||
|
out.plot_shock_decomposition_info.i_var = unique([i_var(:); out.plot_shock_decomposition_info.i_var(:)]);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
type=options_.plot_shock_decomp.type;
|
||||||
|
if isequal(type, 'aoa') && isfield(options_.plot_shock_decomp,'q2a') && isstruct(options_.plot_shock_decomp.q2a)
|
||||||
|
q2avec=options_.plot_shock_decomp.q2a;
|
||||||
|
if nvar>1
|
||||||
|
for jv = 1:nvar
|
||||||
|
my_varlist = varlist(jv);
|
||||||
|
indv = strcmp(my_varlist,{q2avec.qname});
|
||||||
|
options_.plot_shock_decomp.q2a = q2avec(indv);
|
||||||
|
plot_shock_decomposition(M_,oo_,options_,my_varlist);
|
||||||
|
end
|
||||||
|
return
|
||||||
|
else
|
||||||
|
indv = strcmp(varlist,{q2avec.qname});
|
||||||
|
options_.plot_shock_decomp.q2a = q2avec(indv);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
% number of variables
|
% number of variables
|
||||||
endo_nbr = M_.endo_nbr;
|
endo_nbr = M_.endo_nbr;
|
||||||
|
|
||||||
|
@ -76,10 +146,14 @@ if ~isfield(options_.plot_shock_decomp,'init_cond_decomp')
|
||||||
options_.plot_shock_decomp.init_cond_decomp=0;
|
options_.plot_shock_decomp.init_cond_decomp=0;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
options_.plot_shock_decomp.initval=0;
|
||||||
if ~isempty(options_.plot_shock_decomp.fig_name)
|
if ~isempty(options_.plot_shock_decomp.fig_name)
|
||||||
fig_name=[' ' options_.plot_shock_decomp.fig_name];
|
fig_name=[' ' options_.plot_shock_decomp.fig_name];
|
||||||
|
if length(fig_name)>=8 && strcmp(fig_name(end-6:end),'initval')
|
||||||
|
options_.plot_shock_decomp.initval=1;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
type=options_.plot_shock_decomp.type;
|
|
||||||
detail_plot=options_.plot_shock_decomp.detail_plot;
|
detail_plot=options_.plot_shock_decomp.detail_plot;
|
||||||
realtime_= options_.plot_shock_decomp.realtime;
|
realtime_= options_.plot_shock_decomp.realtime;
|
||||||
vintage_ = options_.plot_shock_decomp.vintage;
|
vintage_ = options_.plot_shock_decomp.vintage;
|
||||||
|
@ -200,8 +274,8 @@ if isequal(type,'aoa') && isstruct(q2a)
|
||||||
if isempty(t0)
|
if isempty(t0)
|
||||||
error('the realtime decompositions are not stored in Q4! Please check your dates and settings.')
|
error('the realtime decompositions are not stored in Q4! Please check your dates and settings.')
|
||||||
end
|
end
|
||||||
if ~isfield(q2a,'var_type') % private trap for aoa calls
|
if ~isfield(q2a,'type') % private trap for aoa calls
|
||||||
q2a.var_type=1;
|
q2a.type=1;
|
||||||
end
|
end
|
||||||
if ~isfield(q2a,'islog') % private trap for aoa calls
|
if ~isfield(q2a,'islog') % private trap for aoa calls
|
||||||
q2a.islog=0;
|
q2a.islog=0;
|
||||||
|
@ -251,6 +325,20 @@ if options_.plot_shock_decomp.use_shock_groups
|
||||||
[z, shock_names, M_] = make_the_groups(z,gend,endo_nbr,nshocks,M_,options_);
|
[z, shock_names, M_] = make_the_groups(z,gend,endo_nbr,nshocks,M_,options_);
|
||||||
M_.endo_names = endo_names;
|
M_.endo_names = endo_names;
|
||||||
M_.endo_names_tex = endo_names_tex;
|
M_.endo_names_tex = endo_names_tex;
|
||||||
|
else
|
||||||
|
% here we know we only have one variable to handle
|
||||||
|
if isstruct(q2a.aux) && ischar(q2a.aux.y)
|
||||||
|
steady_state_aux = get_mean(q2a.aux.y);
|
||||||
|
q2a.aux.y=repmat(steady_state_aux,16,1);
|
||||||
|
q2a.aux.yss=steady_state_aux;
|
||||||
|
end
|
||||||
|
[~, yssa, ~, gyssa] = ...
|
||||||
|
quarterly2annual(repmat(steady_state,16,1),steady_state,q2a.GYTREND0,q2a.type,q2a.islog,q2a.aux);
|
||||||
|
if q2a.plot==1
|
||||||
|
steady_state = gyssa;
|
||||||
|
else
|
||||||
|
steady_state = yssa;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
gend = size(z,3);
|
gend = size(z,3);
|
||||||
|
@ -333,8 +421,8 @@ switch type
|
||||||
end
|
end
|
||||||
if isstruct(q2a)
|
if isstruct(q2a)
|
||||||
if realtime_ == 0
|
if realtime_ == 0
|
||||||
if ~isfield(q2a,'var_type') % private trap for aoa calls
|
if ~isfield(q2a,'type') % private trap for aoa calls
|
||||||
q2a.var_type=1;
|
q2a.type=1;
|
||||||
end
|
end
|
||||||
if ~isfield(q2a,'islog') % private trap for aoa calls
|
if ~isfield(q2a,'islog') % private trap for aoa calls
|
||||||
q2a.islog=0;
|
q2a.islog=0;
|
||||||
|
@ -356,17 +444,19 @@ switch type
|
||||||
if isstruct(q2a.aux) && ischar(q2a.aux.y)
|
if isstruct(q2a.aux) && ischar(q2a.aux.y)
|
||||||
opts=options_;
|
opts=options_;
|
||||||
opts.plot_shock_decomp.type='qoq';
|
opts.plot_shock_decomp.type='qoq';
|
||||||
|
opts.plot_shock_decomp.use_shock_groups=[];
|
||||||
[y_aux, steady_state_aux] = plot_shock_decomposition(M_,oo_,opts,q2a.aux.y);
|
[y_aux, steady_state_aux] = plot_shock_decomposition(M_,oo_,opts,q2a.aux.y);
|
||||||
q2a.aux.y=y_aux;
|
q2a.aux.y=y_aux;
|
||||||
q2a.aux.yss=steady_state_aux;
|
q2a.aux.yss=steady_state_aux;
|
||||||
end
|
end
|
||||||
|
i_var0 = i_var;
|
||||||
[za, endo_names, endo_names_tex, steady_state, i_var, oo_] = ...
|
[za, endo_names, endo_names_tex, steady_state, i_var, oo_] = ...
|
||||||
annualized_shock_decomposition(z,M_, options_, i_var, t0, options_.nobs, realtime_, vintage_, steady_state,q2a);
|
annualized_shock_decomposition(z,M_, options_, i_var, t0, options_.nobs, realtime_, vintage_, steady_state,q2a);
|
||||||
if options_.plot_shock_decomp.interactive && ~isempty(options_.plot_shock_decomp.use_shock_groups)
|
if options_.plot_shock_decomp.interactive && ~isempty(options_.plot_shock_decomp.use_shock_groups)
|
||||||
mygroup = options_.plot_shock_decomp.use_shock_groups;
|
mygroup = options_.plot_shock_decomp.use_shock_groups;
|
||||||
options_.plot_shock_decomp.use_shock_groups='';
|
options_.plot_shock_decomp.use_shock_groups='';
|
||||||
zafull = ...
|
zafull = ...
|
||||||
annualized_shock_decomposition(z,M_, options_, i_var, t0, options_.nobs, realtime_, vintage_, steady_state,q2a);
|
annualized_shock_decomposition(zfull(i_var0,:,:),M_, options_, i_var, t0, options_.nobs, realtime_, vintage_, steady_state,q2a);
|
||||||
options_.plot_shock_decomp.use_shock_groups = mygroup;
|
options_.plot_shock_decomp.use_shock_groups = mygroup;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -378,7 +468,7 @@ switch type
|
||||||
M_.endo_names = endo_names;
|
M_.endo_names = endo_names;
|
||||||
M_.endo_names_tex = endo_names_tex;
|
M_.endo_names_tex = endo_names_tex;
|
||||||
% endo_nbr = size(z,1);
|
% endo_nbr = size(z,1);
|
||||||
if realtime_<2
|
if realtime_<2 || vintage_ == 0
|
||||||
initial_date = initial_date1;
|
initial_date = initial_date1;
|
||||||
else
|
else
|
||||||
initial_date = initial_date0;
|
initial_date = initial_date0;
|
||||||
|
@ -412,8 +502,8 @@ if steadystate
|
||||||
options_.plot_shock_decomp.steady_state=steady_state;
|
options_.plot_shock_decomp.steady_state=steady_state;
|
||||||
end
|
end
|
||||||
|
|
||||||
if nargout
|
if nargout == 2
|
||||||
z=z(i_var,:,:);
|
out=z(i_var,:,:);
|
||||||
steady_state = steady_state(i_var);
|
steady_state = steady_state(i_var);
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -427,7 +517,11 @@ if ~isempty(options_.plot_shock_decomp.plot_init_date)
|
||||||
a = find((initial_date:initial_date+b-1)==options_.plot_shock_decomp.plot_init_date);
|
a = find((initial_date:initial_date+b-1)==options_.plot_shock_decomp.plot_init_date);
|
||||||
end
|
end
|
||||||
if ~isempty(options_.plot_shock_decomp.plot_end_date)
|
if ~isempty(options_.plot_shock_decomp.plot_end_date)
|
||||||
b = find((initial_date:initial_date+b-1)==options_.plot_shock_decomp.plot_end_date);
|
if options_.plot_shock_decomp.plot_end_date<=(max(initial_date:initial_date+b-1))
|
||||||
|
b = find((initial_date:initial_date+b-1)==options_.plot_shock_decomp.plot_end_date);
|
||||||
|
else
|
||||||
|
warning('You set plot_end_date larger than smoother size!!');
|
||||||
|
end
|
||||||
end
|
end
|
||||||
z = z(:,:,a:b);
|
z = z(:,:,a:b);
|
||||||
% end crop data
|
% end crop data
|
||||||
|
@ -438,10 +532,12 @@ if options_.plot_shock_decomp.interactive && ~isempty(options_.plot_shock_decomp
|
||||||
options_.plot_shock_decomp.zfull = zfull;
|
options_.plot_shock_decomp.zfull = zfull;
|
||||||
end
|
end
|
||||||
|
|
||||||
if detail_plot
|
if ~options_.no_graph.plot_shock_decomposition
|
||||||
graph_decomp_detail(z, shock_names, M_.endo_names, i_var, my_initial_date, M_, options_)
|
if detail_plot
|
||||||
else
|
graph_decomp_detail(z, shock_names, M_.endo_names, i_var, my_initial_date, M_, options_);
|
||||||
graph_decomp(z, shock_names, M_.endo_names, i_var, my_initial_date, M_, options_);
|
else
|
||||||
|
graph_decomp(z, shock_names, M_.endo_names, i_var, my_initial_date, M_, options_);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if write_xls
|
if write_xls
|
||||||
|
|
|
@ -39,6 +39,18 @@ function oo_ = realtime_shock_decomposition(M_,oo_,options_,varlist,bayestopt_,e
|
||||||
% You should have received a copy of the GNU General Public License
|
% You should have received a copy of the GNU General Public License
|
||||||
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
if isfield(oo_,'shock_decomposition_info') && isfield(oo_.shock_decomposition_info,'i_var')
|
||||||
|
if isfield (oo_,'realtime_conditional_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'realtime_forecast_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'realtime_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'conditional_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'initval_decomposition')
|
||||||
|
error('realtime_shock_decomposition::squeezed shock decompositions are already stored in oo_')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
% indices of endogenous variables
|
% indices of endogenous variables
|
||||||
if isempty(varlist)
|
if isempty(varlist)
|
||||||
varlist = M_.endo_names(1:M_.orig_endo_nbr);
|
varlist = M_.endo_names(1:M_.orig_endo_nbr);
|
||||||
|
@ -68,9 +80,10 @@ if isempty(parameter_set)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
presample = max(1,options_.presample);
|
presample = max(1,options_.presample-1);
|
||||||
if isfield(options_.shock_decomp,'presample')
|
if isfield(options_.shock_decomp,'presample')
|
||||||
presample = max(presample,options_.shock_decomp.presample);
|
my_presample = max(1,options_.shock_decomp.presample);
|
||||||
|
presample = min(presample,my_presample);
|
||||||
end
|
end
|
||||||
% forecast_=0;
|
% forecast_=0;
|
||||||
forecast_ = options_.shock_decomp.forecast;
|
forecast_ = options_.shock_decomp.forecast;
|
||||||
|
@ -244,7 +257,9 @@ for j=presample+1:nobs
|
||||||
% zn(:,1:nshocks,i) = zn(:,1:nshocks,i) + B(inv_order_var,:).*repmat(epsilon(:,i+gend-forecast_-1)',endo_nbr,1);
|
% zn(:,1:nshocks,i) = zn(:,1:nshocks,i) + B(inv_order_var,:).*repmat(epsilon(:,i+gend-forecast_-1)',endo_nbr,1);
|
||||||
zn(:,nshocks+1,i) = zn(:,nshocks+2,i) - sum(zn(:,1:nshocks,i),2);
|
zn(:,nshocks+1,i) = zn(:,nshocks+2,i) - sum(zn(:,1:nshocks,i),2);
|
||||||
end
|
end
|
||||||
oo_.conditional_shock_decomposition.(['time_' int2str(j-forecast_)])=zn;
|
if ismember(j-forecast_,save_realtime)
|
||||||
|
oo_.conditional_shock_decomposition.(['time_' int2str(j-forecast_)])=zn;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
@ -260,28 +275,39 @@ for j=presample+1:nobs
|
||||||
|
|
||||||
if forecast_
|
if forecast_
|
||||||
zfrcst(:,:,j+1) = z(:,:,gend+1);
|
zfrcst(:,:,j+1) = z(:,:,gend+1);
|
||||||
oo_.realtime_forecast_shock_decomposition.(['time_' int2str(j)])=z(:,:,gend:end);
|
ootmp.realtime_forecast_shock_decomposition.(['time_' int2str(j)])=z(:,:,gend:end);
|
||||||
|
if ismember(j,save_realtime)
|
||||||
|
oo_.realtime_forecast_shock_decomposition.(['time_' int2str(j)]) = ...
|
||||||
|
ootmp.realtime_forecast_shock_decomposition.(['time_' int2str(j)]);
|
||||||
|
end
|
||||||
if j>forecast_+presample
|
if j>forecast_+presample
|
||||||
%% realtime conditional shock decomp k step ahead
|
%% realtime conditional shock decomp k step ahead
|
||||||
oo_.realtime_conditional_shock_decomposition.(['time_' int2str(j-forecast_)]) = ...
|
ootmp.realtime_conditional_shock_decomposition.(['time_' int2str(j-forecast_)]) = ...
|
||||||
zreal(:,:,j-forecast_:j) - ...
|
zreal(:,:,j-forecast_:j) - ...
|
||||||
oo_.realtime_forecast_shock_decomposition.(['time_' int2str(j-forecast_)]);
|
ootmp.realtime_forecast_shock_decomposition.(['time_' int2str(j-forecast_)]);
|
||||||
oo_.realtime_conditional_shock_decomposition.(['time_' int2str(j-forecast_)])(:,end-1,:) = ...
|
ootmp.realtime_conditional_shock_decomposition.(['time_' int2str(j-forecast_)])(:,end-1,:) = ...
|
||||||
oo_.realtime_conditional_shock_decomposition.(['time_' int2str(j-forecast_)])(:,end-1,:) + ...
|
ootmp.realtime_conditional_shock_decomposition.(['time_' int2str(j-forecast_)])(:,end-1,:) + ...
|
||||||
oo_.realtime_forecast_shock_decomposition.(['time_' int2str(j-forecast_)])(:,end,:);
|
ootmp.realtime_forecast_shock_decomposition.(['time_' int2str(j-forecast_)])(:,end,:);
|
||||||
oo_.realtime_conditional_shock_decomposition.(['time_' int2str(j-forecast_)])(:,end,:) = ...
|
ootmp.realtime_conditional_shock_decomposition.(['time_' int2str(j-forecast_)])(:,end,:) = ...
|
||||||
zreal(:,end,j-forecast_:j);
|
zreal(:,end,j-forecast_:j);
|
||||||
|
if ismember(j-forecast_,save_realtime)
|
||||||
|
oo_.realtime_conditional_shock_decomposition.(['time_' int2str(j-forecast_)]) = ...
|
||||||
|
ootmp.realtime_conditional_shock_decomposition.(['time_' int2str(j-forecast_)]);
|
||||||
|
end
|
||||||
if j==nobs
|
if j==nobs
|
||||||
for my_forecast_=(forecast_-1):-1:1
|
for my_forecast_=(forecast_-1):-1:1
|
||||||
oo_.realtime_conditional_shock_decomposition.(['time_' int2str(j-my_forecast_)]) = ...
|
ootmp.realtime_conditional_shock_decomposition.(['time_' int2str(j-my_forecast_)]) = ...
|
||||||
zreal(:,:,j-my_forecast_:j) - ...
|
zreal(:,:,j-my_forecast_:j) - ...
|
||||||
oo_.realtime_forecast_shock_decomposition.(['time_' int2str(j-my_forecast_)])(:,:,1:my_forecast_+1);
|
ootmp.realtime_forecast_shock_decomposition.(['time_' int2str(j-my_forecast_)])(:,:,1:my_forecast_+1);
|
||||||
oo_.realtime_conditional_shock_decomposition.(['time_' int2str(j-my_forecast_)])(:,end-1,:) = ...
|
ootmp.realtime_conditional_shock_decomposition.(['time_' int2str(j-my_forecast_)])(:,end-1,:) = ...
|
||||||
oo_.realtime_conditional_shock_decomposition.(['time_' int2str(j-my_forecast_)])(:,end-1,:) + ...
|
ootmp.realtime_conditional_shock_decomposition.(['time_' int2str(j-my_forecast_)])(:,end-1,:) + ...
|
||||||
oo_.realtime_forecast_shock_decomposition.(['time_' int2str(j-my_forecast_)])(:,end,1:my_forecast_+1);
|
ootmp.realtime_forecast_shock_decomposition.(['time_' int2str(j-my_forecast_)])(:,end,1:my_forecast_+1);
|
||||||
oo_.realtime_conditional_shock_decomposition.(['time_' int2str(j-my_forecast_)])(:,end,:) = ...
|
ootmp.realtime_conditional_shock_decomposition.(['time_' int2str(j-my_forecast_)])(:,end,:) = ...
|
||||||
zreal(:,end,j-my_forecast_:j);
|
zreal(:,end,j-my_forecast_:j);
|
||||||
|
if ismember(j-my_forecast_,save_realtime)
|
||||||
|
oo_.realtime_conditional_shock_decomposition.(['time_' int2str(j-my_forecast_)]) = ...
|
||||||
|
ootmp.realtime_conditional_shock_decomposition.(['time_' int2str(j-my_forecast_)]);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ if isempty(options.(field))
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if ~iscell(options.(field)) && ~isdates(options.(field))
|
if ~iscell(options.(field)) && ~isdates(options.(field)) && ~isstruct(options.(field))
|
||||||
if isnan(options.(field))
|
if isnan(options.(field))
|
||||||
options.(field) = default;
|
options.(field) = default;
|
||||||
return
|
return
|
||||||
|
|
|
@ -41,6 +41,16 @@ function [oo_,M_] = shock_decomposition(M_,oo_,options_,varlist,bayestopt_,estim
|
||||||
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
% indices of endogenous variables
|
% indices of endogenous variables
|
||||||
|
|
||||||
|
if isfield(oo_,'shock_decomposition_info') && isfield(oo_.shock_decomposition_info,'i_var')
|
||||||
|
if isfield (oo_,'realtime_conditional_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'realtime_forecast_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'realtime_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'conditional_shock_decomposition') ...
|
||||||
|
|| isfield (oo_,'initval_decomposition')
|
||||||
|
error('shock_decomposition::squeezed shock decompositions are already stored in oo_')
|
||||||
|
end
|
||||||
|
end
|
||||||
if isempty(varlist)
|
if isempty(varlist)
|
||||||
varlist = M_.endo_names(1:M_.orig_endo_nbr);
|
varlist = M_.endo_names(1:M_.orig_endo_nbr);
|
||||||
end
|
end
|
||||||
|
@ -123,5 +133,5 @@ end
|
||||||
oo_.shock_decomposition = z;
|
oo_.shock_decomposition = z;
|
||||||
|
|
||||||
if ~options_.no_graph.shock_decomposition
|
if ~options_.no_graph.shock_decomposition
|
||||||
plot_shock_decomposition(M_,oo_,options_,varlist);
|
oo_ = plot_shock_decomposition(M_,oo_,options_,varlist);
|
||||||
end
|
end
|
|
@ -0,0 +1,63 @@
|
||||||
|
function oo_ = squeeze_shock_decomp(M_,oo_,options_,var_list_)
|
||||||
|
|
||||||
|
if isfield(oo_,'plot_shock_decomposition_info') && isfield(oo_.plot_shock_decomposition_info','i_var')
|
||||||
|
my_vars = oo_.plot_shock_decomposition_info.i_var;
|
||||||
|
else
|
||||||
|
my_vars=[];
|
||||||
|
end
|
||||||
|
if nargin>3
|
||||||
|
my_vars = [varlist_indices(var_list_,M_.endo_names); my_vars];
|
||||||
|
end
|
||||||
|
sd_vlist = M_.endo_names(my_vars,:);
|
||||||
|
|
||||||
|
if isfield(options_.plot_shock_decomp,'q2a') && isstruct(options_.plot_shock_decomp.q2a)
|
||||||
|
|
||||||
|
avname={options_.plot_shock_decomp.q2a.qname};
|
||||||
|
sda = options_.plot_shock_decomp.q2a(ismember(avname,sd_vlist));
|
||||||
|
for k=1:length(sda)
|
||||||
|
if isstruct(sda(k).aux)
|
||||||
|
sd_vlist = [sd_vlist; {sda(k).aux.y}];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if isempty(sd_vlist)
|
||||||
|
disp('Nothing has been squeezed: there is no list of variables for it!')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
i_var = varlist_indices(sd_vlist,M_.endo_names);
|
||||||
|
|
||||||
|
oo_.plot_shock_decomposition_info.i_var = i_var;
|
||||||
|
oo_.shock_decomposition_info.i_var = i_var;
|
||||||
|
if isfield (oo_,'shock_decomposition')
|
||||||
|
oo_.shock_decomposition = oo_.shock_decomposition(i_var,:,:);
|
||||||
|
end
|
||||||
|
if isfield (oo_,'realtime_conditional_shock_decomposition')
|
||||||
|
oo_.realtime_conditional_shock_decomposition = ...
|
||||||
|
my_squeeze(oo_.realtime_conditional_shock_decomposition, i_var);
|
||||||
|
end
|
||||||
|
if isfield (oo_,'realtime_forecast_shock_decomposition')
|
||||||
|
oo_.realtime_forecast_shock_decomposition = ...
|
||||||
|
my_squeeze(oo_.realtime_forecast_shock_decomposition, i_var);
|
||||||
|
end
|
||||||
|
if isfield (oo_,'realtime_shock_decomposition')
|
||||||
|
oo_.realtime_shock_decomposition = ...
|
||||||
|
my_squeeze(oo_.realtime_shock_decomposition, i_var);
|
||||||
|
end
|
||||||
|
if isfield (oo_,'conditional_shock_decomposition')
|
||||||
|
oo_.conditional_shock_decomposition = ...
|
||||||
|
my_squeeze(oo_.conditional_shock_decomposition, i_var);
|
||||||
|
end
|
||||||
|
if isfield (oo_,'initval_decomposition')
|
||||||
|
oo_.initval_decomposition = oo_.initval_decomposition(i_var,:,:);
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function shock_decomposition = my_squeeze(shock_decomposition, i_var)
|
||||||
|
fnam = fieldnames(shock_decomposition);
|
||||||
|
for k=1:length(fnam)
|
||||||
|
shock_decomposition.(fnam{k}) = shock_decomposition.(fnam{k})(i_var,:,:);
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -83,10 +83,14 @@ A e_A;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
options_.initial_date=dates('1989Q4'); % date arbitrarily set for testing purposes
|
options_.initial_date=dates('1989Q4'); % date arbitrarily set for testing purposes
|
||||||
shock_decomposition(use_shock_groups=trade) y_obs R_obs pie_obs dq de;
|
shock_decomposition(nograph);
|
||||||
|
// test for nothing to squeeze
|
||||||
|
oo_ = squeeze_shock_decomp(M_,oo_,options_);
|
||||||
|
|
||||||
// standard plot
|
// standard plot
|
||||||
plot_shock_decomposition y_obs R_obs pie_obs dq de;
|
plot_shock_decomposition y_obs R_obs pie_obs dq de;
|
||||||
|
// grouped shocks
|
||||||
|
plot_shock_decomposition(use_shock_groups=trade) y_obs R_obs pie_obs dq de;
|
||||||
|
|
||||||
// test datailed, custom name and yoy plots
|
// test datailed, custom name and yoy plots
|
||||||
plot_shock_decomposition(detail_plot, fig_name = MR, type = yoy) y_obs R_obs pie_obs dq de;
|
plot_shock_decomposition(detail_plot, fig_name = MR, type = yoy) y_obs R_obs pie_obs dq de;
|
||||||
|
@ -107,6 +111,9 @@ close all,
|
||||||
// first compute realtime decompositions [pre-processor not yet available]
|
// first compute realtime decompositions [pre-processor not yet available]
|
||||||
realtime_shock_decomposition(forecast=8, save_realtime=[5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77]) y_obs R_obs pie_obs dq de;
|
realtime_shock_decomposition(forecast=8, save_realtime=[5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77]) y_obs R_obs pie_obs dq de;
|
||||||
|
|
||||||
|
// test squeeze
|
||||||
|
oo_ = squeeze_shock_decomp(M_,oo_,options_);
|
||||||
|
|
||||||
//realtime pooled
|
//realtime pooled
|
||||||
plot_shock_decomposition(realtime = 1) y_obs R_obs pie_obs dq de;
|
plot_shock_decomposition(realtime = 1) y_obs R_obs pie_obs dq de;
|
||||||
|
|
||||||
|
@ -129,6 +136,7 @@ close all,
|
||||||
// now I test annualized variables
|
// now I test annualized variables
|
||||||
// options_.plot_shock_decomp.q2a=1;
|
// options_.plot_shock_decomp.q2a=1;
|
||||||
// options_.plot_shock_decomp.islog=1;
|
// options_.plot_shock_decomp.islog=1;
|
||||||
|
// this also triggers re-computing of decompositions since y was not present in squeeze set
|
||||||
plot_shock_decomposition(detail_plot, type = aoa) y;
|
plot_shock_decomposition(detail_plot, type = aoa) y;
|
||||||
|
|
||||||
plot_shock_decomposition(realtime = 1) y;
|
plot_shock_decomposition(realtime = 1) y;
|
||||||
|
@ -148,6 +156,9 @@ close all,
|
||||||
// testing realtime decomposition with fast_realtime option
|
// testing realtime decomposition with fast_realtime option
|
||||||
realtime_shock_decomposition(fast_realtime=75) y_obs R_obs pie_obs dq de;
|
realtime_shock_decomposition(fast_realtime=75) y_obs R_obs pie_obs dq de;
|
||||||
|
|
||||||
|
// re-test squeeze
|
||||||
|
oo_ = squeeze_shock_decomp(M_,oo_,options_);
|
||||||
|
|
||||||
collect_latex_files;
|
collect_latex_files;
|
||||||
if system(['pdflatex -halt-on-error -interaction=batchmode ' M_.fname '_TeX_binder.tex'])
|
if system(['pdflatex -halt-on-error -interaction=batchmode ' M_.fname '_TeX_binder.tex'])
|
||||||
error('TeX-File did not compile.')
|
error('TeX-File did not compile.')
|
||||||
|
|
Loading…
Reference in New Issue