diff --git a/matlab/posterior_sampler.m b/matlab/posterior_sampler.m index 9efabb4d89b00fac5a65608aee9e4e4436e09d74..3e187a19eae79f87a3548e6b0670d9c4050d4d06 100644 --- a/matlab/posterior_sampler.m +++ b/matlab/posterior_sampler.m @@ -61,7 +61,7 @@ objective_function_penalty_base = Inf; vv = sampler_options.invhess; % Initialization of the sampler -[ ix2, ilogpo2, ModelName, MetropolisFolder, fblck, fline, npar, nblck, nruns, NewFile, MAX_nruns, d ] = ... +[ ix2, ilogpo2, ModelName, MetropolisFolder, fblck, fline, npar, nblck, nruns, NewFile, MAX_nruns, d, bayestopt_] = ... posterior_sampler_initialization(TargetFun, xparam1, vv, mh_bounds,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,oo_); InitSizeArray = min([repmat(MAX_nruns,nblck,1) fline+nruns-1],[],2); diff --git a/matlab/posterior_sampler_core.m b/matlab/posterior_sampler_core.m index ec749de63833aa0ccc7cf7e02b2d8d423ee713be..c677e02cceb28627103039868b0ee1948ff569e0 100644 --- a/matlab/posterior_sampler_core.m +++ b/matlab/posterior_sampler_core.m @@ -110,6 +110,9 @@ end sampler_options.xparam1 = xparam1; if ~isempty(d), sampler_options.proposal_covariance_Cholesky_decomposition = d*diag(bayestopt_.jscale); + %store information for load_mh_file + record.ProposalCovariance=d; + record.ProposalScaleVec=bayestopt_.jscale; end block_iter=0; diff --git a/matlab/posterior_sampler_initialization.m b/matlab/posterior_sampler_initialization.m index 75df703c8698d5f740f67b49528f31ed658f98e3..3adca10a50105e8ae45dfdb6c0ab13bfe47b19c1 100644 --- a/matlab/posterior_sampler_initialization.m +++ b/matlab/posterior_sampler_initialization.m @@ -1,6 +1,6 @@ -function [ ix2, ilogpo2, ModelName, MetropolisFolder, FirstBlock, FirstLine, npar, NumberOfBlocks, nruns, NewFile, MAX_nruns, d ] = ... +function [ ix2, ilogpo2, ModelName, MetropolisFolder, FirstBlock, FirstLine, npar, NumberOfBlocks, nruns, NewFile, MAX_nruns, d, bayestopt_] = ... posterior_sampler_initialization(TargetFun, xparam1, vv, mh_bounds,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,oo_) -% function [ ix2, ilogpo2, ModelName, MetropolisFolder, FirstBlock, FirstLine, npar, NumberOfBlocks, nruns, NewFile, MAX_nruns, d ] = ... +% function [ ix2, ilogpo2, ModelName, MetropolisFolder, FirstBlock, FirstLine, npar, NumberOfBlocks, nruns, NewFile, MAX_nruns, d, bayestopt_] = ... % metropolis_hastings_initialization(TargetFun, xparam1, vv, mh_bounds,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,oo_) % Metropolis-Hastings initialization. % @@ -33,6 +33,7 @@ function [ ix2, ilogpo2, ModelName, MetropolisFolder, FirstBlock, FirstLine, npa % draws % o MAX_nruns [scalar] maximum number of draws in each MH-file on the harddisk % o d [double] (p*p) matrix, Cholesky decomposition of the posterior covariance matrix (at the mode). +% o bayestopt_ [structure] estimation options structure % % SPECIAL REQUIREMENTS % None. @@ -224,6 +225,7 @@ if ~options_.load_mh_file && ~options_.mh_recover record.LastFileNumber = AnticipatedNumberOfFiles ; record.LastLineNumber = AnticipatedNumberOfLinesInTheLastFile; record.MCMCConcludedSuccessfully = 0; + record.MCMC_sampler=options_.posterior_sampler_options.posterior_sampling_method; fprintf('Ok!\n'); id = write_mh_history_file(MetropolisFolder, ModelName, record); disp(['Estimation::mcmc: Details about the MCMC are available in ' BaseName '_mh_history_' num2str(id) '.mat']) @@ -283,6 +285,7 @@ elseif options_.load_mh_file && ~options_.mh_recover end ilogpo2 = record.LastLogPost; ix2 = record.LastParameters; + [d,bayestopt_]=set_proposal_density_to_previous_value(record,options_,bayestopt_); FirstBlock = 1; NumberOfPreviousSimulations = sum(record.MhDraws(:,1),1); fprintf('Estimation::mcmc: I am writing a new mh-history file... '); @@ -363,7 +366,7 @@ elseif options_.mh_recover FirstLine = ones(NumberOfBlocks,1); LastFileFullIndicator=1; end - + [d,bayestopt_]=set_proposal_density_to_previous_value(record,options_,bayestopt_); %% Now find out what exactly needs to be redone % 1. Check if really something needs to be done % How many mh files should we have ? @@ -447,3 +450,21 @@ elseif options_.mh_recover write_mh_history_file(MetropolisFolder, ModelName, record); end end + +function [d,bayestopt_]=set_proposal_density_to_previous_value(record,options_,bayestopt_) + if isfield(record,'ProposalCovariance') && isfield(record,'ProposalCovariance') + if isfield(record,'MCMC_sampler') + if ~strcmp(record.MCMC_sampler,options_.posterior_sampler_options.posterior_sampling_method) + error(fprintf('Estimation::mcmc: The posterior_sampling_method differs from the one of the original chain. Please reset it to %s',record.MCMC_sampler)) + end + end + fprintf('Estimation::mcmc: Recovering the previous proposal density\n.') + d=record.ProposalCovariance; + bayestopt_.jscale=record.ProposalScaleVec; + else + if options_.mode_compute~=0 + fprintf('Estimation::mcmc: No stored previous proposal density found, continuing with the one implied by mode_compute\n.'); + elseif ~isempty(options_.mode_file) + fprintf('Estimation::mcmc: No stored previous proposal density found, continuing with the one implied by the mode_file\n.'); + end + end diff --git a/tests/estimation/fs2000.mod b/tests/estimation/fs2000.mod index 2eaeff302b9b54846d4e339dbbb7f1d08466fe58..640f1961f96b49a1d5f6fc79ae497e3fd31ade69 100644 --- a/tests/estimation/fs2000.mod +++ b/tests/estimation/fs2000.mod @@ -82,4 +82,21 @@ varobs gp_obs gy_obs; options_.solve_tolf = 1e-12; -estimation(order=1,datafile=fsdat_simul,nobs=192,loglinear,mh_replic=3000,mh_nblocks=2,mh_jscale=0.8,moments_varendo,selected_variables_only,contemporaneous_correlation,smoother,forecast=8) y m; +estimation(order=1,datafile=fsdat_simul,nobs=192,loglinear,mh_replic=3000,mh_nblocks=1,mh_jscale=0.8,moments_varendo,selected_variables_only,contemporaneous_correlation,smoother,forecast=8) y m; +%test load_mh_file option +options_.smoother=0; +options_.moments_varendo=0; +options_.forecast=0; +copyfile([M_.dname filesep 'metropolis' filesep M_.dname '_mh1_blck1.mat'],[M_.dname '_mh1_blck1.mat']) +estimation(mode_compute=0,mode_file=fs2000_mode,order=1, datafile=fsdat_simul, nobs=192, loglinear, mh_replic=1500, mh_nblocks=1, mh_jscale=0.8); +hh=eye(size(bayestopt_.name,1)); +save('fs2000_mode','hh','-append') +estimation(mode_compute=0,mode_file=fs2000_mode,order=1, datafile=fsdat_simul, nobs=192, loglinear, mh_replic=1500, mh_nblocks=1, mh_jscale=10,load_mh_file); + + +temp1=load([M_.dname '_mh1_blck1.mat']); +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