load_mh_file: recompute results by default and load on request

Prevents general overwriting of results in oo_ and having stale results
time-shift
Johannes Pfeifer 2016-12-17 16:05:17 +01:00
parent 5707b4d965
commit 352786c2b4
7 changed files with 54 additions and 7 deletions

View File

@ -5478,6 +5478,12 @@ provide the @code{mode_file} used in the previous
run or the same user-defined @code{mcmc_jumping_covariance} when using this option.
Shouldn't be used together with @code{mh_recover}.
@item load_results_after_load_mh
@anchor{load_results_after_load_mh} This option is available when loading a previous MCMC run without
adding additional draws, i.e. when @code{load_mh_file} is specified with @code{mh_replic=0}. It tells Dynare
to load the previously computed convergence diagnostics, marginal data density, and posterior statistics from an
existing @code{_results}-file instead of recomputing them.
@item optim = (@var{NAME}, @var{VALUE}, ...)
@anchor{optim}
A list of @var{NAME} and @var{VALUE} pairs. Can be used to set options for the optimization routines. The set of available options depends on the selected optimization routine (ie on the value of option @ref{mode_compute}):

View File

@ -430,12 +430,21 @@ if (any(bayestopt_.pshape >0 ) && options_.mh_replic) || ...
options_.qz_criterium=qz_criterium_old;
return
else
if ~options_.nodiagnostic && options_.mh_replic>0
oo_= McMCDiagnostics(options_, estim_params_, M_,oo_);
%get stored results if required
if options_.load_mh_file && options_.load_results_after_load_mh
oo_load_mh=load([M_.fname '_results'],'oo_');
end
if ~options_.nodiagnostic
if (options_.mh_replic>0 || (options_.load_mh_file && ~options_.load_results_after_load_mh))
oo_= McMCDiagnostics(options_, estim_params_, M_,oo_);
elseif options_.load_mh_file && options_.load_results_after_load_mh
if isfield(oo_load_mh.oo_,'convergence')
oo_.convergence=oo_load_mh.oo_.convergence;
end
end
end
%% Estimation of the marginal density from the Mh draws:
if options_.mh_replic
if options_.mh_replic || (options_.load_mh_file && ~options_.load_results_after_load_mh)
[marginal,oo_] = marginal_density(M_, options_, estim_params_, oo_, bayestopt_);
% Store posterior statistics by parameter name
oo_ = GetPosteriorParametersStatistics(estim_params_, M_, options_, bayestopt_, oo_, pnames);
@ -446,8 +455,25 @@ if (any(bayestopt_.pshape >0 ) && options_.mh_replic) || ...
% a matrix
[oo_.posterior.metropolis.mean,oo_.posterior.metropolis.Variance] ...
= GetPosteriorMeanVariance(M_,options_.mh_drop);
else
load([M_.fname '_results'],'oo_');
elseif options_.load_mh_file && options_.load_results_after_load_mh
%% load fields from previous MCMC run stored in results-file
field_names={'posterior_mode','posterior_std_at_mode',...% fields set by marginal_density
'posterior_mean','posterior_hpdinf','posterior_hpdsup','posterior_median','posterior_variance','posterior_std','posterior_deciles','posterior_density',...% fields set by GetPosteriorParametersStatistics
'prior_density',...%fields set by PlotPosteriorDistributions
};
for field_iter=1:size(field_names,2)
if isfield(oo_load_mh.oo_,field_names{1,field_iter})
oo_.(field_names{1,field_iter})=oo_load_mh.oo_.(field_names{1,field_iter});
end
end
% field set by marginal_density
if isfield(oo_load_mh.oo_,'MarginalDensity') && isfield(oo_load_mh.oo_.MarginalDensity,'ModifiedHarmonicMean')
oo_.MarginalDensity.ModifiedHarmonicMean=oo_load_mh.oo_.MarginalDensity.ModifiedHarmonicMean;
end
% field set by GetPosteriorMeanVariance
if isfield(oo_load_mh.oo_,'posterior') && isfield(oo_load_mh.oo_.posterior,'metropolis')
oo_.posterior.metropolis=oo_load_mh.oo_.posterior.metropolis;
end
end
[error_flag,junk,options_]= metropolis_draw(1,options_,estim_params_,M_);
if options_.bayesian_irf

View File

@ -595,6 +595,14 @@ else
end
if options_.load_results_after_load_mh
if ~exist([M_.fname '_results.mat'],'file')
fprintf('\ndynare_estimation_init:: You specified the load_results_after_load_mh, but no _results.mat-file\n')
fprintf('dynare_estimation_init:: was found. Results will be recomputed.\n')
options_.load_results_after_load_mh=0;
end
end
if options_.mh_replic
[current_options, options_] = check_posterior_sampler_options([], options_, bounds);
options_.posterior_sampler_options.current_options = current_options;

