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