function pdraw = prior_draw(init,uniform) % --*-- Unitary tests --*--
% This function generate one draw from the joint prior distribution and
% allows sampling uniformly from the prior support (uniform==1 when called with init==1)
%
% INPUTS
% o init [integer] scalar equal to:
% 1: first call to set up persistent variables
% describing the prior
% 0: subsequent call to get prior
% draw
% o uniform [integer] scalar used in initialization (init=1), equal to:
% 1: sample uniformly from prior
% support (overwrites prior shape used for sampling within this function)
% 0: sample from joint prior distribution
%
% OUTPUTS
% o pdraw [double] 1*npar vector, draws from the joint prior density.
%
%
% SPECIAL REQUIREMENTS
% none
%
% NOTE 1. Input arguments 1 an 2 are only needed for initialization.
% NOTE 2. A given draw from the joint prior distribution does not satisfy BK conditions a priori.
% NOTE 3. This code relies on bayestopt_ as created in the base workspace
% by the preprocessor (or as updated in subsequent pieces of code and handed to the base workspace)
%
% Copyright (C) 2006-2015 Dynare Team
%
% This file is part of Dynare.
%
% Dynare is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare is distributed in the hope that it will be useful,
% 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.
%
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see .
persistent p6 p7 p3 p4 lb ub
persistent uniform_index gaussian_index gamma_index beta_index inverse_gamma_1_index inverse_gamma_2_index
persistent uniform_draws gaussian_draws gamma_draws beta_draws inverse_gamma_1_draws inverse_gamma_2_draws
if nargin>0 && init
p6 = evalin('base', 'bayestopt_.p6');
p7 = evalin('base', 'bayestopt_.p7');
p3 = evalin('base', 'bayestopt_.p3');
p4 = evalin('base', 'bayestopt_.p4');
bounds = evalin('base', 'prior_bounds(bayestopt_,options_)');
lb = bounds.lb;
ub = bounds.ub;
number_of_estimated_parameters = length(p6);
if nargin>1 && uniform
prior_shape = repmat(5,number_of_estimated_parameters,1);
else
prior_shape = evalin('base', 'bayestopt_.pshape');
end
beta_index = find(prior_shape==1);
if isempty(beta_index)
beta_draws = 0;
else
beta_draws = 1;
end
gamma_index = find(prior_shape==2);
if isempty(gamma_index)
gamma_draws = 0;
else
gamma_draws = 1;
end
gaussian_index = find(prior_shape==3);
if isempty(gaussian_index)
gaussian_draws = 0;
else
gaussian_draws = 1;
end
inverse_gamma_1_index = find(prior_shape==4);
if isempty(inverse_gamma_1_index)
inverse_gamma_1_draws = 0;
else
inverse_gamma_1_draws = 1;
end
uniform_index = find(prior_shape==5);
if isempty(uniform_index)
uniform_draws = 0;
else
uniform_draws = 1;
end
inverse_gamma_2_index = find(prior_shape==6);
if isempty(inverse_gamma_2_index)
inverse_gamma_2_draws = 0;
else
inverse_gamma_2_draws = 1;
end
pdraw = NaN(number_of_estimated_parameters,1);
return
end
if uniform_draws
pdraw(uniform_index) = rand(length(uniform_index),1).*(p4(uniform_index)-p3(uniform_index)) + p3(uniform_index);
out_of_bound = find( (pdraw(uniform_index)'>ub(uniform_index)) | (pdraw(uniform_index)'ub(uniform_index)) | (pdraw(uniform_index)'ub(gaussian_index)) | (pdraw(gaussian_index)'ub(gaussian_index)) | (pdraw(gaussian_index)'ub(gamma_index)) | (pdraw(gamma_index)'ub(gamma_index)) | (pdraw(gamma_index)'ub(beta_index)) | (pdraw(beta_index)'ub(beta_index)) | (pdraw(beta_index)'ub(inverse_gamma_1_index)) | (pdraw(inverse_gamma_1_index)'ub(inverse_gamma_1_index)) | (pdraw(inverse_gamma_1_index)'ub(inverse_gamma_2_index)) | (pdraw(inverse_gamma_2_index)'ub(inverse_gamma_2_index)) | (pdraw(inverse_gamma_2_index)'1e-4 || abs(std(pdraw_vec)-estim_params_.param_vals(1,7))>1e-4 || any(pdraw_vec<0) || any(pdraw_vec>1)
%$ error('Beta prior wrong')
%$ end
%$
%$
%$ %% Gamma
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 2;%Shape
%$ estim_params_.param_vals(1,6)=0.5;
%$ estim_params_.param_vals(1,7)=0.01;
%$ estim_params_.param_vals(1,8)=NaN;
%$ estim_params_.param_vals(1,9)=NaN;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>1e-4 || abs(std(pdraw_vec)-estim_params_.param_vals(1,7))>1e-4 || any(pdraw_vec<0)
%$ error('Gamma prior wrong')
%$ end
%$
%$ %% Normal
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 3;%Shape
%$ estim_params_.param_vals(1,6)=0.5;
%$ estim_params_.param_vals(1,7)=0.01;
%$ estim_params_.param_vals(1,8)=NaN;
%$ estim_params_.param_vals(1,9)=NaN;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>1e-4 || abs(std(pdraw_vec)-estim_params_.param_vals(1,7))>1e-4
%$ error('Normal prior wrong')
%$ end
%$
%$ %% inverse gamma distribution (type 1)
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 4;%Shape
%$ estim_params_.param_vals(1,6)=0.5;
%$ estim_params_.param_vals(1,7)=0.01;
%$ estim_params_.param_vals(1,8)=NaN;
%$ estim_params_.param_vals(1,9)=NaN;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>1e-4 || abs(std(pdraw_vec)-estim_params_.param_vals(1,7))>1e-4 || any(pdraw_vec<0)
%$ error('inverse gamma distribution (type 1) prior wrong')
%$ end
%$
%$ %% Uniform
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 5;%Shape
%$ estim_params_.param_vals(1,6)=0.5;
%$ estim_params_.param_vals(1,7)=sqrt(12)^(-1)*(1-0);
%$ estim_params_.param_vals(1,8)=NaN;
%$ estim_params_.param_vals(1,9)=NaN;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>1e-2 || abs(std(pdraw_vec)-estim_params_.param_vals(1,7))>1e-3 || any(pdraw_vec<0) || any(pdraw_vec>1)
%$ error('Uniform prior wrong')
%$ end
%$
%$ %% inverse gamma distribution (type 2)
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 6;%Shape
%$ estim_params_.param_vals(1,6)=0.5;
%$ estim_params_.param_vals(1,7)=0.01;
%$ estim_params_.param_vals(1,8)=NaN;
%$ estim_params_.param_vals(1,9)=NaN;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>1e-4 || abs(std(pdraw_vec)-estim_params_.param_vals(1,7))>1e-4 || any(pdraw_vec<0)
%$ error('inverse gamma distribution (type 2) prior wrong')
%$ end
%$
%$
%$ %%%%%%%%%%%%%%%%%%%%%% Generalized distributions %%%%%%%%%%%%%%%%%%%%%
%$
%$ %% beta
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 1;%Shape
%$ estim_params_.param_vals(1,6)=1.5;
%$ estim_params_.param_vals(1,7)=0.01;
%$ estim_params_.param_vals(1,8)=1;
%$ estim_params_.param_vals(1,9)=3;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>1e-4 || abs(std(pdraw_vec)-estim_params_.param_vals(1,7))>1e-4 || any(pdraw_vecestim_params_.param_vals(1,4))
%$ error('Beta prior wrong')
%$ end
%$
%$ %% Gamma
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 2;%Shape
%$ estim_params_.param_vals(1,6)=1.5;
%$ estim_params_.param_vals(1,7)=0.01;
%$ estim_params_.param_vals(1,8)=1;
%$ estim_params_.param_vals(1,9)=NaN;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>1e-4 || abs(std(pdraw_vec)-estim_params_.param_vals(1,7))>1e-4 || any(pdraw_vec1e-4 || abs(std(pdraw_vec)-estim_params_.param_vals(1,7))>1e-4 || any(pdraw_vec1e-4 || abs(std(pdraw_vec)-estim_params_.param_vals(1,7))>1e-4 || any(pdraw_vecestim_params_.param_vals(1,4))
%$ error('Uniform prior wrong')
%$ end
%$
%$ %% inverse gamma distribution (type 2)
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 6;%Shape
%$ estim_params_.param_vals(1,6)=1.5;
%$ estim_params_.param_vals(1,7)=0.01;
%$ estim_params_.param_vals(1,8)=1;
%$ estim_params_.param_vals(1,9)=NaN;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>1e-4 || abs(std(pdraw_vec)-estim_params_.param_vals(1,7))>1e-4 || any(pdraw_vec5e-3 || any(pdraw_vecbounds.ub)
%$ error('Beta prior wrong')
%$ end
%$
%$ %% Gamma
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 2;%Shape
%$ estim_params_.param_vals(1,6)=1.5;
%$ estim_params_.param_vals(1,7)=0.01;
%$ estim_params_.param_vals(1,8)=1;
%$ estim_params_.param_vals(1,9)=NaN;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$ bounds = prior_bounds(bayestopt_,options_)';
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>5e-3 || any(pdraw_vecbounds.ub)
%$ error('Gamma prior wrong')
%$ end
%$
%$ %% inverse gamma distribution (type 1)
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 4;%Shape
%$ estim_params_.param_vals(1,6)=1.5;
%$ estim_params_.param_vals(1,7)=0.01;
%$ estim_params_.param_vals(1,8)=1;
%$ estim_params_.param_vals(1,9)=NaN;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$ bounds = prior_bounds(bayestopt_,options_)';
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>5e-3 || any(pdraw_vecbounds.ub)
%$ error('inverse gamma distribution (type 1) prior wrong')
%$ end
%$
%$ %% Uniform
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 5;%Shape
%$ estim_params_.param_vals(1,6)=1.5;
%$ estim_params_.param_vals(1,7)=0.01;
%$ estim_params_.param_vals(1,8)=NaN;
%$ estim_params_.param_vals(1,9)=NaN;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$ bounds = prior_bounds(bayestopt_,options_)';
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>5e-3 || any(pdraw_vecbounds.ub)
%$ error('Uniform prior wrong')
%$ end
%$
%$
%$ %% inverse gamma distribution (type 2)
%$ estim_params_.param_vals(1,3)= -Inf;%LB
%$ estim_params_.param_vals(1,4)= +Inf;%UB
%$ estim_params_.param_vals(1,5)= 6;%Shape
%$ estim_params_.param_vals(1,6)=1.5;
%$ estim_params_.param_vals(1,7)=0.01;
%$ estim_params_.param_vals(1,8)=1;
%$ estim_params_.param_vals(1,9)=NaN;
%$
%$ [xparam1, estim_params_, bayestopt_, lb, ub, M_]=set_prior(estim_params_, M_, options_);
%$ bounds = prior_bounds(bayestopt_,options_)';
%$
%$ pdraw = prior_draw(1,0);
%$ pdraw_vec=NaN(ndraws,1);
%$ for ii=1:ndraws
%$ pdraw_vec(ii)=prior_draw(0,0);
%$ end
%$
%$ if abs(mean(pdraw_vec)-estim_params_.param_vals(1,6))>5e-3 || any(pdraw_vecbounds.ub)
%$ error('inverse gamma distribution (type 2) prior wrong')
%$ end
%$
%@eof:1