Merge branch 'trace_plot' of git.dynare.org:JohannesPfeifer/dynare

Ref. !2169
kalman-mex
Sébastien Villemot 2023-09-11 16:25:31 +02:00
commit 890c6b2e1d
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
4 changed files with 70 additions and 34 deletions

View File

@ -53,8 +53,9 @@ Dynare misc commands
.. command:: generate_trace_plots(CHAIN_NUMBER); .. command:: generate_trace_plots(CHAIN_NUMBER);
Generates trace plots of the MCMC draws for all estimated Generates trace plots of the MCMC draws for all estimated
parameters and the posterior density in the specified Markov Chain parameters and the posterior density for the specified Markov Chain(s)
``CHAIN_NUMBER``. ``CHAIN_NUMBER``. If ``CHAIN_NUMBER`` is a vector of integers, the trace plots
will plot contains separate lines for each chain.
|br| |br|

View File

@ -34,7 +34,7 @@ global M_ options_ estim_params_
% Get informations about the posterior draws: % Get informations about the posterior draws:
MetropolisFolder = CheckPath('metropolis', M_.dname); MetropolisFolder = CheckPath('metropolis', M_.dname);
record=load_last_mh_history_file(MetropolisFolder, M_.fname); record=load_last_mh_history_file(MetropolisFolder, M_.fname);
if chain_number>record.Nblck if max(chain_number)>record.Nblck
error('generate_trace_plots:: chain number is bigger than existing number of chains') error('generate_trace_plots:: chain number is bigger than existing number of chains')
end end

View File

