diff --git a/matlab/GetPosteriorParametersStatistics.m b/matlab/GetPosteriorParametersStatistics.m
index c51e0a2ba..7ecbd7b12 100644
--- a/matlab/GetPosteriorParametersStatistics.m
+++ b/matlab/GetPosteriorParametersStatistics.m
@@ -1,4 +1,4 @@
-function oo_ = GetPosteriorParametersStatistics(estim_params_, M_, options_, bayestopt_, oo_)
+function oo_ = GetPosteriorParametersStatistics(estim_params_, M_, options_, bayestopt_, oo_, pnames)
% This function prints and saves posterior estimates after the mcmc
% (+updates of oo_ & TeX output).
%
@@ -8,6 +8,7 @@ function oo_ = GetPosteriorParametersStatistics(estim_params_, M_, options_, bay
% options_ [structure]
% bayestopt_ [structure]
% oo_ [structure]
+% pnames [char] Array of char, names of the prior shapes available
%
% OUTPUTS
% oo_ [structure]
@@ -15,7 +16,7 @@ function oo_ = GetPosteriorParametersStatistics(estim_params_, M_, options_, bay
% SPECIAL REQUIREMENTS
% None.
-% Copyright (C) 2006-2013 Dynare Team
+% Copyright (C) 2006-2015 Dynare Team
%
% This file is part of Dynare.
%
@@ -59,7 +60,6 @@ FirstMhFile = record.KeepedDraws.FirstMhFile;
NumberOfDraws = TotalNumberOfMhDraws-floor(options_.mh_drop*TotalNumberOfMhDraws);
clear record;
-pnames=[' ';'beta ';'gamma';'norm ';'invg ';'unif ';'invg2'];
header_width = row_header_width(M_,estim_params_,bayestopt_);
hpd_interval=[num2str(options_.mh_conf_sig*100), '% HPD interval'];
tit2 = sprintf('%-*s %12s %12s %23s %8s %12s\n',header_width,' ','prior mean','post. mean',hpd_interval,'prior','pstdev');
diff --git a/matlab/distributions/compute_prior_mode.m b/matlab/distributions/compute_prior_mode.m
index e6d35920c..9270fc659 100644
--- a/matlab/distributions/compute_prior_mode.m
+++ b/matlab/distributions/compute_prior_mode.m
@@ -69,7 +69,7 @@ switch shape
case 4
% s = hyperparameters(1)
% nu = hyperparameters(2)
- m = 1/sqrt((hyperparameters(2)+1)/hyperparameters(1));%sqrt((hyperparameters(2)-1)/hyperparameters(1))
+ m = 1/sqrt((hyperparameters(2)+1)/hyperparameters(1));
if length(hyperparameters)>2
m = m + hyperparameters(3);
end
@@ -82,6 +82,18 @@ switch shape
if length(hyperparameters)>2
m = m + hyperparameters(3) ;
end
+ case 8
+ % s = hyperparameters(1) [scale parameter]
+ % k = hyperparameters(2) [shape parameter]
+ if hyperparameters(2)<=1
+ m = 0;
+ else
+ m = hyperparameters(1)*((hyperparameters(2)-1)/hyperparameters(2))^(1/hyperparameters(2))
+ end
+ if length(hyperparameters)>2
+ % Add location parameter
+ m = m + hyperparameters(3) ;
+ end
otherwise
error('Unknown prior shape!')
end
\ No newline at end of file
diff --git a/matlab/distributions/icdfweibull.m b/matlab/distributions/icdfweibull.m
new file mode 100644
index 000000000..9286d504e
--- /dev/null
+++ b/matlab/distributions/icdfweibull.m
@@ -0,0 +1,145 @@
+function t = icdfweibull(proba, scale, shape) % --*-- Unitary tests --*--
+
+% Inverse cumulative distribution function.
+%
+% INPUTS
+% - proba [double] Probability, scalar between 0 and 1.
+% - scale [double] Positive hyperparameter.
+% - shape [double] Positive hyperparameter.
+%
+% OUTPUTS
+% - t [double] scalar such that P(X<=t)=proba
+
+% 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 .
+
+if proba<2*eps()
+ t = 0;
+ return
+end
+
+if proba>1-2*eps()
+ t = Inf;
+ return
+end
+
+t = exp(log(scale)+log(-log(1-proba))/shape);
+
+%@test:1
+%$ try
+%$ x = icdfweibull(0, 1, 2);
+%$ t(1) = true;
+%$ catch
+%$ t(1) = false;
+%$ end
+%$
+%$ if t(1)
+%$ t(2) = isequal(x, 0);
+%$ end
+%$ T = all(t);
+%@eof:1
+
+%@test:2
+%$ try
+%$ x = icdfweibull(1, 1, 2);
+%$ t(1) = true;
+%$ catch
+%$ t(1) = false;
+%$ end
+%$
+%$ if t(1)
+%$ t(2) = isinf(x);
+%$ end
+%$ T = all(t);
+%@eof:2
+
+%@test:3
+%$ scales = [.5, 1, 5];
+%$ shapes = [.1, 1, 2];
+%$ x = NaN(9,1);
+%$
+%$ try
+%$ k = 0;
+%$ for i=1:3
+%$ for j=1:3
+%$ k = k+1;
+%$ x(k) = icdfweibull(.5, scales(i), shapes(j));
+%$ end
+%$ end
+%$ t(1) = true;
+%$ catch
+%$ t(1) = false;
+%$ end
+%$
+%$ if t(1)
+%$ k = 1;
+%$ for i=1:3
+%$ for j=1:3
+%$ k = k+1;
+%$ t(k) = abs(x(k-1)-scales(i)*log(2)^(1/shapes(j)))<1e-12;
+%$ end
+%$ end
+%$ end
+%$ T = all(t);
+%@eof:3
+
+%@test:4
+%$ debug = false;
+%$ scales = [ .5, 1, 5];
+%$ shapes = [ 1, 2, 3];
+%$ x = NaN(9,1);
+%$ p = 1e-1;
+%$
+%$ try
+%$ k = 0;
+%$ for i=1:3
+%$ for j=1:3
+%$ k = k+1;
+%$ x(k) = icdfweibull(p, scales(i), shapes(j));
+%$ end
+%$ end
+%$ t(1) = true;
+%$ catch
+%$ t(1) = false;
+%$ end
+%$
+%$ if t(1)
+%$ k = 1;
+%$ for i=1:3
+%$ for j=1:3
+%$ k = k+1;
+%$ shape = shapes(j);
+%$ scale = scales(i);
+%$ density = @(z) exp(lpdfgweibull(z,shape,scale));
+%$ if debug
+%$ [shape, scale, x(k-1)]
+%$ end
+%$ if isoctave
+%$ s = quadv(density, 0, x(k-1));
+%$ else
+%$ s = integral(density, 0, x(k-1));
+%$ end
+%$ if debug
+%$ [s, abs(p-s)]
+%$ end
+%$ t(k) = abs(p-s)<1e-12;
+%$ end
+%$ end
+%$ end
+%$ T = all(t);
+%@eof:4
+
diff --git a/matlab/distributions/lpdfgweibull.m b/matlab/distributions/lpdfgweibull.m
new file mode 100644
index 000000000..cdfc4ef7e
--- /dev/null
+++ b/matlab/distributions/lpdfgweibull.m
@@ -0,0 +1,431 @@
+function [ldens,Dldens,D2ldens] = lpdfgweibull(x,a,b,c) % --*-- Unitary tests --*--
+
+% Evaluates the logged Weibull PDF at x.
+%
+% INPUTS
+% - x [double] m*n matrix of points where the (logged) density will be evaluated,
+% - a [double] m*n matrix of First Weibull distribution parameters,
+% - b [double] m*n matrix of Second Weibull distribution parameters,
+% - c [double] m*n matrix of Third Weibull distribution parameters (location parameter, default is 0).
+%
+% OUTPUTS
+% - ldens [double] m*n matrix of logged (generalized) Weibull densities.
+% - Dldens [double] m*n matrix (first order derivatives w.r.t. x)
+% - D2ldens [double] m*n matrix (second order derivatives w.r.t. x)
+%
+% 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 .
+
+% Initialize output arguments
+ldens = -Inf(size(x));
+if nargout>1
+ Dldens = NaN(size(x));
+ D2ldens = NaN(size(x));
+end
+
+% Check the number of input arguments
+if nargin<3
+ error('CheckInputArgs','At least three input arguments required!')
+end
+
+% Set default value for location parameter(s).
+if nargin<4
+ c = zeros(size(x));
+end
+
+% Reshape inputs if needed (and possible)
+if ~isscalar(x)
+ if isscalar(a)
+ a = repmat(a, size(x));
+ end
+ if isscalar(b)
+ b = repmat(b, size(x));
+ end
+ if isscalar(c)
+ c = repmat(c, size(x));
+ end
+end
+
+% Get indices for which the densty is defined
+idx = find((x-c)>=0);
+
+% Check size of the inputs
+if (~isequal(size(x), size(a)) || ~isequal(size(x), size(b)) || ~isequal(size(x), size(c)))
+ error('CheckInputArgs','All input arguments must have the same dimensions!')
+end
+
+if isempty(idx), return, end
+
+% Compute the logged density
+
+jdx = find( abs(a-1)<1e-12 & x>=c & (x-c)<1e-12) ;
+ldens(jdx) = 1.0;
+
+if ~isempty(idx)
+ x0 = x(idx)-c(idx);
+ x1 = x0./b(idx);
+ x2 = x1.^a(idx);
+ idx = setdiff(idx, jdx);
+ ldens(idx) = log(a(idx)) - a(idx).*log(b(idx)) + (a(idx)-1).*log(x0) - x2 ;
+end
+
+% Compute the first and second derivatives.
+if nargout>1
+ x3 = (a(idx)-1)./x0;
+ x4 = a(idx).*x2./x1./b(idx);
+ Dldens(idx) = x3 - x4;
+ if nargout>2
+ D2ldens(idx) = -x3./x0 - (a(idx)-1).*x4./x1./b(idx);
+ end
+end
+
+%@test:1
+%$ try
+%$ lpdfgweibull(1.0);
+%$ t(1) = false;
+%$ catch
+%$ t(1) = true;
+%$ end
+%$
+%$ T = all(t);
+%@eof:1
+
+%@test:2
+%$ try
+%$ lpdfgweibull(1.0, .5);
+%$ t(1) = false;
+%$ catch
+%$ t(1) = true;
+%$ end
+%$
+%$ T = all(t);
+%@eof:2
+
+%@test:3
+%$ try
+%$ lpdfgweibull(ones(2,2), .5*ones(2,1), .1*ones(3,1));
+%$ t(1) = false;
+%$ catch
+%$ t(1) = true;
+%$ end
+%$
+%$ T = all(t);
+%@eof:3
+
+%@test:4
+%$ try
+%$ a = lpdfgweibull(-1, .5, .1);
+%$ t(1) = true;
+%$ catch
+%$ t(1) = false;
+%$ end
+%$
+%$ if t(1)
+%$ t(2) = isinf(a);
+%$ end
+%$
+%$ T = all(t);
+%@eof:4
+
+%@test:5
+%$ try
+%$ a = lpdfgweibull(0, 1, 1);
+%$ t(1) = true;
+%$ catch
+%$ t(1) = false;
+%$ end
+%$
+%$ if t(1)
+%$ t(2) = abs(a-1.0)<1e-10;
+%$ end
+%$
+%$ T = all(t);
+%@eof:5
+
+%@test:6
+%$ try
+%$ a = lpdfgweibull([0, -1], [1 1], [1 1]);
+%$ t(1) = true;
+%$ catch
+%$ t(1) = false;
+%$ end
+%$
+%$ if t(1)
+%$ t(2) = abs(a(1)-1.0)<1e-10;
+%$ t(3) = isinf(a(2));
+%$ end
+%$
+%$ T = all(t);
+%@eof:6
+
+%@test:7
+%$ scale = 1;
+%$ shape = 2;
+%$ mode = scale*((shape-1)/shape)^(1/shape);
+%$
+%$ try
+%$ [a, b, c] = lpdfgweibull(mode, shape, scale);
+%$ p = rand(1000,1)*4;
+%$ am = lpdfgweibull(p, shape*ones(size(p)), scale*ones(size(p)));
+%$ t(1) = true;
+%$ catch
+%$ t(1) = false;
+%$ end
+%$
+%$ if t(1)
+%$
+%$ t(2) = abs(b)<1e-8;
+%$ t(3) = c<0;
+%$ t(4) = all(am.
+
+scale = NaN;
+shape = NaN;
+
+mu2 = mu*mu;
+
+eqn = @(k) gammaln(1+2./k) - 2*gammaln(1+1./k) - log(1+sigma2/mu2);
+eqn2 = @(k) eqn(k).*eqn(k);
+
+kstar = fminbnd(eqn2, 1e-9, 100);
+[shape, fval, exitflag] = fzero(eqn, kstar);
+
+if exitflag<1
+ shape = NaN;
+ return
+end
+
+scale = mu/gamma(1+1/shape);
+
+%@test:1
+%$ debug = false;
+%$ scales = 1:.01:5;
+%$ shapes = .5:.01:2;
+%$ n_scales = length(scales);
+%$ n_shapes = length(shapes);
+%$ mu = NaN(n_scales, n_shapes);
+%$ s2 = NaN(n_scales, n_shapes);
+%$ for i=1:n_shapes
+%$ g1 = gamma(1+1/shapes(i));
+%$ g2 = gamma(1+2/shapes(i));
+%$ g3 = g1*g1;
+%$ for j=1:n_scales
+%$ mu(j, i) = scales(j)*g1;
+%$ s2(j, i) = scales(j)*scales(j)*(g2-g3);
+%$ end
+%$ end
+%$ if debug
+%$ success = [];
+%$ failed1 = [];
+%$ failed1_ = [];
+%$ failed2 = [];
+%$ end
+%$ try
+%$ for i=1:n_shapes
+%$ for j=1:n_scales
+%$ if debug
+%$ disp(sprintf('... mu=%s and s2=%s', num2str(mu(j,i)),num2str(s2(j,i))))
+%$ end
+%$ if ~isnan(mu(j,i)) && ~isnan(s2(j,i)) && ~isinf(mu(j,i)) && ~isinf(s2(j,i))
+%$ [scale, shape] = weibull_specification(mu(j,i), s2(j,i));
+%$ if isnan(scale)
+%$ t = false;
+%$ else
+%$ if abs(scales(j)-scale)<1e-9 && abs(shapes(i)-shape)<1e-9
+%$ t = true;
+%$ else
+%$ t = false;
+%$ end
+%$ end
+%$ if ~t
+%$ failed1 = [failed1; mu(j,i) s2(j,i)];
+%$ failed1_ = [failed1_; shapes(i) scales(j)];
+%$ error('UnitTest','Cannot compute scale and shape hyperparameters for mu=%s and s2=%s', num2str(mu(j,i)), num2str(s2(j,i)))
+%$ end
+%$ if debug
+%$ success = [success; mu(j,i) s2(j,i)];
+%$ end
+%$ else
+%$ failed2 = [failed2; shapes(i) scales(j)];
+%$ continue % Pass this test
+%$ end
+%$ end
+%$ end
+%$ catch
+%$ t = false;
+%$ end
+%$
+%$ if debug
+%$ figure(1)
+%$ plot(success(:,1),success(:,2),'ok');
+%$ if ~isempty(failed1)
+%$ hold on
+%$ plot(failed1(:,1),failed1(:,2),'or');
+%$ hold off
+%$ figure(2)
+%$ plot(failed1_(:,1),failed1_(:,2),'or')
+%$ end
+%$ if ~isempty(failed2)
+%$ figure(2)
+%$ plot(failed2(:,1),failed2(:,2),'or');
+%$ end
+%$ end
+%$ T = all(t);
+%@eof:1
+
diff --git a/matlab/draw_prior_density.m b/matlab/draw_prior_density.m
index 0f7b70450..cf587d61f 100644
--- a/matlab/draw_prior_density.m
+++ b/matlab/draw_prior_density.m
@@ -100,6 +100,12 @@ switch pshape(indx)
end
abscissa = linspace(infbound,supbound,steps);
dens = exp(lpdfig2(abscissa-p3(indx),p6(indx),p7(indx)));
+ case 8
+ density = @(x,a,b,c) exp(lpdfgweibull(x, a, b, c));
+ infbound = p3(indx)+icdfweibull(truncprior,p6(indx),p7(indx));
+ supbound = p3(indx)+icdfweibull(1-truncprior,p6(indx),p7(indx));
+ abscissa = linspace(infbound,supbound,steps);
+ dens = density(abscissa,p6(indx),p7(indx),p3(indx));
otherwise
error(sprintf('draw_prior_density: unknown distribution shape (index %d, type %d)', indx, pshape(indx)));
end
diff --git a/matlab/dynare_estimation_1.m b/matlab/dynare_estimation_1.m
index b764f0d52..55b40654c 100644
--- a/matlab/dynare_estimation_1.m
+++ b/matlab/dynare_estimation_1.m
@@ -130,7 +130,7 @@ ncn = estim_params_.ncn; % Covariance of the measurement innovations (number of
np = estim_params_.np ; % Number of deep parameters.
nx = nvx+nvn+ncx+ncn+np; % Total number of parameters to be estimated.
%% Set the names of the priors.
-pnames = [' ';'beta ';'gamm ';'norm ';'invg ';'unif ';'invg2'];
+pnames = [' '; 'beta '; 'gamm '; 'norm '; 'invg '; 'unif '; 'invg2'; ' '; 'weibl'];
dr = oo_.dr;
@@ -470,7 +470,7 @@ if (any(bayestopt_.pshape >0 ) && options_.mh_replic) || ...
if options_.mh_replic
[marginal,oo_] = marginal_density(M_, options_, estim_params_, oo_);
% Store posterior statistics by parameter name
- oo_ = GetPosteriorParametersStatistics(estim_params_, M_, options_, bayestopt_, oo_);
+ oo_ = GetPosteriorParametersStatistics(estim_params_, M_, options_, bayestopt_, oo_, pnames);
if ~options_.nograph
oo_ = PlotPosteriorDistributions(estim_params_, M_, options_, bayestopt_, oo_);
end
diff --git a/matlab/missing/stats/wblrnd.m b/matlab/missing/stats/wblrnd.m
new file mode 100644
index 000000000..2f55bc8b7
--- /dev/null
+++ b/matlab/missing/stats/wblrnd.m
@@ -0,0 +1,43 @@
+function rnd = wblrnd(a, b)
+% This function produces independent random variates from the Weibull distribution.
+%
+% INPUTS
+% a [double] m*n matrix of positive parameters (scale).
+% b [double] m*n matrix of positive parameters (shape).
+%
+% OUTPUT
+% rnd [double] m*n matrix of independent variates from the beta(a,b) distribution.
+
+% 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 .
+
+if (nargin ~= 2)
+ error('Two input arguments required!');
+end
+
+if (any(a(:)<0)) || (any(b(:)<0)) || (any(a(:)==Inf)) || (any(b(:)==Inf))
+ error('Input arguments must be finite and positive!');
+end
+
+[ma,na] = size(a);
+[mb,nb] = size(b);
+
+if ma~=mb || na~=nb
+ error('Input arguments must have the same size!');
+end
+
+rnd = a.*(-log(rand(ma, na))).^(1./b);
\ No newline at end of file
diff --git a/matlab/prior_bounds.m b/matlab/prior_bounds.m
index a224c69a0..66baf8494 100644
--- a/matlab/prior_bounds.m
+++ b/matlab/prior_bounds.m
@@ -151,6 +151,14 @@ for i=1:length(p6)
end
end
end
+ case 8
+ if prior_trunc == 0
+ bounds.lb(i) = p3(i);
+ bounds.ub(i) = Inf;
+ else
+ bounds.lb(i) = p3(i)+icdfweibull(prior_trunc,p6(i),p7(i));
+ bounds.ub(i) = p3(i)+icdfweibull(1-prior_trunc,p6(i),p7(i));
+ end
otherwise
error(sprintf('prior_bounds: unknown distribution shape (index %d, type %d)', i, pshape(i)));
end
diff --git a/matlab/prior_draw.m b/matlab/prior_draw.m
index 7bf27e260..5f89ed0b9 100644
--- a/matlab/prior_draw.m
+++ b/matlab/prior_draw.m
@@ -43,9 +43,8 @@ function pdraw = prior_draw(init,uniform) % --*-- Unitary tests --*--
% 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
-
+persistent uniform_index gaussian_index gamma_index beta_index inverse_gamma_1_index inverse_gamma_2_index weibull_index
+persistent uniform_draws gaussian_draws gamma_draws beta_draws inverse_gamma_1_draws inverse_gamma_2_draws weibull_draws
if nargin>0 && init
p6 = evalin('base', 'bayestopt_.p6');
@@ -97,6 +96,12 @@ if nargin>0 && init
else
inverse_gamma_2_draws = 1;
end
+ weibull_index = find(prior_shape==8);
+ if isempty(weibull_index)
+ weibull_draws = 0;
+ else
+ weibull_draws = 1;
+ end
pdraw = NaN(number_of_estimated_parameters,1);
return
end
@@ -159,6 +164,15 @@ if inverse_gamma_2_draws
end
end
+if weibull_draws
+ pdraw(weibull_index) = weibrnd(p6(weibull_index), p7(weibull_index)) + p3(weibull_index);
+ out_of_bound = find( (pdraw(weibull_index)'>ub(weibull_index)) | (pdraw(weibull_index)'ub(weibull_index)) | (pdraw(weibull_index)'
.
-persistent id1 id2 id3 id4 id5 id6
-persistent tt1 tt2 tt3 tt4 tt5 tt6
+persistent id1 id2 id3 id4 id5 id6 id8
+persistent tt1 tt2 tt3 tt4 tt5 tt6 tt8
info=0;
@@ -74,6 +74,12 @@ if nargin > 6 && initialization == 1
if isempty(id6)
tt6 = 0;
end
+ % Weibull indices.
+ tt8 = 1;
+ id8 = find(pshape==8);
+ if isempty(id8)
+ tt8 = 0;
+ end
pflag = 1;
end
@@ -167,6 +173,21 @@ if tt6
end
end
+if tt8
+ logged_prior_density = logged_prior_density + sum(lpdfgweibull(x(id8),p6(id8),p7(id8)));
+ if isinf(logged_prior_density)
+ if nargout ==4
+ info=id8(isinf(log(lpdfgweibull(x(id8),p6(id8),p7(id8)))));
+ end
+ return
+ end
+ if nargout==2
+ [tmp, dlprior(id8)] = lpdfgweibull(x(id8),p6(id8),p7(id8))
+ elseif nargout==3
+ [tmp, dlprior(id8), ds2lprior(id8)] = lpdfgweibull(x(id8),p6(id8),p7(id8))
+ end
+end
+
if nargout==3,
d2lprior = diag(d2lprior);
end
\ No newline at end of file
diff --git a/matlab/set_prior.m b/matlab/set_prior.m
index f94b25962..901e6b5c4 100644
--- a/matlab/set_prior.m
+++ b/matlab/set_prior.m
@@ -260,6 +260,20 @@ for i=1:length(k)
bayestopt_.p5(k(i)) = compute_prior_mode([ bayestopt_.p6(k(i)) , bayestopt_.p7(k(i)) , bayestopt_.p3(k(i)) ], 6) ;
end
+% Weibull distribution
+k = find(bayestopt_.pshape == 8);
+k1 = find(isnan(bayestopt_.p3(k)));
+k2 = find(isnan(bayestopt_.p4(k)));
+bayestopt_.p3(k(k1)) = zeros(length(k1),1);
+bayestopt_.p4(k(k2)) = Inf(length(k2),1);
+for i=1:length(k)
+ if (bayestopt_.p1(k(i))bayestopt_.p4(k(i)))
+ error(['The prior mean of ' bayestopt_.name{k(i)} ' has to be above the lower (' num2str(bayestopt_.p3(k(i))) ') bound of the Weibull prior density!']);
+ end
+ [bayestopt_.p6(k(i)),bayestopt_.p7(k(i))] = weibull_specification(bayestopt_.p1(k(i))-bayestopt_.p3(k(i)), bayestopt_.p2(k(i)));
+ bayestopt_.p5(k(i)) = compute_prior_mode([ bayestopt_.p6(k(i)) , bayestopt_.p7(k(i)) , bayestopt_.p3(k(i)) ], 8) ;
+end
+
k = find(isnan(xparam1));
if ~isempty(k)
xparam1(k) = bayestopt_.p1(k);
@@ -273,6 +287,8 @@ if options_.initialize_estimated_parameters_with_the_prior_mode
end
end
+
+
% I create subfolder M_.dname/prior if needed.
CheckPath('prior',M_.dname);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 1e71110ac..00f587964 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,5 +1,6 @@
MODFILES = \
estimation/fs2000.mod \
+ estimation/fs2000_with_weibull_prior.mod \
estimation/fs2000_MCMC_jumping_covariance.mod \
estimation/fs2000_initialize_from_calib.mod \
estimation/fs2000_calibrated_covariance.mod \
diff --git a/tests/estimation/fs2000_with_weibull_prior.mod b/tests/estimation/fs2000_with_weibull_prior.mod
new file mode 100644
index 000000000..54117b221
--- /dev/null
+++ b/tests/estimation/fs2000_with_weibull_prior.mod
@@ -0,0 +1,84 @@
+// See fs2000.mod in the examples/ directory for details on the model
+
+var m P c e W R k d n l gy_obs gp_obs y dA;
+varexo e_a e_m;
+
+parameters alp bet gam mst rho psi del;
+
+alp = 0.33;
+bet = 0.99;
+gam = 0.003;
+mst = 1.011;
+rho = 0.7;
+psi = 0.787;
+del = 0.02;
+
+model;
+dA = exp(gam+e_a);
+log(m) = (1-rho)*log(mst) + rho*log(m(-1))+e_m;
+-P/(c(+1)*P(+1)*m)+bet*P(+1)*(alp*exp(-alp*(gam+log(e(+1))))*k^(alp-1)*n(+1)^(1-alp)+(1-del)*exp(-(gam+log(e(+1)))))/(c(+2)*P(+2)*m(+1))=0;
+W = l/n;
+-(psi/(1-psi))*(c*P/(1-n))+l/n = 0;
+R = P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(-alp)/W;
+1/(c*P)-bet*P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)/(m*l*c(+1)*P(+1)) = 0;
+c+k = exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)+(1-del)*exp(-(gam+e_a))*k(-1);
+P*c = m;
+m-1+d = l;
+e = exp(e_a);
+y = k(-1)^alp*n^(1-alp)*exp(-alp*(gam+e_a));
+gy_obs = dA*y/y(-1);
+gp_obs = (P/P(-1))*m(-1)/dA;
+end;
+
+steady_state_model;
+ dA = exp(gam);
+ gst = 1/dA;
+ m = mst;
+ khst = ( (1-gst*bet*(1-del)) / (alp*gst^alp*bet) )^(1/(alp-1));
+ xist = ( ((khst*gst)^alp - (1-gst*(1-del))*khst)/mst )^(-1);
+ nust = psi*mst^2/( (1-alp)*(1-psi)*bet*gst^alp*khst^alp );
+ n = xist/(nust+xist);
+ P = xist + nust;
+ k = khst*n;
+
+ l = psi*mst*n/( (1-psi)*(1-n) );
+ c = mst/P;
+ d = l - mst + 1;
+ y = k^alp*n^(1-alp)*gst^alp;
+ R = mst/bet;
+ W = l/n;
+ ist = y-c;
+ q = 1 - d;
+
+ e = 1;
+
+ gp_obs = m/dA;
+ gy_obs = dA;
+end;
+
+shocks;
+var e_a; stderr 0.014;
+var e_m; stderr 0.005;
+end;
+
+steady;
+
+check;
+
+estimated_params;
+alp, beta_pdf, 0.356, 0.02;
+bet, beta_pdf, 0.993, 0.002;
+gam, normal_pdf, 0.0085, 0.003;
+mst, normal_pdf, 1.0002, 0.007;
+rho, beta_pdf, 0.129, 0.223;
+psi, beta_pdf, 0.65, 0.05;
+del, beta_pdf, 0.01, 0.005;
+stderr e_a, weibull_pdf, 0.035449, 25;
+stderr e_m, inv_gamma_pdf, 0.008862, Inf;
+end;
+
+varobs gp_obs gy_obs;
+
+options_.solve_tolf = 1e-12;
+
+estimation(order=1,datafile=fsdat_simul,nobs=192,loglinear,mh_replic=2000,mh_nblocks=2,mh_jscale=0.8,moments_varendo,consider_only_observed);