From 590fe9694696cefbd3628034347a6841d52b935b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Wed, 19 Jun 2019 18:28:01 +0200 Subject: [PATCH] Added routine for simulating static models. (cherry picked from commit b3af8c4a4804369503e7277bc52be6409ae6fc31) --- matlab/backward/simul_backward_linear_model.m | 10 +- matlab/backward/simul_backward_model.m | 6 + .../backward/simul_backward_nonlinear_model.m | 10 +- matlab/simul_static_model.m | 105 ++++++++++++++++++ 4 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 matlab/simul_static_model.m diff --git a/matlab/backward/simul_backward_linear_model.m b/matlab/backward/simul_backward_linear_model.m index 0a454a697..da055a2bb 100644 --- a/matlab/backward/simul_backward_linear_model.m +++ b/matlab/backward/simul_backward_linear_model.m @@ -38,7 +38,15 @@ function simulations = simul_backward_linear_model(varargin) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -[initialconditions, samplesize, innovations, DynareOptions, DynareModel, DynareOutput, endonames, exonames, nx, ny1, iy1, jdx, model_dynamic, y] = ... +if M_.maximum_lead + error('Model defined in %s.mod is not backward.', M_.fname) +end + +if M_.maximum_lag + error('Model defined in %s.mod is not backward.', M_.fname) +end + +[initialconditions, samplesize, innovations, DynareOptions, DynareModel, DynareOutput, endonames, exonames, nx, ny1, iy1, jdx, model_dynamic] = ... simul_backward_model_init(varargin{:}); [ysim, xsim] = simul_backward_linear_model_(initialconditions, samplesize, DynareOptions, DynareModel, DynareOutput, innovations, nx, ny1, iy1, jdx, model_dynamic); diff --git a/matlab/backward/simul_backward_model.m b/matlab/backward/simul_backward_model.m index ab1aedcf7..7345cf289 100644 --- a/matlab/backward/simul_backward_model.m +++ b/matlab/backward/simul_backward_model.m @@ -41,6 +41,12 @@ if M_.maximum_lead error('Model defined in %s.mod is not backward or static.', M_.fname) end +if ~M_.maximum_lag + dprintf('Model defined in %s.mod is static. Use simul_static_model instead.', M_.fname) + simul_static_model(samplesize, innovations); + return +end + if nargin<3 Innovations = []; else diff --git a/matlab/backward/simul_backward_nonlinear_model.m b/matlab/backward/simul_backward_nonlinear_model.m index 75966638e..048d85e4d 100644 --- a/matlab/backward/simul_backward_nonlinear_model.m +++ b/matlab/backward/simul_backward_nonlinear_model.m @@ -38,7 +38,15 @@ function simulations = simul_backward_nonlinear_model(varargin) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -[initialconditions, samplesize, innovations, DynareOptions, DynareModel, DynareOutput, endonames, exonames, nx, ny1, iy1, jdx, model_dynamic, y] = ... +if M_.maximum_lead + error('Model defined in %s.mod is not backward.', M_.fname) +end + +if M_.maximum_lag + error('Model defined in %s.mod is not backward.', M_.fname) +end + +[initialconditions, samplesize, innovations, DynareOptions, DynareModel, DynareOutput, endonames, exonames, ~, ~, iy1, ~, model_dynamic] = ... simul_backward_model_init(varargin{:}); [ysim, xsim] = simul_backward_nonlinear_model_(initialconditions, samplesize, DynareOptions, DynareModel, DynareOutput, innovations, iy1, model_dynamic); diff --git a/matlab/simul_static_model.m b/matlab/simul_static_model.m new file mode 100644 index 000000000..05667766d --- /dev/null +++ b/matlab/simul_static_model.m @@ -0,0 +1,105 @@ +function simulation = simul_static_model(samplesize, innovations) + +% Simulates a stochastic static model (with arbitrary precision). +% +% INPUTS +% - samplesize [integer] scalar, number of periods for the simulation. +% - innovations [dseries] innovations to be used for the simulation. +% +% OUTPUTS +% - simulation [dseries] Simulated endogenous and exogenous variables. +% +% REMARKS +% [1] The innovations used for the simulation are saved in DynareOutput.exo_simul, and the resulting paths for the endogenous +% variables are saved in DynareOutput.endo_simul. +% [2] The last input argument is not mandatory. If absent we use random draws and rescale them with the informations provided +% through the shocks block. + +% Copyright (C) 2019 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 . + +global M_ options_ oo_ + +if M_.maximum_lag + error('%s.mod has lagged variables, but it should be a static model.', M_.fname) +end + +if M_.maximum_lead + error('%s.mod has leaded variables, but it should be a static model.', M_.fname) +end + +% Set innovations. +if nargin<2 || isempty(innovations) + % Set the covariance matrix of the structural innovations. + variances = diag(M_.Sigma_e); + number_of_shocks = length(M_.Sigma_e); + positive_var_indx = find(variances>0); + effective_number_of_shocks = length(positive_var_indx); + covariance_matrix = M_.Sigma_e(positive_var_indx,positive_var_indx); + covariance_matrix_upper_cholesky = chol(covariance_matrix); + % Set seed to its default state. + if options_.bnlms.set_dynare_seed_to_default + set_dynare_seed('default'); + end + % Simulate structural innovations. + switch options_.bnlms.innovation_distribution + case 'gaussian' + oo_.bnlms.shocks = randn(samplesize, effective_number_of_shocks)*covariance_matrix_upper_cholesky; + otherwise + error('%s distribution for the structural innovations is not (yet) implemented!', options_.bnlms.innovation_distribution) + end + % Put the simulated innovations in DynareOutput.exo_simul. + oo_.exo_simul = zeros(samplesize, number_of_shocks); + oo_.exo_simul(:,positive_var_indx) = oo_.bnlms.shocks; + innovations = []; +else + if innovations.nobs