plot_shock_decomposition stores info of plotted variables. This can be optionally used by squeeze_shock_decomp to store in oo_ only variables plotted so far. Users can optionally define the list of vars to sotre in squeezed oo_ for shock decomps. Also allow aoa plots for lists of input variables. fixed error in wrong field name var_type of q2a. fixed aoa call, storing the wrong decomp data for interactive mode.

time-shift
Marco Ratto 2019-06-05 23:11:21 +02:00
parent f167c01eee
commit 8b9d7490e3
2 changed files with 140 additions and 10 deletions

View File

@ -28,12 +28,19 @@ function [z, steady_state] = plot_shock_decomposition(M_,oo_,options_,varlist)
% 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/>.
options0 = evalin('base','options_'); % this is to store in global options the index of variables plotted
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;
% 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
@ -46,9 +53,67 @@ if ~isempty(init2shocks)
end end
[i_var, ~, index_uniques] = varlist_indices(varlist, M_.endo_names); if isfield(options_.shock_decomp,'i_var') && (M_.endo_nbr>=M_.orig_endo_nbr)
M_.endo_names = M_.endo_names(options_.shock_decomp.i_var,:);
M_.endo_names_tex = M_.endo_names_tex(options_.shock_decomp.i_var,:);
M_.endo_nbr = length( options_.shock_decomp.i_var );
end
try
[i_var,nvar,index_uniques] = varlist_indices(varlist,M_.endo_names);
catch ME
if isfield(options_.shock_decomp,'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_');
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
assignin('base','oo_',oo_)
[i_var,nvar,index_uniques] = varlist_indices(varlist,M_.endo_names);
options_.shock_decomp = rmfield(options_.shock_decomp,'i_var');
options0.shock_decomp = rmfield(options0.shock_decomp,'i_var');
else
rethrow(ME)
end
end
varlist = varlist(index_uniques); varlist = varlist(index_uniques);
if ~isfield(options0.shock_decomp,'i_var') && exist_varlist
if ~isfield(options0.plot_shock_decomp,'i_var')
options0.plot_shock_decomp.i_var = i_var;
else
options0.plot_shock_decomp.i_var = union(i_var, options0.plot_shock_decomp.i_var);
end
assignin('base','options_',options0)
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 +141,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 +269,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 +320,15 @@ 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
[~, 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 +411,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;
@ -360,13 +438,14 @@ switch type
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 +457,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;

View File

@ -0,0 +1,51 @@
function [oo_,options_] = squeeze_shock_decomp(M_,oo_,options_,sd_vlist)
if nargin==3
% automatic selection from history of plot_shock_decomp
sd_vlist = M_.endo_names(options_.plot_shock_decomp.i_var);
end
if 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
i_var = varlist_indices(sd_vlist,M_.endo_names);
options_.shock_decomp.i_var = i_var;
oo_.shock_decomposition = oo_.shock_decomposition(i_var,:,:);
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