@ -9,7 +9,8 @@ function trace_plot(options_,M_,estim_params_,type,blck,name1,name2)
% type [string] 'DeepParameter', 'MeasurementError' (for measurement equation error), % type [string] 'DeepParameter', 'MeasurementError' (for measurement equation error),
% 'StructuralShock' (for structural shock) % 'StructuralShock' (for structural shock)
% or 'PosteriorDensity (for posterior density)' % or 'PosteriorDensity (for posterior density)'
% blck [integer] Number of the mh chain. % blck [integer] Number of the mh chain or chains if a
% vector
% name1 [string] Object name. % name1 [string] Object name.
% name2 [string] Object name. % name2 [string] Object name.
% %
@ -18,7 +19,7 @@ function trace_plot(options_,M_,estim_params_,type,blck,name1,name2)
% %
% SPECIAL REQUIREMENTS % SPECIAL REQUIREMENTS
% Copyright © 2003-2018 Dynare Team % Copyright © 2003-2023 Dynare Team
% %
% This file is part of Dynare. % This file is part of Dynare.
% %
@ -62,9 +63,29 @@ TotalNumberOfMhDraws = sum(record.MhDraws(:,1));
[mh_nblck] = size(record.LastParameters,2); [mh_nblck] = size(record.LastParameters,2);
clear record; clear record;
n_nblocks_to_plot=length(blck);
if n_nblocks_to_plot==1
% Get all the posterior draws: % Get all the posterior draws:
PosteriorDraws = GetAllPosteriorDraws(column, FirstMhFile, FirstLine, TotalNumberOfMhFiles, TotalNumberOfMhDraws, mh_nblck, blck); PosteriorDraws = GetAllPosteriorDraws(column, FirstMhFile, FirstLine, TotalNumberOfMhFiles, TotalNumberOfMhDraws, mh_nblck, blck);
else
PosteriorDraws=NaN(TotalNumberOfMhDraws,n_nblocks_to_plot);
save_string='';
if options_.TeX
title_string_tex='';
end
for block_iter=1:n_nblocks_to_plot
PosteriorDraws(:,block_iter) = GetAllPosteriorDraws(column, FirstMhFile, FirstLine, TotalNumberOfMhFiles, TotalNumberOfMhDraws, mh_nblck, blck(block_iter));
save_string=[save_string,'_',num2str(blck(block_iter))];
if options_.TeX
title_string_tex=[title_string_tex, ', ' num2str(blck(block_iter))];
end
end
save_string(1)=[];
if options_.TeX
title_string_tex(1:2)=[];
end
end
% Plot the posterior draws: % Plot the posterior draws:
@ -92,30 +113,34 @@ else
FigureName = ['Trace plot for ' TYPE name1 ' and ' name2]; FigureName = ['Trace plot for ' TYPE name1 ' and ' name2];
end end
if options_.mh_nblck>1
FigureName = [ FigureName , ' (block number ' int2str(blck) ').']; if n_nblocks_to_plot==1
if options_.mh_nblck>1
FigureName = [ FigureName , ' (block number ' int2str(blck) ').'];
end
hh=dyn_figure(options_.nodisplay,'Name',FigureName);
plot(1:TotalNumberOfMhDraws,PosteriorDraws,'Color',[.7 .7 .7]);
% Compute the moving average of the posterior draws:
N = options_.trace_plot_ma;
MovingAverage = NaN(TotalNumberOfMhDraws,1);
first = N+1;
last = TotalNumberOfMhDraws-N;
for t=first:last
MovingAverage(t) = mean(PosteriorDraws(t-N:t+N));
end
hold on
plot(1:TotalNumberOfMhDraws,MovingAverage,'-k','linewidth',2)
hold off
axis tight
legend({'MCMC draw';[num2str(N) ' period moving average']},'Location','NorthEast')
else
hh=dyn_figure(options_.nodisplay,'Name',FigureName);
pp=plot(1:TotalNumberOfMhDraws,PosteriorDraws);
legend(pp,strcat(repmat({'Chain '},n_nblocks_to_plot,1),num2str(blck(:))));
end end
hh=dyn_figure(options_.nodisplay,'Name',FigureName);
plot(1:TotalNumberOfMhDraws,PosteriorDraws,'Color',[.7 .7 .7]);
% Compute the moving average of the posterior draws:
N = options_.trace_plot_ma;
MovingAverage = NaN(TotalNumberOfMhDraws,1);
first = N+1;
last = TotalNumberOfMhDraws-N;
for t=first:last
MovingAverage(t) = mean(PosteriorDraws(t-N:t+N));
end
hold on
plot(1:TotalNumberOfMhDraws,MovingAverage,'-k','linewidth',2)
hold off
axis tight
legend({'MCMC draw';[num2str(N) ' period moving average']},'Location','NorthWest')
% create subdirectory <dname>/graphs if it doesn't exist % create subdirectory <dname>/graphs if it doesn't exist
if ~exist(M_.dname, 'dir') if ~exist(M_.dname, 'dir')
mkdir('.',M_.dname); mkdir('.',M_.dname);
@ -130,8 +155,11 @@ if strcmpi(type,'PosteriorDensity')
else else
plot_name=get_the_name(column,0,M_,estim_params_,options_); plot_name=get_the_name(column,0,M_,estim_params_,options_);
end end
plot_name=[plot_name,'_blck_',num2str(blck)]; if n_nblocks_to_plot==1
plot_name=[plot_name,'_blck_',num2str(blck)];
else
plot_name=[plot_name,'_blck_',save_string];
end
dyn_saveas(hh,[M_.dname, filesep, 'graphs', filesep, 'TracePlot_' plot_name],options_.nodisplay,options_.graph_format) dyn_saveas(hh,[M_.dname, filesep, 'graphs', filesep, 'TracePlot_' plot_name],options_.nodisplay,options_.graph_format)
if options_.TeX if options_.TeX
@ -157,10 +185,13 @@ if options_.TeX
FigureName = ['Trace plot for ' TYPE '$' tex_names{strmatch(name1,base_names,'exact')} '$ and $' tex_names{strmatch(name2,base_names,'exact')} '$']; FigureName = ['Trace plot for ' TYPE '$' tex_names{strmatch(name1,base_names,'exact')} '$ and $' tex_names{strmatch(name2,base_names,'exact')} '$'];
end end
end end
if options_.mh_nblck>1 if n_nblocks_to_plot==1
FigureName = [ FigureName , ' (block number ' int2str(blck) ').']; if options_.mh_nblck>1
FigureName = [ FigureName , ' (block number ' int2str(blck) ').'];
end
else
FigureName = [ FigureName , ' (blocks ' title_string_tex ').'];
end end
fprintf(fid,'%-s\n','\begin{figure}[H]'); fprintf(fid,'%-s\n','\begin{figure}[H]');
fprintf(fid,'%-s\n','\centering'); fprintf(fid,'%-s\n','\centering');
fprintf(fid,'%-s\n',[' \includegraphics[width=0.8\textwidth]{',[M_.dname, '/graphs/TracePlot_' plot_name],'}\\']); fprintf(fid,'%-s\n',[' \includegraphics[width=0.8\textwidth]{',[M_.dname, '/graphs/TracePlot_' plot_name],'}\\']);

View File

@ -88,3 +88,7 @@ estimation(order=1,datafile='../fsdat_simul',nobs=192,loglinear,mh_replic=100,mh
posterior_sampling_method='slice', posterior_sampling_method='slice',
posterior_sampler_options=('rotated',1,'use_mh_covariance_matrix',1) posterior_sampler_options=('rotated',1,'use_mh_covariance_matrix',1)
); );
options_.TeX=1;
generate_trace_plots(1:2);
options_.TeX=1;