View File

@ -426,6 +426,7 @@ options_.riccati_tol = 1e-6;
options_.lik_algo = 1;
options_.lik_init = 1;
options_.load_mh_file = 0;
options_.load_results_after_load_mh = 0;
options_.logdata = 0;
options_.loglinear = 0;
options_.linear_approximation = 0;

View File

@ -104,7 +104,7 @@ class ParsingDriver;
%token <string_val> INT_NUMBER
%token INV_GAMMA_PDF INV_GAMMA1_PDF INV_GAMMA2_PDF IRF IRF_SHOCKS IRF_PLOT_THRESHOLD IRF_CALIBRATION
%token FAST_KALMAN_FILTER KALMAN_ALGO KALMAN_TOL DIFFUSE_KALMAN_TOL SUBSAMPLES OPTIONS TOLF TOLX
%token LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_IDENT_FILES LOAD_MH_FILE LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR LOGDATA LYAPUNOV LINEAR_APPROXIMATION
%token LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_IDENT_FILES LOAD_MH_FILE LOAD_RESULTS_AFTER_LOAD_MH LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR LOGDATA LYAPUNOV LINEAR_APPROXIMATION
%token LYAPUNOV_FIXED_POINT_TOL LYAPUNOV_DOUBLING_TOL LYAPUNOV_SQUARE_ROOT_SOLVER_TOL LOG_DEFLATOR LOG_TREND_VAR LOG_GROWTH_FACTOR MARKOWITZ MARGINAL_DENSITY MAX MAXIT
%token MFS MH_CONF_SIG MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER POSTERIOR_MAX_SUBSAMPLE_DRAWS MIN MINIMAL_SOLVING_PERIODS
%token MODE_CHECK MODE_CHECK_NEIGHBOURHOOD_SIZE MODE_CHECK_SYMMETRIC_PLOTS MODE_CHECK_NUMBER_OF_POINTS MODE_COMPUTE MODE_FILE MODEL MODEL_COMPARISON MODEL_INFO MSHOCKS ABS SIGN
@ -1745,6 +1745,7 @@ estimation_options : o_datafile
| o_mh_mode
| o_mh_nblocks
| o_load_mh_file
| o_load_results_after_load_mh
| o_loglinear
| o_logdata
| o_nodecomposition
@ -2864,6 +2865,7 @@ o_prior_trunc : PRIOR_TRUNC EQUAL non_negative_number { driver.option_num("prior
o_mh_mode : MH_MODE EQUAL INT_NUMBER { driver.option_num("mh_mode", $3); };
o_mh_nblocks : MH_NBLOCKS EQUAL INT_NUMBER { driver.option_num("mh_nblck", $3); };
o_load_mh_file : LOAD_MH_FILE { driver.option_num("load_mh_file", "1"); };
o_load_results_after_load_mh : LOAD_RESULTS_AFTER_LOAD_MH { driver.option_num("load_results_after_load_mh", "1"); };
o_loglinear : LOGLINEAR { driver.option_num("loglinear", "1"); };
o_linear_approximation : LINEAR_APPROXIMATION { driver.option_num("linear_approximation", "1"); };
o_logdata : LOGDATA { driver.option_num("logdata", "1"); };

View File

@ -300,6 +300,7 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2
<DYNARE_STATEMENT>mh_mode {return token::MH_MODE;}
<DYNARE_STATEMENT>mh_nblocks {return token::MH_NBLOCKS;}
<DYNARE_STATEMENT>load_mh_file {return token::LOAD_MH_FILE;}
<DYNARE_STATEMENT>load_results_after_load_mh {return token::LOAD_RESULTS_AFTER_LOAD_MH;}
<DYNARE_STATEMENT>loglinear {return token::LOGLINEAR;}
<DYNARE_STATEMENT>linear_approximation {return token::LINEAR_APPROXIMATION;}
<DYNARE_STATEMENT>logdata {return token::LOGDATA;}

View File

@ -115,3 +115,6 @@ temp2=load([M_.dname filesep 'metropolis' filesep M_.dname '_mh1_blck1.mat']);
if max(max(abs(temp1.x2-temp2.x2)))>1e-10
error('Draws of unaffected chain are not the same')
end
save('fs2000_result.mat','oo_')
estimation(mode_compute=0,mode_file=fs2000_mode,order=1, datafile=fsdat_simul, nobs=192, loglinear, mh_replic=0, mh_nblocks=1, mh_jscale=10,load_mh_file,load_results_after_load_mh,smoother) gy_obs gp_obs;