function time_series = extended_path(initial_conditions,sample_size) % Stochastic simulation of a non linear DSGE model using the Extended Path method (Fair and Taylor 1983). A time % series of size T is obtained by solving T perfect foresight models. % % INPUTS % o initial_conditions [double] m*nlags array, where m is the number of endogenous variables in the model and % nlags is the maximum number of lags. % o sample_size [integer] scalar, size of the sample to be simulated. % % OUTPUTS % o time_series [double] m*sample_size array, the simulations. % % ALGORITHM % % SPECIAL REQUIREMENTS % Copyright (C) 2009, 2010, 2011 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_ options_.verbosity = options_.ep.verbosity; verbosity = options_.ep.verbosity+options_.ep.debug; % Prepare a structure needed by the matlab implementation of the perfect foresight model solver pfm.lead_lag_incidence = M_.lead_lag_incidence; pfm.ny = M_.endo_nbr; pfm.max_lag = M_.maximum_endo_lag; pfm.nyp = nnz(pfm.lead_lag_incidence(1,:)); pfm.iyp = find(pfm.lead_lag_incidence(1,:)>0); pfm.ny0 = nnz(pfm.lead_lag_incidence(2,:)); pfm.iy0 = find(pfm.lead_lag_incidence(2,:)>0); pfm.nyf = nnz(pfm.lead_lag_incidence(3,:)); pfm.iyf = find(pfm.lead_lag_incidence(3,:)>0); pfm.nd = pfm.nyp+pfm.ny0+pfm.nyf; pfm.nrc = pfm.nyf+1; pfm.isp = [1:pfm.nyp]; pfm.is = [pfm.nyp+1:pfm.ny+pfm.nyp]; pfm.isf = pfm.iyf+pfm.nyp; pfm.isf1 = [pfm.nyp+pfm.ny+1:pfm.nyf+pfm.nyp+pfm.ny+1]; pfm.iz = [1:pfm.ny+pfm.nyp+pfm.nyf]; pfm.periods = options_.ep.periods; pfm.steady_state = oo_.steady_state; pfm.params = M_.params; pfm.i_cols_1 = nonzeros(pfm.lead_lag_incidence(2:3,:)'); pfm.i_cols_A1 = find(pfm.lead_lag_incidence(2:3,:)'); pfm.i_cols_T = nonzeros(pfm.lead_lag_incidence(1:2,:)'); pfm.i_cols_j = 1:pfm.nd; pfm.i_upd = pfm.ny+(1:pfm.periods*pfm.ny); pfm.dynamic_model = str2func([M_.fname,'_dynamic']); pfm.verbose = options_.ep.verbosity; pfm.maxit_ = options_.maxit_; pfm.tolerance = options_.dynatol.f; % Set default initial conditions. if isempty(initial_conditions) initial_conditions = oo_.steady_state; end % Set maximum number of iterations for the deterministic solver. options_.maxit_ = options_.ep.maxit; % Set the number of periods for the perfect foresight model options_.periods = options_.ep.periods; pfm.periods = options_.ep.periods; pfm.i_upd = pfm.ny+(1:pfm.periods*pfm.ny); % Set the algorithm for the perfect foresight solver options_.stack_solve_algo = options_.ep.stack_solve_algo; % Set check_stability flag do_not_check_stability_flag = ~options_.ep.check_stability; % Compute the first order reduced form if needed. % % REMARK. It is assumed that the user did run the same mod file with stoch_simul(order=1) and save % all the globals in a mat file called linear_reduced_form.mat; if options_.ep.init options_.order = 1; [dr,Info,M_,options_,oo_] = resol(1,M_,options_,oo_); end % Do not use a minimal number of perdiods for the perfect foresight solver (with bytecode and blocks) options_.minimal_solving_period = 100;%options_.ep.periods; % Initialize the exogenous variables. make_ex_; % Initialize the endogenous variables. make_y_; % Initialize the output array. time_series = zeros(M_.endo_nbr,sample_size); % Set the covariance matrix of the structural innovations. variances = diag(M_.Sigma_e); positive_var_indx = find(variances>0); effective_number_of_shocks = length(positive_var_indx); stdd = sqrt(variances(positive_var_indx)); covariance_matrix = M_.Sigma_e(positive_var_indx,positive_var_indx); covariance_matrix_upper_cholesky = chol(covariance_matrix); % Set seed. if options_.ep.set_dynare_seed_to_default set_dynare_seed('default'); end % Simulate shocks. switch options_.ep.innovation_distribution case 'gaussian' oo_.ep.shocks = randn(sample_size,effective_number_of_shocks)*covariance_matrix_upper_cholesky; otherwise error(['extended_path:: ' options_.ep.innovation_distribution ' distribution for the structural innovations is not (yet) implemented!']) end % Set future shocks (Stochastic Extended Path approach) if options_.ep.stochastic.status switch options_.ep.stochastic.method case 'tensor' switch options_.ep.stochastic.ortpol case 'hermite' [r,w] = gauss_hermite_weights_and_nodes(options_.ep.stochastic.nodes); otherwise error('extended_path:: Unknown orthogonal polynomial option!') end if options_.ep.stochastic.order*M_.exo_nbr>1 for i=1:options_.ep.stochastic.order*M_.exo_nbr rr(i) = {r}; ww(i) = {w}; end rrr = cartesian_product_of_sets(rr{:}); www = cartesian_product_of_sets(ww{:}); else rrr = r; www = w; end www = prod(www,2); number_of_nodes = length(www); relative_weights = www/max(www); switch options_.ep.stochastic.pruned.status case 1 jdx = find(relative_weights>options_.ep.stochastic.pruned.relative); www = www(jdx); www = www/sum(www); rrr = rrr(jdx,:); case 2 jdx = find(weights>options_.ep.stochastic.pruned.level); www = www(jdx); www = www/sum(www); rrr = rrr(jdx,:); otherwise % Nothing to be done! end nnn = length(www); otherwise error('extended_path:: Unknown stochastic_method option!') end else rrr = zeros(1,effective_number_of_shocks); www = 1; nnn = 1; end % Initializes some variables. t = 0; % Set waitbar (graphic or text mode) hh = dyn_waitbar(0,'Please wait. Extended Path simulations...'); set(hh,'Name','EP simulations.'); if options_.ep.memory mArray1 = zeros(M_.endo_nbr,100,nnn,sample_size); mArray2 = zeros(M_.exo_nbr,100,nnn,sample_size); end % Main loop. while (t