diff --git a/matlab/posterior_sampler_iteration.m b/matlab/posterior_sampler_iteration.m index 5b54e785ef20b72de18f04adfa316f629c60f541..a6366c1c2fd05feaa75048c9b9932f365d111c20 100644 --- a/matlab/posterior_sampler_iteration.m +++ b/matlab/posterior_sampler_iteration.m @@ -4,16 +4,29 @@ function [par, logpost, accepted, neval] = posterior_sampler_iteration(TargetFu % posterior samplers % % INPUTS -% posterior_sampler_options: posterior sampler options -% options_: structure storing the options - +% TargetFun: string storing the objective function (e.g. 'dsge_likelihood.m') +% last_draw: parameter vector in last iteration +% last_posterior: value of the posterior in last iteration +% sampler_options: posterior sampler options +% dataset_: the dataset after required transformation +% dataset_info: Various informations about the dataset (descriptive statistics and missing observations). +% options_: structure storing the options +% M_: structure storing the model information +% estim_params_: structure storing information about estimated parameters +% bayestopt_: structure storing information about priors +% mh_bounds: structure containing prior bounds +% oo_: structure storing the results +% % OUTPUTS -% posterior_sampler_options: checked posterior sampler options +% par: last accepted parameter vector +% logpost: value of the posterior after current iteration +% accepted: share of proposed draws that were accepted +% neval: number of evaluations (>1 only for slice) % % SPECIAL REQUIREMENTS % none -% Copyright (C) 2015-16 Dynare Team +% Copyright (C) 2015-18 Dynare Team % % This file is part of Dynare. % @@ -121,28 +134,31 @@ switch posterior_sampling_method else logpost = -inf; end - %get ratio of proposal densities, required because proposal depends - %on current mode via Hessian and is thus not symmetric anymore - if strcmpi(sampler_options.proposal_distribution,'rand_multivariate_normal') - proposal_density_proposed_move_forward=multivariate_normal_pdf(proposed_par,xopt_current_block',proposal_covariance_Cholesky_decomposition_upper,n); - proposal_density_proposed_move_backward=multivariate_normal_pdf(par_start_current_block',xopt_current_block',proposal_covariance_Cholesky_decomposition_upper,n); - elseif strcmpi(sampler_options.proposal_distribution,'rand_multivariate_student') - proposal_density_proposed_move_forward=multivariate_student_pdf(proposed_par,xopt_current_block',proposal_covariance_Cholesky_decomposition_upper,n); - proposal_density_proposed_move_backward=multivariate_student_pdf(par_start_current_block',xopt_current_block',proposal_covariance_Cholesky_decomposition_upper,n); - end - accprob=logpost-last_posterior+ log(proposal_density_proposed_move_backward)-log(proposal_density_proposed_move_forward); %Formula (6), Chib/Ramamurthy - - if (logpost > -inf) && (log(rand) < accprob) - current_draw(indices(blocks==block_iter,1))=proposed_par; - last_posterior=logpost; - accepted_draws_counter =accepted_draws_counter +1; - else %no updating - %do nothing, keep old value + + if (logpost > -inf) + %get ratio of proposal densities, required because proposal depends + %on current mode via Hessian and is thus not symmetric anymore + if strcmpi(sampler_options.proposal_distribution,'rand_multivariate_normal') + proposal_density_proposed_move_forward=multivariate_normal_pdf(proposed_par,xopt_current_block',proposal_covariance_Cholesky_decomposition_upper,n); + proposal_density_proposed_move_backward=multivariate_normal_pdf(par_start_current_block',xopt_current_block',proposal_covariance_Cholesky_decomposition_upper,n); + elseif strcmpi(sampler_options.proposal_distribution,'rand_multivariate_student') + proposal_density_proposed_move_forward=multivariate_student_pdf(proposed_par,xopt_current_block',proposal_covariance_Cholesky_decomposition_upper,n); + proposal_density_proposed_move_backward=multivariate_student_pdf(par_start_current_block',xopt_current_block',proposal_covariance_Cholesky_decomposition_upper,n); + end + accprob=logpost-last_posterior+ log(proposal_density_proposed_move_backward)-log(proposal_density_proposed_move_forward); %Formula (6), Chib/Ramamurthy + if (log(rand) < accprob) + current_draw(indices(blocks==block_iter,1))=proposed_par; + last_posterior=logpost; + accepted_draws_counter =accepted_draws_counter +1; + else %no updating + %do nothing, keep old value + end end end accepted=accepted_draws_counter/blocked_draws_counter; par = current_draw; neval=1; + logpost = last_posterior; %make sure not a temporary draw is returned; case 'independent_metropolis_hastings' neval = 1; ProposalFun = sampler_options.proposal_distribution;