function P = draws(o, n) % Return n independent random draws from the prior distribution. % % INPUTS % - o [dprior] % % OUTPUTS % - P [double] m×n matrix, random draw from the prior distribution. % % REMARKS % If the Parallel Computing Toolbox is available, the main loop is run in parallel. % % EXAMPLE % % >> Prior = dprior(bayestopt_, options_.prior_trunc); % >> Prior.draws(1e6) % Copyright © 2023 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 . P = NaN(rows(o.lb), 1); parfor i=1:n P(:,i) = draw(o); end return % --*-- Unit tests --*-- %@test:1 % Fill global structures with required fields... prior_trunc = 1e-10; p0 = repmat([1; 2; 3; 4; 5; 6; 8], 2, 1); % Prior shape p1 = .4*ones(14,1); % Prior mean p2 = .2*ones(14,1); % Prior std. p3 = NaN(14,1); p4 = NaN(14,1); p5 = NaN(14,1); p6 = NaN(14,1); p7 = NaN(14,1); for i=1:14 switch p0(i) case 1 % Beta distribution p3(i) = 0; p4(i) = 1; [p6(i), p7(i)] = beta_specification(p1(i), p2(i)^2, p3(i), p4(i)); p5(i) = compute_prior_mode([p6(i) p7(i)], 1); case 2 % Gamma distribution p3(i) = 0; p4(i) = Inf; [p6(i), p7(i)] = gamma_specification(p1(i), p2(i)^2, p3(i), p4(i)); p5(i) = compute_prior_mode([p6(i) p7(i)], 2); case 3 % Normal distribution p3(i) = -Inf; p4(i) = Inf; p6(i) = p1(i); p7(i) = p2(i); p5(i) = p1(i); case 4 % Inverse Gamma (type I) distribution p3(i) = 0; p4(i) = Inf; [p6(i), p7(i)] = inverse_gamma_specification(p1(i), p2(i)^2, p3(i), 1, false); p5(i) = compute_prior_mode([p6(i) p7(i)], 4); case 5 % Uniform distribution [p1(i), p2(i), p6(i), p7(i)] = uniform_specification(p1(i), p2(i), p3(i), p4(i)); p3(i) = p6(i); p4(i) = p7(i); p5(i) = compute_prior_mode([p6(i) p7(i)], 5); case 6 % Inverse Gamma (type II) distribution p3(i) = 0; p4(i) = Inf; [p6(i), p7(i)] = inverse_gamma_specification(p1(i), p2(i)^2, p3(i), 2, false); p5(i) = compute_prior_mode([p6(i) p7(i)], 6); case 8 % Weibull distribution p3(i) = 0; p4(i) = Inf; [p6(i), p7(i)] = weibull_specification(p1(i), p2(i)^2, p3(i)); p5(i) = compute_prior_mode([p6(i) p7(i)], 8); otherwise error('This density is not implemented!') end end BayesInfo.pshape = p0; BayesInfo.p1 = p1; BayesInfo.p2 = p2; BayesInfo.p3 = p3; BayesInfo.p4 = p4; BayesInfo.p5 = p5; BayesInfo.p6 = p6; BayesInfo.p7 = p7; ndraws = 1e5; % Call the tested routine try % Instantiate dprior object. o = dprior(BayesInfo, prior_trunc, false); X = o.draws(ndraws); m = mean(X, 2); v = var(X, 0, 2); t(1) = true; catch t(1) = false; end if t(1) t(2) = all(abs(m-BayesInfo.p1)<3e-3); t(3) = all(all(abs(v-BayesInfo.p2.^2)<5e-3)); end T = all(t); %@eof:1