diff --git a/matlab/expand_group.m b/matlab/expand_group.m index 4700de889162e3ddfa209217a5c9d89339e9ae6b..8011b471b9572b35e3db3bd2151174cac8f43383 100644 --- a/matlab/expand_group.m +++ b/matlab/expand_group.m @@ -51,6 +51,7 @@ for j=1:length(shocks) M.shock_groups.(options.plot_shock_decomp.use_shock_groups).(['group' int2str(j)]).label=shocks{j}; M.shock_groups.(options.plot_shock_decomp.use_shock_groups).(['group' int2str(j)]).shocks=shocks(j); end +M.exo_names = mydata.exo_names; options.plot_shock_decomp.interactive=0; options.plot_shock_decomp.expand=1; diff --git a/matlab/graph_decomp.m b/matlab/graph_decomp.m index 2f24e17c7c07217fc7a04ebfefec20105e6e5d53..b0c865f130065a2c47b98d4c70a95cda13940f18 100644 --- a/matlab/graph_decomp.m +++ b/matlab/graph_decomp.m @@ -51,25 +51,6 @@ if ~isempty(opts_decomp.type) fig_mode = [fig_mode '_']; end -if isfield(opts_decomp,'flip') - flip_decomp = opts_decomp.flip ; -else - flip_decomp = 0; -end -if flip_decomp - fig_mode1 = [fig_mode1 '_flip']; - fig_mode = [fig_mode 'flip_']; -end - -if isfield(opts_decomp,'diff') - differentiate_decomp = opts_decomp.diff ; -else - differentiate_decomp = 0; -end -if differentiate_decomp - fig_mode1 = [fig_mode1 '_diff']; - fig_mode = [fig_mode 'diff_']; -end if isfield(opts_decomp,'init_cond_decomp') init_cond_decomp = opts_decomp.init_cond_decomp ; else @@ -232,8 +213,9 @@ for j=1:nvar mydata.first_obs = DynareOptions.first_obs; mydata.nobs = DynareOptions.nobs; mydata.plot_shock_decomp.zfull = DynareOptions.plot_shock_decomp.zfull(i_var(j),:,:); - mydata.endo_names = endo_names{i_var(j)}; - mydata.endo_names_tex = DynareModel.endo_names_tex{i_var(j)}; + mydata.endo_names = endo_names(i_var(j)); + mydata.endo_names_tex = DynareModel.endo_names_tex(i_var(j)); + mydata.exo_names = DynareModel.exo_names; if ~isempty(mydata.shock_group.shocks) c = uicontextmenu; hl.UIContextMenu=c; @@ -266,8 +248,9 @@ for j=1:nvar fprintf(fidTeX,' \n'); end else - 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); - + if ~isempty(DynareOptions.plot_shock_decomp.filepath) + 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 diff --git a/matlab/graph_decomp_detail.m b/matlab/graph_decomp_detail.m index 59e1c45026e59be6108fb82f817ff631c1187422..7ff2be01b165534759cd5c7e21c946481366c90e 100644 --- a/matlab/graph_decomp_detail.m +++ b/matlab/graph_decomp_detail.m @@ -53,25 +53,7 @@ if ~isempty(opts_decomp.type) fig_mode1 = ['_' fig_mode]; fig_mode = [fig_mode '_']; end -if isfield(opts_decomp,'flip') - flip_decomp = opts_decomp.flip ; -else - flip_decomp = 0; -end -if flip_decomp - fig_mode1 = [fig_mode1 '_flip']; - fig_mode = [fig_mode 'flip_']; -end -if isfield(opts_decomp,'diff') - differentiate_decomp = opts_decomp.diff ; -else - differentiate_decomp = 0; -end -if differentiate_decomp - fig_mode1 = [fig_mode1 '_diff']; - fig_mode = [fig_mode 'diff_']; -end if isfield(opts_decomp,'init_cond_decomp') init_cond_decomp = opts_decomp.init_cond_decomp ; else @@ -232,8 +214,9 @@ for j=1:nvar mydata.first_obs = DynareOptions.first_obs; mydata.nobs = DynareOptions.nobs; mydata.plot_shock_decomp.zfull = DynareOptions.plot_shock_decomp.zfull(i_var(j),:,:); - mydata.endo_names = endo_names{i_var(j)}; - mydata.endo_names_tex = DynareModel.endo_names_tex{i_var(j)}; + mydata.endo_names = endo_names(i_var(j)); + mydata.endo_names_tex = DynareModel.endo_names_tex(i_var(j)); + mydata.exo_names = DynareModel.exo_names; if ~isempty(mydata.shock_group.shocks) c = uicontextmenu; hax.UIContextMenu=c; @@ -289,8 +272,9 @@ for j=1:nvar fprintf(fidTeX,' \n'); end else - dyn_saveas(fhandle,[DynareOptions.plot_shock_decomp.filepath, filesep, DynareModel.fname,preamble_figname,endo_names{i_var(j)},fig_mode1,fig_name suffix],DynareOptions.plot_shock_decomp.nodisplay,DynareOptions.plot_shock_decomp.graph_format); - + if ~isempty(DynareOptions.plot_shock_decomp.filepath) + dyn_saveas(fhandle,[DynareOptions.plot_shock_decomp.filepath, filesep, DynareModel.fname,preamble_figname,endo_names{i_var(j)},fig_mode1,fig_name suffix],DynareOptions.plot_shock_decomp.nodisplay,DynareOptions.plot_shock_decomp.graph_format); + end end end end diff --git a/matlab/initial_condition_decomposition.m b/matlab/initial_condition_decomposition.m index e8a2b72d9fcb1de9b56e280e8c7ba01861f4c536..f6164cab23a328a0034b2784d6f1d08661c4b025 100644 --- a/matlab/initial_condition_decomposition.m +++ b/matlab/initial_condition_decomposition.m @@ -43,6 +43,7 @@ options_.plot_shock_decomp.nodisplay = options_.initial_condition_decomp.nodispl options_.plot_shock_decomp.graph_format = options_.initial_condition_decomp.graph_format; options_.plot_shock_decomp.fig_name = options_.initial_condition_decomp.fig_name; options_.plot_shock_decomp.detail_plot = options_.initial_condition_decomp.detail_plot; +options_.plot_shock_decomp.init2shocks = options_.initial_condition_decomp.init2shocks; options_.plot_shock_decomp.steadystate = options_.initial_condition_decomp.steadystate; options_.plot_shock_decomp.write_xls = options_.initial_condition_decomp.write_xls; options_.plot_shock_decomp.type = options_.initial_condition_decomp.type; @@ -51,6 +52,11 @@ options_.plot_shock_decomp.plot_end_date = options_.initial_condition_decomp.plo options_.plot_shock_decomp.diff = options_.initial_condition_decomp.diff; options_.plot_shock_decomp.flip = options_.initial_condition_decomp.flip; +if isfield(options_.initial_condition_decomp,'init2shocks') % private trap for uimenu calls + init2shocks=options_.initial_condition_decomp.init2shocks; +else + init2shocks=[]; +end % indices of endogenous variables if isempty(varlist) varlist = M_.endo_names(1:M_.orig_endo_nbr); @@ -129,6 +135,15 @@ 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; @@ -137,4 +152,4 @@ 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 \ No newline at end of file +% end diff --git a/matlab/plot_shock_decomposition.m b/matlab/plot_shock_decomposition.m index d649fc0615fc6ecfde4e425030ada53edc59869d..3033b2e229832d2d0845030cc30ef85f07c670a1 100644 --- a/matlab/plot_shock_decomposition.m +++ b/matlab/plot_shock_decomposition.m @@ -36,6 +36,16 @@ if isempty(varlist) varlist = M_.endo_names(1:M_.orig_endo_nbr); end +if isfield(options_.plot_shock_decomp,'init2shocks') % private trap for uimenu calls + init2shocks=options_.plot_shock_decomp.init2shocks; +else + init2shocks=[]; +end +if ~isempty(init2shocks) + init2shocks=M_.init2shocks.(init2shocks); +end + + [i_var, ~, index_uniques] = varlist_indices(varlist, M_.endo_names); varlist = varlist(index_uniques); @@ -151,6 +161,24 @@ switch realtime_ end end + +if ~isempty(init2shocks) && ~expand + n=size(init2shocks,1); + M_.exo_names_init=M_.exo_names; + for i=1:n + j=strmatch(init2shocks{i}{1},M_.endo_names,'exact'); + if ~isempty(init2shocks{i}{2}) + jj=strmatch(init2shocks{i}{2},M_.exo_names,'exact'); + M_.exo_names_init{jj}=[M_.exo_names_init{jj} ' + ' M_.endo_names{j}]; + z(:,jj,:)= z(:,jj,:) + oo_.initval_decomposition (:,j,:); + else + z(:,end,:)= z(:,end,:) - oo_.initval_decomposition (:,j,:); + end + z(:,end-1,:)= z(:,end-1,:) - oo_.initval_decomposition (:,j,:); + + end +end + if isfield(oo_.dr,'ys') steady_state = oo_.dr.ys; else @@ -208,6 +236,7 @@ end if ~expand fig_name = fig_name1; end + if options_.plot_shock_decomp.use_shock_groups fig_name=[fig_name ' group ' options_.plot_shock_decomp.use_shock_groups]; if expand @@ -228,10 +257,28 @@ if options_.plot_shock_decomp.use_shock_groups zfull = z; [z, shock_names, M_] = make_the_groups(z,gend,endo_nbr,nshocks,M_,options_); end + if ~isempty(init2shocks) && ~expand + M_.exo_names=M_.exo_names_init; + end else + if ~isempty(init2shocks) && ~expand + M_.exo_names=M_.exo_names_init; + end shock_names = M_.exo_names; end +if ~expand + if flip_decomp + fig_name=[fig_name ' flip']; + end + if differentiate_decomp + fig_name=[fig_name ' diff']; + end + if ~isempty(init2shocks) + fig_name=[fig_name ' init2shocks']; + end +end + func = @(x) colorspace('RGB->Lab',x); MAP = distinguishable_colors(size(z,2)-1,'w',func); % MAP = [MAP; MAP(end,:)]; @@ -390,6 +437,7 @@ options_.plot_shock_decomp.orig_varlist = varlist; if options_.plot_shock_decomp.interactive && ~isempty(options_.plot_shock_decomp.use_shock_groups) options_.plot_shock_decomp.zfull = zfull; end + if detail_plot graph_decomp_detail(z, shock_names, M_.endo_names, i_var, my_initial_date, M_, options_) else @@ -408,18 +456,30 @@ shock_groups = M_.shock_groups.(options_.plot_shock_decomp.use_shock_groups); shock_ind = fieldnames(shock_groups); ngroups = length(shock_ind); shock_names = shock_ind; +shock_varexo = shock_ind; for i=1:ngroups shock_names{i} = (shock_groups.(shock_ind{i}).label); + if isfield(M_,'exo_names_init') + shock_varexo{i} = (shock_groups.(shock_ind{i}).shocks); + end end zz = zeros(endo_nbr,ngroups+2,gend); kcum=[]; for i=1:ngroups + indx=0; for j = shock_groups.(shock_ind{i}).shocks k = find(strcmp(j,cellstr(M_.exo_names))); + if isfield(M_,'exo_names_init') + indx=indx+1; + shock_varexo{i}{indx} = M_.exo_names_init{k}; + end zz(:,i,:) = zz(:,i,:) + z(:,k,:); z(:,k,:) = 0; kcum = [kcum k]; end + if isfield(M_,'exo_names_init') + shock_groups.(shock_ind{i}).shocks = shock_varexo{i}; + end end zothers = sum(z(:,1:nshocks,:),2); shock_groups.(['group' int2str(ngroups+1)]).label = 'Others'; diff --git a/matlab/set_default_initial_condition_decomposition_options.m b/matlab/set_default_initial_condition_decomposition_options.m index 3294d969b41d4d4631814940c5cf9fe4efb793d5..58ecfff142d2f6c6d613d667964f0f5931b7a0b4 100644 --- a/matlab/set_default_initial_condition_decomposition_options.m +++ b/matlab/set_default_initial_condition_decomposition_options.m @@ -33,6 +33,7 @@ options.initial_condition_decomp.nodisplay = false; options.initial_condition_decomp.graph_format = 'eps'; options.initial_condition_decomp.fig_name = ''; options.initial_condition_decomp.detail_plot = false; +options.initial_condition_decomp.init2shocks = []; options.initial_condition_decomp.steadystate = false; options.initial_condition_decomp.write_xls = false; options.initial_condition_decomp.type = ''; diff --git a/matlab/set_default_plot_shock_decomposition_options.m b/matlab/set_default_plot_shock_decomposition_options.m index 5ffd23cb51668144e17c240de81d25e8fb5e1099..ecef090bf7a648d659cf505b3af32725291f29fd 100644 --- a/matlab/set_default_plot_shock_decomposition_options.m +++ b/matlab/set_default_plot_shock_decomposition_options.m @@ -33,6 +33,7 @@ options.plot_shock_decomp.colormap = ''; options.plot_shock_decomp.nodisplay = false; options.plot_shock_decomp.graph_format = 'eps'; options.plot_shock_decomp.detail_plot = false; +options.plot_shock_decomp.init2shocks = []; options.plot_shock_decomp.interactive = false; options.plot_shock_decomp.screen_shocks = false; options.plot_shock_decomp.steadystate = false; diff --git a/tests/shock_decomposition/ls2003_plot.mod b/tests/shock_decomposition/ls2003_plot.mod index 895de40e9fd4bb9ab699a6f0e4ad214eccbec876..e07876b203fcfc0f16517928b9705008cdef03e5 100644 --- a/tests/shock_decomposition/ls2003_plot.mod +++ b/tests/shock_decomposition/ls2003_plot.mod @@ -76,46 +76,59 @@ supply = e_A ; 'RoW shocks' = e_q e_ys e_pies ; monetary = e_R ; end; + +init2shocks; +dq e_q; +A e_A; +end; + 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; -// various tests for plot_shock_decompositions -// standard plot [using trade group defined before] -plot_shock_decomposition; +// standard plot +plot_shock_decomposition y_obs R_obs pie_obs dq de; // test datailed, custom name and yoy plots -plot_shock_decomposition(detail_plot, fig_name = MR, type = yoy); +plot_shock_decomposition(detail_plot, fig_name = MR, type = yoy) y_obs R_obs pie_obs dq de; + +// testing init2shocks +initial_condition_decomposition(detail_plot, type=aoa, steadystate, write_xls, plot_init_date=1991Q1, plot_end_date=1995Q4, graph_format=fig) R_obs; +plot_shock_decomposition(init2shocks) y_obs R_obs pie_obs dq de; +plot_shock_decomposition(init2shocks,use_shock_groups=trade) y_obs R_obs pie_obs dq de; +// testing flip and diff +plot_shock_decomposition(diff, use_shock_groups=trade) y_obs; +plot_shock_decomposition(flip, use_shock_groups=trade) de; close all, // testing realtime decomposition // 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]); +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 pooled -plot_shock_decomposition(realtime = 1); +plot_shock_decomposition(realtime = 1) y_obs R_obs pie_obs dq de; //conditional pooled -plot_shock_decomposition(realtime = 2); +plot_shock_decomposition(realtime = 2) y_obs R_obs pie_obs dq de; // conditional 8-step ahead decomposition, given 1989q4 -plot_shock_decomposition(detail_plot, realtime = 2, vintage = 29); +plot_shock_decomposition(detail_plot, realtime = 2, vintage = 29) y_obs R_obs pie_obs dq de; close all, //forecast pooled -plot_shock_decomposition(realtime = 3); +plot_shock_decomposition(realtime = 3) y_obs R_obs pie_obs dq de; // forecast 8-step ahead decomposition, given 1989q4 -plot_shock_decomposition(detail_plot, realtime = 3, vintage = 29); +plot_shock_decomposition(detail_plot, realtime = 3, vintage = 29) y_obs R_obs pie_obs dq de; close all, // now I test annualized variables -options_.plot_shock_decomp.q2a=1; -options_.plot_shock_decomp.islog=1; +// options_.plot_shock_decomp.q2a=1; +// options_.plot_shock_decomp.islog=1; plot_shock_decomposition(detail_plot, type = aoa) y; plot_shock_decomposition(realtime = 1) y; @@ -126,14 +139,14 @@ plot_shock_decomposition(realtime = 3, vintage = 29) y; close all //test uimenu for groups -plot_shock_decomposition(detail_plot, interactive, use_shock_groups = row, type = qoq); -plot_shock_decomposition(detail_plot, interactive, realtime = 3, vintage = 29); +plot_shock_decomposition(detail_plot, interactive, use_shock_groups = row, type = qoq, plot_init_date=2004Q1) y_obs R_obs pie_obs dq de; +plot_shock_decomposition(detail_plot, interactive, realtime = 3, vintage = 29) y_obs R_obs pie_obs dq de; close all, // testing realtime decomposition with fast_realtime option -realtime_shock_decomposition(fast_realtime=75); +realtime_shock_decomposition(fast_realtime=75) y_obs R_obs pie_obs dq de; collect_latex_files; if system(['pdflatex -halt-on-error -interaction=batchmode ' M_.fname '_TeX_binder.tex'])