diff --git a/matlab/cli/prior.m b/matlab/cli/prior.m new file mode 100644 index 0000000000000000000000000000000000000000..f490a570b315f161ae4c9ee8a90fee314fe2c776 --- /dev/null +++ b/matlab/cli/prior.m @@ -0,0 +1,129 @@ +function varargout = prior(varargin) + +% Computes various prior statistics and display them in the command window. +% +% INPUTS +% 'table', 'moments', 'optimize', 'simulate', 'plot' +% +% OUTPUTS +% none +% +% SPECIAL REQUIREMENTS +% none + +% Copyright (C) 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 <http://www.gnu.org/licenses/>. + +global options_ M_ estim_params_ bayestopt_ oo_ objective_function_penalty_base + +donesomething = false; + +% Temporarly change qz_criterium option value +changed_qz_criterium_flag = 0; +if isempty(options_.qz_criterium) + options_.qz_criterium = 1+1e-9; + changed_qz_criterium_flag = 1; +end + +M_.dname = M_.fname; + +% Temporarly set options_.order equal to one +order = options_.order; +options_.order = 1; + +[xparam1,estim_params_,bayestopt_,lb,ub,M_] = set_prior(estim_params_,M_,options_); + +if ismember('plot', varargin) + plot_priors(bayestopt_,M_,estim_params_,options_) + donesomething = true; +end + +if ismember('table', varargin) + print_table_prior(lb, ub, options_, M_, bayestopt_, estim_params_); + donesomething = true; +end + +if ismember('simulate', varargin) % Prior simulations (BK). + results = prior_sampler(0,M_,bayestopt_,options_,oo_,estim_params_); + % Display prior mass info + skipline(2) + disp(['Prior mass = ' num2str(results.prior.mass)]) + disp(['BK indeterminacy share = ' num2str(results.bk.indeterminacy_share)]) + disp(['BK unstability share = ' num2str(results.bk.unstability_share)]) + disp(['BK singularity share = ' num2str(results.bk.singularity_share)]) + disp(['Complex jacobian share = ' num2str(results.jacobian.problem_share)]) + disp(['mjdgges crash share = ' num2str(results.dll.problem_share)]) + disp(['Steady state problem share = ' num2str(results.ss.problem_share)]) + disp(['Complex steady state share = ' num2str(results.ss.complex_share)]) + disp(['Analytical steady state problem share = ' num2str(results.ass.problem_share)]) + skipline(2) + donesomething = true; +end + +if ismember('optimize', varargin) % Prior optimization. + optimize_prior(options_, M_, oo_, bayestopt_, estim_params_); + donesomething = true; +end + +if ismember('moments', varargin) % Prior simulations (2nd order moments). + % Set estimated parameters to the prior mode... + xparam1 = bayestopt_.p5; + % ... Except for uniform priors! + k = find(isnan(xparam1)); + xparam1(k) = bayestopt_.p5(k); + % Update vector of parameters and covariance matrices + M_ = set_all_parameters(xparam1,estim_params_,M_); + % Check model. + check_model(M_); + % Compute state space representation of the model. + oo_.dr=set_state_space(oo_.dr, M_, options_); + % Solve model + [dr,info, M_ ,options_ , oo_] = resol(0, M_ , options_ ,oo_); + % Compute and display second order moments + disp_th_moments(oo_.dr,[]); + skipline(2) + donesomething = true; +end + +if changed_qz_criterium_flag + options_.qz_criterium = []; +end + +options_.order = order; + +if ~donesomething + error('prior: Unexpected arguments!') +end + +function format_string = build_format_string(PriorStandardDeviation,LowerBound,UpperBound) +format_string = ['%s & %s & %6.4f &']; +if ~isnumeric(PriorStandardDeviation) + format_string = [ format_string , ' %s &']; +else + format_string = [ format_string , ' %6.4f &']; +end +if ~isnumeric(LowerBound) + format_string = [ format_string , ' %s &']; +else + format_string = [ format_string , ' %6.4f &']; +end +if ~isnumeric(UpperBound) + format_string = [ format_string , ' %s &']; +else + format_string = [ format_string , ' %6.4f &']; +end +format_string = [ format_string , ' %6.4f & %6.4f \\\\ \n']; \ No newline at end of file diff --git a/matlab/dynare_config.m b/matlab/dynare_config.m index 24543ddcde334346f71dd58a0ca71a3824859e18..160cd62220d550cf65a4a30c5a366264a9a9feaa 100644 --- a/matlab/dynare_config.m +++ b/matlab/dynare_config.m @@ -58,6 +58,7 @@ addpath([dynareroot '/parallel/']) addpath([dynareroot '/particle/']) addpath([dynareroot '/gsa/']) addpath([dynareroot '/ep/']) +addpath([dynareroot '/cli/']) addpath([dynareroot '/lmmcp/']) addpath([dynareroot '/optimization/']) addpath([dynareroot '/modules/dates/src/']) diff --git a/matlab/get_prior_info.m b/matlab/get_prior_info.m deleted file mode 100644 index 6a82442bf2d8d1abb12ea554bf9fec4fd5364dcf..0000000000000000000000000000000000000000 --- a/matlab/get_prior_info.m +++ /dev/null @@ -1,253 +0,0 @@ -function results = get_prior_info(info,plt_flag) -% Computes various prior statistics. -% -% INPUTS -% info [integer] scalar specifying what has to be done. -% -% OUTPUTS -% none -% -% SPECIAL REQUIREMENTS -% none - -% Copyright (C) 2009-2012 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 <http://www.gnu.org/licenses/>. -global options_ M_ estim_params_ oo_ objective_function_penalty_base - -if ~nargin - info = 0; - plt_flag = 0; -end - -if nargin==1 - plt_flag = 1; -end - -% Initialize returned variable. -results = []; - -changed_qz_criterium_flag = 0; -if isempty(options_.qz_criterium) - options_.qz_criterium = 1+1e-9; - changed_qz_criterium_flag = 1; -end - -M_.dname = M_.fname; - -% Temporarly set options_.order equal to one -order = options_.order; -options_.order = 1; - -[xparam1,estim_params_,bayestopt_,lb,ub,M_] = set_prior(estim_params_,M_,options_); - -if plt_flag - plot_priors(bayestopt_,M_,estim_params_,options_) -end - -PriorNames = { 'Beta' , 'Gamma' , 'Gaussian' , 'Inverted Gamma' , 'Uniform' , 'Inverted Gamma -- 2' }; - -if size(M_.param_names,1)==size(M_.param_names_tex,1)% All the parameters have a TeX name. - fidTeX = fopen('priors_data.tex','w+'); - fprintf(fidTeX,'%% TeX-table generated by get_prior_info (Dynare).\n'); - fprintf(fidTeX,'%% Prior Information\n'); - fprintf(fidTeX,['%% ' datestr(now,0)]); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,'\\begin{center}\n'); - fprintf(fidTeX,'\\begin{longtable}{l|ccccccc} \n'); - fprintf(fidTeX,'\\caption{Prior information (parameters)}\\\\\n '); - fprintf(fidTeX,'\\label{Table:Prior}\\\\\n'); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Lower Bound & Upper Bound & LB Untrunc. 80\\%% HPDI & UB Untrunc. 80\\%% HPDI \\\\ \n'); - fprintf(fidTeX,'\\hline \\endfirsthead \n'); - fprintf(fidTeX,'\\caption{(continued)}\\\\\n '); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Lower Bound & Upper Bound & LB Untrunc. 80\\%% HPDI & UB Untrunc. 80\\%% HPDI \\\\ \n'); - fprintf(fidTeX,'\\hline \\endhead \n'); - fprintf(fidTeX,'\\hline \\multicolumn{8}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); - fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); - - % Column 1: a string for the name of the prior distribution. - % Column 2: the prior mean. - % Column 3: the prior standard deviation. - % Column 4: the lower bound of the prior density support. - % Column 5: the upper bound of the prior density support. - % Column 6: the lower bound of the interval containing 80% of the prior mass. - % Column 7: the upper bound of the interval containing 80% of the prior mass. - prior_trunc_backup = options_.prior_trunc ; - options_.prior_trunc = (1-options_.prior_interval)/2 ; - PriorIntervals = prior_bounds(bayestopt_,options_) ; - options_.prior_trunc = prior_trunc_backup ; - for i=1:size(bayestopt_.name,1) - [tmp,TexName] = get_the_name(i,1,M_,estim_params_,options_); - PriorShape = PriorNames{ bayestopt_.pshape(i) }; - PriorMean = bayestopt_.p1(i); - PriorStandardDeviation = bayestopt_.p2(i); - switch bayestopt_.pshape(i) - case { 1 , 5 } - LowerBound = bayestopt_.p3(i); - UpperBound = bayestopt_.p4(i); - if ~isinf(lb(i)) - LowerBound=max(LowerBound,lb(i)); - end - if ~isinf(ub(i)) - UpperBound=min(UpperBound,ub(i)); - end - case { 2 , 4 , 6 } - LowerBound = bayestopt_.p3(i); - if ~isinf(lb(i)) - LowerBound=max(LowerBound,lb(i)); - end - if ~isinf(ub(i)) - UpperBound=ub(i); - else - UpperBound = '$\infty$'; - end - case 3 - if isinf(bayestopt_.p3(i)) && isinf(lb(i)) - LowerBound = '$-\infty$'; - else - LowerBound = bayestopt_.p3(i); - if ~isinf(lb(i)) - LowerBound=max(LowerBound,lb(i)); - end - end - if isinf(bayestopt_.p4(i)) && isinf(ub(i)) - UpperBound = '$\infty$'; - else - UpperBound = bayestopt_.p4(i); - if ~isinf(ub(i)) - UpperBound=min(UpperBound,ub(i)); - end - end - otherwise - error('get_prior_info:: Dynare bug!') - end - format_string = build_format_string(PriorStandardDeviation,LowerBound,UpperBound); - fprintf(fidTeX,format_string, ... - TexName, ... - PriorShape, ... - PriorMean, ... - PriorStandardDeviation, ... - LowerBound, ... - UpperBound, ... - PriorIntervals.lb(i), ... - PriorIntervals.ub(i) ); - end - fprintf(fidTeX,'\\end{longtable}\n '); - fprintf(fidTeX,'\\end{center}\n'); - fprintf(fidTeX,'%% End of TeX file.\n'); - fclose(fidTeX); -end - -M_.dname = M_.fname; - -if info==1% Prior simulations (BK). - results = prior_sampler(0,M_,bayestopt_,options_,oo_,estim_params_); - % Display prior mass info - disp(['Prior mass = ' num2str(results.prior.mass)]) - disp(['BK indeterminacy share = ' num2str(results.bk.indeterminacy_share)]) - disp(['BK unstability share = ' num2str(results.bk.unstability_share)]) - disp(['BK singularity share = ' num2str(results.bk.singularity_share)]) - disp(['Complex jacobian share = ' num2str(results.jacobian.problem_share)]) - disp(['mjdgges crash share = ' num2str(results.dll.problem_share)]) - disp(['Steady state problem share = ' num2str(results.ss.problem_share)]) - disp(['Complex steady state share = ' num2str(results.ss.complex_share)]) - disp(['Analytical steady state problem share = ' num2str(results.ass.problem_share)]) -end - -if info==2% Prior optimization. - % Initialize to the prior mode if possible - oo_.dr=set_state_space(oo_.dr,M_,options_); - k = find(~isnan(bayestopt_.p5)); - xparam1(k) = bayestopt_.p5(k); - % Pertubation of the initial condition. - look_for_admissible_initial_condition = 1; - scale = 1.0; - iter = 0; - while look_for_admissible_initial_condition - xinit = xparam1+scale*randn(size(xparam1)); - if all(xinit(:)>bayestopt_.p3) && all(xinit(:)<bayestopt_.p4) - M_ = set_all_parameters(xinit,estim_params_,M_); - [dr,INFO,M_,options_,oo_] = resol(0,M_,options_,oo_); - if ~INFO(1) - look_for_admissible_initial_condition = 0; - end - else - if iter == 2000; - scale = scale/1.1; - iter = 0; - else - iter = iter+1; - end - end - end - objective_function_penalty_base = minus_logged_prior_density(xinit, bayestopt_.pshape, ... - bayestopt_.p6, ... - bayestopt_.p7, ... - bayestopt_.p3, ... - bayestopt_.p4,options_,M_,estim_params_,oo_); - % Maximization - [xparams,lpd,hessian] = ... - maximize_prior_density(xinit, bayestopt_.pshape, ... - bayestopt_.p6, ... - bayestopt_.p7, ... - bayestopt_.p3, ... - bayestopt_.p4,options_,M_,bayestopt_,estim_params_,oo_); - % Display the results. - skipline(2) - disp('------------------') - disp('PRIOR OPTIMIZATION') - disp('------------------') - skipline() - for i = 1:length(xparams) - disp(['deep parameter ' int2str(i) ': ' get_the_name(i,0,M_,estim_params_,options_) '.']) - disp([' Initial condition ....... ' num2str(xinit(i)) '.']) - disp([' Prior mode .............. ' num2str(bayestopt_.p5(i)) '.']) - disp([' Optimized prior mode .... ' num2str(xparams(i)) '.']) - skipline() - end -end - -if info==3% Prior simulations (2nd order moments). - oo_ = compute_moments_varendo('prior',options_,M_,oo_); -end - -if changed_qz_criterium_flag - options_.qz_criterium = []; -end - -options_.order = order; - -function format_string = build_format_string(PriorStandardDeviation,LowerBound,UpperBound) -format_string = ['%s & %s & %6.4f &']; -if ~isnumeric(PriorStandardDeviation) - format_string = [ format_string , ' %s &']; -else - format_string = [ format_string , ' %6.4f &']; -end -if ~isnumeric(LowerBound) - format_string = [ format_string , ' %s &']; -else - format_string = [ format_string , ' %6.4f &']; -end -if ~isnumeric(UpperBound) - format_string = [ format_string , ' %s &']; -else - format_string = [ format_string , ' %6.4f &']; -end -format_string = [ format_string , ' %6.4f & %6.4f \\\\ \n']; \ No newline at end of file