From f8b8ec6c1854f088026a2cf394dc62f94108f3c3 Mon Sep 17 00:00:00 2001 From: Marco Ratto Date: Thu, 29 Oct 2020 18:21:17 +0100 Subject: [PATCH 1/6] fixes around init2shocks in plotting utilities --- matlab/graph_decomp.m | 10 ++++++++++ matlab/graph_decomp_detail.m | 12 +++++++++++- matlab/plot_shock_decomposition.m | 17 ++++++++++------- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/matlab/graph_decomp.m b/matlab/graph_decomp.m index 60a0acb5d..20eb7c108 100644 --- a/matlab/graph_decomp.m +++ b/matlab/graph_decomp.m @@ -51,6 +51,16 @@ if ~isempty(opts_decomp.type) fig_mode = [fig_mode '_']; end +if isfield(opts_decomp,'init2shocks') && opts_decomp.realtime==0 + init2shocks_decomp = 1 ; +else + init2shocks_decomp = 0; +end +if init2shocks_decomp + fig_mode1 = [fig_mode1 '_init2shocks_decomp']; + fig_mode = [fig_mode 'init2shocks_decomp_']; +end + if isfield(opts_decomp,'init_cond_decomp') init_cond_decomp = opts_decomp.init_cond_decomp ; else diff --git a/matlab/graph_decomp_detail.m b/matlab/graph_decomp_detail.m index b19a226b8..2a3aa216e 100644 --- a/matlab/graph_decomp_detail.m +++ b/matlab/graph_decomp_detail.m @@ -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 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. -%xf +% % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . @@ -55,6 +55,16 @@ if ~isempty(opts_decomp.type) fig_mode = [fig_mode '_']; end +if isfield(opts_decomp,'init2shocks') && opts_decomp.realtime==0 + init2shocks_decomp = 1 ; +else + init2shocks_decomp = 0; +end +if init2shocks_decomp + fig_mode1 = [fig_mode1 '_init2shocks_decomp']; + fig_mode = [fig_mode 'init2shocks_decomp_']; +end + if isfield(opts_decomp,'init_cond_decomp') init_cond_decomp = opts_decomp.init_cond_decomp ; else diff --git a/matlab/plot_shock_decomposition.m b/matlab/plot_shock_decomposition.m index 11ca3b005..68c142bd3 100644 --- a/matlab/plot_shock_decomposition.m +++ b/matlab/plot_shock_decomposition.m @@ -50,7 +50,7 @@ if size(varlist,1) == 0 end end -if isfield(options_.plot_shock_decomp,'init2shocks') % private trap for uimenu calls +if isfield(options_.plot_shock_decomp,'init2shocks') && options_.plot_shock_decomp.realtime==0 % private trap for uimenu calls init2shocks=options_.plot_shock_decomp.init2shocks; else init2shocks=[]; @@ -59,7 +59,7 @@ if ~isempty(init2shocks) init2shocks=M_.init2shocks.(init2shocks); end - +orig_endo_names = M_.endo_names; epilogue_decomp=false; if exist_varlist && any(ismember(varlist,M_.epilogue_names)) epilogue_decomp=true; @@ -252,15 +252,15 @@ 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'); + j=strmatch(init2shocks{i}{1},orig_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,:); + M_.exo_names_init{jj}=[M_.exo_names_init{jj} ' + ' orig_endo_names{j}]; + z(:,jj,:)= z(:,jj,:) + oo_.initval_decomposition (:,j,1:size(z,3)); else - z(:,end,:)= z(:,end,:) - oo_.initval_decomposition (:,j,:); + z(:,end,:)= z(:,end,:) - oo_.initval_decomposition (:,j,1:size(z,3)); end - z(:,end-1,:)= z(:,end-1,:) - oo_.initval_decomposition (:,j,:); + z(:,end-1,:)= z(:,end-1,:) - oo_.initval_decomposition (:,j,1:size(z,3)); end end @@ -271,6 +271,9 @@ if ~epilogue_decomp else steady_state = oo_.steady_state; end + if isfield(oo_.shock_decomposition_info,'i_var') && (M_.endo_nbr Date: Thu, 29 Oct 2020 18:27:24 +0100 Subject: [PATCH 2/6] allow to export expand groups to excel (instead than plotting them) --- matlab/expand_group.m | 12 ++++++++++-- matlab/graph_decomp.m | 2 ++ matlab/graph_decomp_detail.m | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/matlab/expand_group.m b/matlab/expand_group.m index 0992e4967..a216b51b1 100644 --- a/matlab/expand_group.m +++ b/matlab/expand_group.m @@ -1,4 +1,4 @@ -function expand_group(use_shock_groups,var_list_, ic) +function expand_group(use_shock_groups,var_list_, ic, no_graph) % function expand_group(use_shock_groups,var_list_, ic) % Expands shocks contributions out of a group of shocks % @@ -27,6 +27,9 @@ function expand_group(use_shock_groups,var_list_, ic) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . +if nargin<4 + no_graph=0; +end filename = get(gcf,'filename'); [filepath, name, ext]=fileparts(filename); M = evalin('base','M_'); @@ -56,7 +59,12 @@ M.exo_names = mydata.exo_names; options.plot_shock_decomp.interactive=0; options.plot_shock_decomp.expand=1; options.plot_shock_decomp.nodisplay=0; -options.plot_shock_decomp.write_xls=0; +if no_graph + options.no_graph.plot_shock_decomposition=1; + options.plot_shock_decomp.write_xls=1; +else + options.plot_shock_decomp.write_xls=0; +end %% set optimal colormap func = @(x) colorspace('RGB->Lab',x); MAP = distinguishable_colors(length(shocks)+1,'w',func); diff --git a/matlab/graph_decomp.m b/matlab/graph_decomp.m index 20eb7c108..553f4060b 100644 --- a/matlab/graph_decomp.m +++ b/matlab/graph_decomp.m @@ -237,6 +237,8 @@ for j=1:nvar browse_menu = uimenu(c,'Label','Browse group'); 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)]); + save_expand2xls_menu = uimenu(c,'Label','Export group to xls','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' deblank(mydata.plot_shock_decomp.orig_varlist(j,:)) ''',' int2str(i) ', 1)']); + set(save_expand2xls_menu,'Tag',['xls_group' int2str(i)]); for jmember = mydata.shock_group.shocks uimenu('parent',browse_menu,'Label',char(jmember)) end diff --git a/matlab/graph_decomp_detail.m b/matlab/graph_decomp_detail.m index 2a3aa216e..24397230b 100644 --- a/matlab/graph_decomp_detail.m +++ b/matlab/graph_decomp_detail.m @@ -243,6 +243,8 @@ for j=1:nvar browse_menu = uimenu(c,'Label','Browse group'); 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)]); + save_expand2xls_menu = uimenu(c,'Label','Export group to xls','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' deblank(mydata.plot_shock_decomp.orig_varlist(j,:)) ''',' int2str(ic) ', 1)']); + set(save_expand2xls_menu,'Tag',['xls_group' int2str(ic)]); for jmember = mydata.shock_group.shocks uimenu('parent',browse_menu,'Label',char(jmember)) end From dbcdaf75a6b320a98176bf769807b1e1ffe7bb69 Mon Sep 17 00:00:00 2001 From: Marco Ratto Date: Thu, 29 Oct 2020 18:36:07 +0100 Subject: [PATCH 3/6] fixed bug when SteadyState is not used for shock decompositions fixed names of files, removing spaces and dots use writetable with mac OS --- matlab/WriteShockDecomp2Excel.m | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/matlab/WriteShockDecomp2Excel.m b/matlab/WriteShockDecomp2Excel.m index 737811570..d86327fb5 100644 --- a/matlab/WriteShockDecomp2Excel.m +++ b/matlab/WriteShockDecomp2Excel.m @@ -28,7 +28,7 @@ function WriteShockDecomp2Excel(z,shock_names,endo_names,i_var,initial_date,Dyna % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -SteadyState=[]; +SteadyState=zeros(DynareModel.endo_nbr,1); fig_mode=''; fig_mode1=''; fig_name=''; @@ -114,15 +114,13 @@ for j=1:nvar end warning off - try + fig_name1 = strrep(fig_name1,' ','_'); + fig_name1 = strrep(fig_name1,'.',''); + + if ~ismac [STATUS,MESSAGE] = xlswrite([DynareModel.fname,'_shock_decomposition',fig_mode,fig_name1],d0,endo_names{i_var(j)}); - catch - if exist('xlwrite.m','file') - [STATUS] = xlwrite([DynareModel.fname,'_shock_decomposition',fig_mode,fig_name1],d0,endo_names{i_var(j)}); - else - fprintf('\nWriteShockDecomp2Excel: could not write Excel file. It seems Excel is not installed on your machine.\n') - fprintf('Please install the free xlwrite.m from https://mathworks.com/matlabcentral/fileexchange/38591-xlwrite-generate-xls-x-files-without-excel-on-mac-linux-win\n') - end + else + writetable(cell2table(d0), [DynareModel.fname,'_shock_decomposition',fig_mode,fig_name1 '.xls'], 'Sheet', endo_names{i_var(j)},'WriteVariableNames',false); end warning on From b1ae98845dc7230fb48f6bd325d3550c563cd014 Mon Sep 17 00:00:00 2001 From: Marco Ratto Date: Wed, 4 Nov 2020 14:34:46 +0100 Subject: [PATCH 4/6] fixed bug in var list for expand menu --- matlab/graph_decomp.m | 2 +- matlab/graph_decomp_detail.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/matlab/graph_decomp.m b/matlab/graph_decomp.m index 553f4060b..c115ca1e7 100644 --- a/matlab/graph_decomp.m +++ b/matlab/graph_decomp.m @@ -237,7 +237,7 @@ for j=1:nvar browse_menu = uimenu(c,'Label','Browse group'); 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)]); - save_expand2xls_menu = uimenu(c,'Label','Export group to xls','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' deblank(mydata.plot_shock_decomp.orig_varlist(j,:)) ''',' int2str(i) ', 1)']); + save_expand2xls_menu = uimenu(c,'Label','Export group to xls','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' mydata.plot_shock_decomp.orig_varlist{j} ''',' int2str(i) ', 1)']); set(save_expand2xls_menu,'Tag',['xls_group' int2str(i)]); for jmember = mydata.shock_group.shocks uimenu('parent',browse_menu,'Label',char(jmember)) diff --git a/matlab/graph_decomp_detail.m b/matlab/graph_decomp_detail.m index 24397230b..dcfd1cd7e 100644 --- a/matlab/graph_decomp_detail.m +++ b/matlab/graph_decomp_detail.m @@ -243,7 +243,7 @@ for j=1:nvar browse_menu = uimenu(c,'Label','Browse group'); 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)]); - save_expand2xls_menu = uimenu(c,'Label','Export group to xls','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' deblank(mydata.plot_shock_decomp.orig_varlist(j,:)) ''',' int2str(ic) ', 1)']); + save_expand2xls_menu = uimenu(c,'Label','Export group to xls','Callback',['expand_group(''' mydata.plot_shock_decomp.use_shock_groups ''',''' mydata.plot_shock_decomp.orig_varlist{j} ''',' int2str(ic) ', 1)']); set(save_expand2xls_menu,'Tag',['xls_group' int2str(ic)]); for jmember = mydata.shock_group.shocks uimenu('parent',browse_menu,'Label',char(jmember)) From f592cca59df89b0de58032698e7efa57e0aed340 Mon Sep 17 00:00:00 2001 From: Marco Ratto Date: Mon, 9 Nov 2020 17:59:09 +0100 Subject: [PATCH 5/6] fixed wrong naming of shock decompositions --- matlab/graph_decomp.m | 10 ---------- matlab/graph_decomp_detail.m | 10 ---------- 2 files changed, 20 deletions(-) diff --git a/matlab/graph_decomp.m b/matlab/graph_decomp.m index c115ca1e7..f00512a2a 100644 --- a/matlab/graph_decomp.m +++ b/matlab/graph_decomp.m @@ -51,16 +51,6 @@ if ~isempty(opts_decomp.type) fig_mode = [fig_mode '_']; end -if isfield(opts_decomp,'init2shocks') && opts_decomp.realtime==0 - init2shocks_decomp = 1 ; -else - init2shocks_decomp = 0; -end -if init2shocks_decomp - fig_mode1 = [fig_mode1 '_init2shocks_decomp']; - fig_mode = [fig_mode 'init2shocks_decomp_']; -end - if isfield(opts_decomp,'init_cond_decomp') init_cond_decomp = opts_decomp.init_cond_decomp ; else diff --git a/matlab/graph_decomp_detail.m b/matlab/graph_decomp_detail.m index dcfd1cd7e..89111f987 100644 --- a/matlab/graph_decomp_detail.m +++ b/matlab/graph_decomp_detail.m @@ -55,16 +55,6 @@ if ~isempty(opts_decomp.type) fig_mode = [fig_mode '_']; end -if isfield(opts_decomp,'init2shocks') && opts_decomp.realtime==0 - init2shocks_decomp = 1 ; -else - init2shocks_decomp = 0; -end -if init2shocks_decomp - fig_mode1 = [fig_mode1 '_init2shocks_decomp']; - fig_mode = [fig_mode 'init2shocks_decomp_']; -end - if isfield(opts_decomp,'init_cond_decomp') init_cond_decomp = opts_decomp.init_cond_decomp ; else From 50e80fe496431d293aa8a69e4d783f0f6c6b3b35 Mon Sep 17 00:00:00 2001 From: Marco Ratto Date: Tue, 16 Feb 2021 09:56:22 +0100 Subject: [PATCH 6/6] write xls output in Output subdir --- matlab/WriteShockDecomp2Excel.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/matlab/WriteShockDecomp2Excel.m b/matlab/WriteShockDecomp2Excel.m index d86327fb5..f339f294e 100644 --- a/matlab/WriteShockDecomp2Excel.m +++ b/matlab/WriteShockDecomp2Excel.m @@ -28,6 +28,8 @@ function WriteShockDecomp2Excel(z,shock_names,endo_names,i_var,initial_date,Dyna % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . +OutputDirectoryName = CheckPath('Output',DynareModel.dname); + SteadyState=zeros(DynareModel.endo_nbr,1); fig_mode=''; fig_mode1=''; @@ -118,9 +120,9 @@ for j=1:nvar fig_name1 = strrep(fig_name1,'.',''); if ~ismac - [STATUS,MESSAGE] = xlswrite([DynareModel.fname,'_shock_decomposition',fig_mode,fig_name1],d0,endo_names{i_var(j)}); + [STATUS,MESSAGE] = xlswrite([OutputDirectoryName,filesep,DynareModel.fname,'_shock_decomposition',fig_mode,fig_name1],d0,endo_names{i_var(j)}); else - writetable(cell2table(d0), [DynareModel.fname,'_shock_decomposition',fig_mode,fig_name1 '.xls'], 'Sheet', endo_names{i_var(j)},'WriteVariableNames',false); + writetable(cell2table(d0), [OutputDirectoryName,filesep,DynareModel.fname,'_shock_decomposition',fig_mode,fig_name1 '.xls'], 'Sheet', endo_names{i_var(j)},'WriteVariableNames',false); end warning on