From 8b49b30f917700ea353a8aa8e573afe5f25277b9 Mon Sep 17 00:00:00 2001
From: Johannes Pfeifer <jpfeifer@gmx.de>
Date: Fri, 24 Jul 2015 16:32:05 +0200
Subject: [PATCH] Add unit tests for prior sampling

---
 matlab/prior_draw.m | 368 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 367 insertions(+), 1 deletion(-)

diff --git a/matlab/prior_draw.m b/matlab/prior_draw.m
index 937730748f..cd0c32a50c 100644
--- a/matlab/prior_draw.m
+++ b/matlab/prior_draw.m
@@ -15,7 +15,7 @@ function pdraw = prior_draw(init,uniform) % --*-- Unitary tests --*--
 % 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.
 
-% Copyright (C) 2006-2010 Dynare Team
+% Copyright (C) 2006-2015 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -149,3 +149,369 @@ if inverse_gamma_2_draws
     end
 end
 
+%@test:1
+%$ %% Initialize required structures
+%$ options_.prior_trunc=0;
+%$ options_.initialize_estimated_parameters_with_the_prior_mode=0;
+%$ 
+%$ M_.dname='test';
+%$ M_.param_names = 'alp';
+%$ ndraws=100000;
+%$ global estim_params_
+%$ estim_params_.var_exo = [];
+%$ estim_params_.var_endo = [];
+%$ estim_params_.corrx = [];
+%$ estim_params_.corrn = [];
+%$ estim_params_.param_vals = [];
+%$ estim_params_.param_vals = [1, NaN, (-Inf), Inf, 1, 0.356, 0.02, NaN, NaN, NaN ];
+%$ 
+%$ %% 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)=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) || 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_vec<estim_params_.param_vals(1,3)) || any(pdraw_vec>estim_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_vec<estim_params_.param_vals(1,8))
+%$     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_);
+%$ 
+%$ 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<estim_params_.param_vals(1,8)) 
+%$     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_);
+%$ 
+%$ 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<estim_params_.param_vals(1,3)) || any(pdraw_vec>estim_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_vec<estim_params_.param_vals(1,8)) 
+%$     error('inverse gamma distribution (type 2) prior wrong')
+%$ end
+%$ 
+%$ %%%%%%%%%%%% With prior truncation
+%$ options_.prior_trunc=.4;
+%$ 
+%$ %% 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_);
+%$ 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_vec<bounds.lb) || any(pdraw_vec>bounds.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_vec<bounds.lb) || any(pdraw_vec>bounds.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_vec<bounds.lb) || any(pdraw_vec>bounds.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_vec<bounds.lb) || any(pdraw_vec>bounds.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_vec<bounds.lb) || any(pdraw_vec>bounds.ub)
+%$     error('inverse gamma distribution (type 2) prior wrong')
+%$ end
+%$ 
+%@eof:1
-- 
GitLab