163 lines
5.4 KiB
Matlab
163 lines
5.4 KiB
Matlab
|
% Copyright (C) 2001 Michel Juillard
|
||
|
%
|
||
|
function stoch_simul(var_list)
|
||
|
global M_ options_ oo_
|
||
|
|
||
|
options_ = set_default_option(options_,'order',2);
|
||
|
options_ = set_default_option(options_,'linear',0);
|
||
|
if options_.linear
|
||
|
options_.order = 1;
|
||
|
end
|
||
|
options_ = set_default_option(options_,'ar',5);
|
||
|
options_ = set_default_option(options_,'irf',40);
|
||
|
options_ = set_default_option(options_,'dr_algo',0);
|
||
|
options_ = set_default_option(options_,'simul_algo',0);
|
||
|
options_ = set_default_option(options_,'drop',100);
|
||
|
if options_.order == 1
|
||
|
options_.replic = 1;
|
||
|
else
|
||
|
options_ = set_default_option(options_,'replic',50);
|
||
|
end
|
||
|
options_ = set_default_option(options_,'nomoments',0);
|
||
|
options_ = set_default_option(options_,'nocorr',0);
|
||
|
options_ = set_default_option(options_,'simul_seed',[]);
|
||
|
options_ = set_default_option(options_,'hp_filter',0);
|
||
|
options_ = set_default_option(options_,'hp_ngrid',512);
|
||
|
options_ = set_default_option(options_,'simul',0);
|
||
|
options_ = set_default_option(options_,'periods',0);
|
||
|
if options_.simul & ~isempty(options_.periods) & options_.periods == 0
|
||
|
options_.periods = options_.periods;
|
||
|
end
|
||
|
options_.periods = max(options_.periods,1);
|
||
|
|
||
|
if M_.exo_nbr > 0
|
||
|
oo_.exo_simul= repmat(oo_.exo_steady_state',options_.periods + M_.maximum_lag + M_.maximum_lead,1) ;
|
||
|
end
|
||
|
|
||
|
oo_.dr=resol(oo_.steady_state,options_.dr_algo,options_.linear,options_.order);
|
||
|
|
||
|
disp(' ')
|
||
|
disp('MODEL SUMMARY')
|
||
|
disp(' ')
|
||
|
disp([' Number of variables: ' int2str(M_.endo_nbr)])
|
||
|
disp([' Number of stochastic shocks: ' int2str(M_.exo_nbr)])
|
||
|
disp([' Number of state variables: ' ...
|
||
|
int2str(length(find(oo_.dr.kstate(:,2) <= M_.maximum_lag+1)))])
|
||
|
disp([' Number of jumpers: ' ...
|
||
|
int2str(length(find(oo_.dr.kstate(:,2) == M_.maximum_lag+2)))])
|
||
|
disp([' Number of static variables: ' int2str(oo_.dr.nstatic)])
|
||
|
my_title='MATRIX OF COVARIANCE OF EXOGENOUS SHOCKS';
|
||
|
labels = deblank(M_.exo_names);
|
||
|
headers = strvcat('Variables',labels);
|
||
|
lh = size(labels,2)+2;
|
||
|
table(my_title,headers,labels,M_.Sigma_e,lh,10,6);
|
||
|
disp(' ')
|
||
|
disp_dr(oo_.dr,options_.order,var_list);
|
||
|
|
||
|
if options_.simul == 0 & options_.nomoments == 0
|
||
|
disp_th_moments(oo_.dr,var_list);
|
||
|
elseif options_.simul == 1
|
||
|
if options_.periods == 0
|
||
|
error('STOCH_SIMUL error: number of periods for the simulation isn''t specified')
|
||
|
end
|
||
|
if options_.periods < options_.drop
|
||
|
disp(['STOCH_SIMUL error: The horizon of simulation is shorter' ...
|
||
|
' than the number of observations to be DROPed'])
|
||
|
return
|
||
|
end
|
||
|
|
||
|
oo_.y_simul = simult(repmat(oo_.dr.ys,1,M_.maximum_lag),oo_.dr);
|
||
|
dyn2vec;
|
||
|
if options_.nomoments == 0
|
||
|
disp_moments(oo_.y_simul,var_list);
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
n = size(var_list,1);
|
||
|
if n == 0
|
||
|
n = M_.endo_nbr;
|
||
|
ivar = [1:n]';
|
||
|
var_list = M_.endo_names;
|
||
|
else
|
||
|
ivar=zeros(n,1);
|
||
|
for i=1:n
|
||
|
i_tmp = strmatch(var_list(i,:),M_.endo_names,'exact');
|
||
|
if isempty(i_tmp)
|
||
|
error (['One of the specified variables does not exist']) ;
|
||
|
else
|
||
|
ivar(i) = i_tmp;
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if n < 13 & options_.irf > 0
|
||
|
if n == 1
|
||
|
nr = 1;
|
||
|
nc = 1;
|
||
|
elseif n == 2
|
||
|
nr = 1;
|
||
|
nc = 2;
|
||
|
elseif n <= 4
|
||
|
nr = 2;
|
||
|
nc = 2;
|
||
|
elseif n <= 6
|
||
|
nr = 2;
|
||
|
nc = 3;
|
||
|
elseif n <= 9
|
||
|
nr = 3;
|
||
|
nc = 3;
|
||
|
elseif n <= 12
|
||
|
nr = 3;
|
||
|
nc = 4;
|
||
|
end
|
||
|
olditer = options_.periods;
|
||
|
SS(M_.exo_names_orig_ord,M_.exo_names_orig_ord)=M_.Sigma_e+1e-14*eye(M_.exo_nbr);
|
||
|
cs = chol(SS)';
|
||
|
tit(M_.exo_names_orig_ord,:) = M_.exo_names;
|
||
|
for i = 1:M_.exo_nbr
|
||
|
if SS(i,i) > 1e-13
|
||
|
figure('Name',['Orthogonalized shock to ' tit(i,:)]);
|
||
|
y=irf(oo_.dr,cs(M_.exo_names_orig_ord,i), options_.irf, options_.drop, ...
|
||
|
options_.replic, options_.order);
|
||
|
m = 1;
|
||
|
for j = 1:n
|
||
|
if max(y(ivar(j),:)) - min(y(ivar(j),:)) > 1e-10
|
||
|
subplot(nr,nc,m);
|
||
|
plot([y(ivar(j),:)']);
|
||
|
title(var_list(j,:),'Interpreter','none');
|
||
|
assignin('base',[deblank(var_list(j,:)) '_' deblank(tit(i,:))],y(ivar(j),:)');
|
||
|
m = m+1;
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
options_.periods = olditer;
|
||
|
end
|
||
|
|
||
|
% 01/10/01 FC oo_.dr and oo_.y_simul made global
|
||
|
% 02/20/01 MJ oo_.steady_state removed from calling sequence for simult (all in oo_.dr)
|
||
|
% 02/23/01 MJ added dyn2vec()
|
||
|
% 06/24/01 MJ steady -> steady_
|
||
|
% 09/24/01 MJ oo_.dr made global
|
||
|
% 08/28/02 MJ added var_list
|
||
|
% 10/09/02 MJ no simulation and theoretical moments for order 1
|
||
|
% 10/14/02 MJ added plot of IRFs
|
||
|
% 10/30/02 MJ options_ are now a structure
|
||
|
% 01/01/03 MJ added dr_algo
|
||
|
% 01/09/03 MJ set default values for options_ (correct absence of autocorr
|
||
|
% when order == 1)
|
||
|
% 01/12/03 MJ removed call to steady_ as already checked in resol()
|
||
|
% 01/31/03 MJ make IRF global with varname_shockname
|
||
|
% 02/09/03 MJ oo_.steady_state reset with value declared in initval after computations
|
||
|
% 02/18/03 MJ removed above change. oo_.steady_state shouldn't be affected by
|
||
|
% computations in this function
|
||
|
% new option SIMUL computes a stochastic simulation and save
|
||
|
% results in oo_.y_simul and via dyn2vec
|
||
|
% 04/03/03 MJ corrected bug for simulation with M_.maximum_lag > 1
|
||
|
% 05/20/03 MJ eliminates exogenous shocks with 0 variance
|
||
|
% 05/20/03 MJ don't plot IRF if variation < 1e-10
|
||
|
% 11/14/03 MJ corrected bug on number of replications for IRF when
|
||
|
% order=2
|
||
|
% 11/22/03 MJ replaced IRFs by orthogonalized IRFs
|