Merge branch 'exo_names_orig_ord' of git.dynare.org:JohannesPfeifer/dynare
Ref. !2142remove-submodule
commit
a044ec45b1
|
@ -25,4 +25,4 @@
|
|||
url = https://github.com/fangq/jsonlab.git
|
||||
[submodule "preprocessor"]
|
||||
path = preprocessor
|
||||
url = ../../Dynare/preprocessor.git
|
||||
url = ../../JohannesPfeifer/preprocessor.git
|
||||
|
|
|
@ -288,7 +288,7 @@ if options_.TeX
|
|||
end
|
||||
|
||||
fprintf('Estimation::mcmc: Posterior (dsge) IRFs...\n');
|
||||
tit(M_.exo_names_orig_ord) = M_.exo_names;
|
||||
tit = M_.exo_names;
|
||||
kdx = 0;
|
||||
|
||||
for file = 1:NumberOfIRFfiles_dsge
|
||||
|
@ -328,7 +328,7 @@ if MAX_nirfs_dsgevar
|
|||
DistribIRFdsgevar = zeros(options_.irf,9,nvar,M_.exo_nbr);
|
||||
HPDIRFdsgevar = zeros(options_.irf,2,nvar,M_.exo_nbr);
|
||||
fprintf('Estimation::mcmc: Posterior (bvar-dsge) IRFs...\n');
|
||||
tit(M_.exo_names_orig_ord) = M_.exo_names;
|
||||
tit = M_.exo_names;
|
||||
kdx = 0;
|
||||
for file = 1:NumberOfIRFfiles_dsgevar
|
||||
load([MhDirectoryName filesep M_.fname '_IRF_BVARDSGEs' int2str(file) '.mat']);
|
||||
|
@ -391,14 +391,13 @@ if ~options_.nograph && ~options_.no_graph.posterior
|
|||
|
||||
% The files .TeX are genereted in sequential way always!
|
||||
|
||||
subplotnum = 0;
|
||||
titTeX(M_.exo_names_orig_ord) = M_.exo_names_tex;
|
||||
if options_.TeX && any(strcmp('eps',cellstr(options_.graph_format)))
|
||||
subplotnum = 0;
|
||||
fidTeX = fopen([DirectoryName filesep M_.fname '_BayesianIRF.tex'],'w');
|
||||
fprintf(fidTeX,'%% TeX eps-loader file generated by PosteriorIRF.m (Dynare).\n');
|
||||
fprintf(fidTeX,['%% ' datestr(now,0) '\n']);
|
||||
fprintf(fidTeX,' \n');
|
||||
titTeX(M_.exo_names_orig_ord) = M_.exo_names_tex;
|
||||
titTeX = M_.exo_names_tex;
|
||||
|
||||
for ii=irf_shocks_indx
|
||||
figunumber = 0;
|
||||
|
|
|
@ -177,15 +177,14 @@ while fpar<B
|
|||
error(['PosteriorIRF :: Dynare is unable to solve the model (' errordef ') with sample ' type])
|
||||
end
|
||||
end
|
||||
SS(M_.exo_names_orig_ord,M_.exo_names_orig_ord) = M_.Sigma_e+1e-14*eye(M_.exo_nbr);
|
||||
SS = transpose(chol(SS));
|
||||
SS = get_lower_cholesky_covariance(M_.Sigma_e,options_.add_tiny_number_to_cholesky);
|
||||
irf_shocks_indx = getIrfShocksIndx(M_, options_);
|
||||
for i=irf_shocks_indx
|
||||
if SS(i,i) > 1e-13
|
||||
if SS(i,i) > 5e-7
|
||||
if options_.order>1 && options_.relative_irf % normalize shock to 0.01 before IRF generation for GIRFs; multiply with 100 later
|
||||
y=irf(M_,options_,dr,SS(M_.exo_names_orig_ord,i)./SS(i,i)/100, options_.irf, options_.drop,options_.replic,options_.order);
|
||||
y=irf(M_,options_,dr,SS(:,i)./SS(i,i)/100, options_.irf, options_.drop,options_.replic,options_.order);
|
||||
else
|
||||
y=irf(M_,options_,dr,SS(M_.exo_names_orig_ord,i), options_.irf, options_.drop,options_.replic,options_.order);
|
||||
y=irf(M_,options_,dr,SS(:,i), options_.irf, options_.drop,options_.replic,options_.order);
|
||||
end
|
||||
if options_.relative_irf && options_.order==1 %multiply with 100 for backward compatibility
|
||||
y = 100*y/SS(i,i);
|
||||
|
@ -219,7 +218,7 @@ while fpar<B
|
|||
mu = zeros(1,dataset_.vobs);
|
||||
% Get rotation
|
||||
if dsge_prior_weight > 0
|
||||
Atheta(oo_.dr.order_var,M_.exo_names_orig_ord) = oo_.dr.ghu*sqrt(M_.Sigma_e);
|
||||
Atheta(oo_.dr.order_var,:) = oo_.dr.ghu*sqrt(M_.Sigma_e);
|
||||
A0 = Atheta(bayestopt_.mfys,:);
|
||||
OMEGAstar = qr2(A0');
|
||||
end
|
||||
|
|
|
@ -85,8 +85,7 @@ end
|
|||
|
||||
% Get the covariance matrix of the shocks.
|
||||
if withuncertainty
|
||||
Sigma = M_.Sigma_e + 1e-14*eye(M_.exo_nbr);
|
||||
sigma = transpose(chol(Sigma));
|
||||
sigma = get_lower_cholesky_covariance(M_.Sigma_e,options_.add_tiny_number_to_cholesky);
|
||||
end
|
||||
|
||||
% Compute forecast without shock
|
||||
|
|
|
@ -146,10 +146,8 @@ end
|
|||
if ~deterministicshockflag
|
||||
if nnz(M_.Sigma_e)
|
||||
% Add ϵ>0 on the diagonal, so that the Cholesky won't fail
|
||||
% if a shock has zero variance
|
||||
Sigma = M_.Sigma_e + 1e-14*eye(M_.exo_nbr);
|
||||
% Factorize Sigma (C is such that C*C' == Sigma)
|
||||
C = chol(Sigma, 'lower');
|
||||
% if a shock has zero variance and factorize Sigma (C is such that C*C' == Sigma)
|
||||
C = get_lower_cholesky_covariance(M_.Sigma_e,options_.add_tiny_number_to_cholesky);
|
||||
else
|
||||
error('You did not specify the size of the shocks!')
|
||||
end
|
||||
|
|
|
@ -153,7 +153,6 @@ if options_.order==1
|
|||
end
|
||||
title=add_filter_subtitle(title, options_);
|
||||
headers = M_.exo_names;
|
||||
headers(M_.exo_names_orig_ord) = headers;
|
||||
headers = vertcat(' ', headers);
|
||||
lh = cellofchararraymaxlength(var_list_)+2;
|
||||
dyntable(options_, title, headers, var_list_, 100*temp, lh, 8, 2);
|
||||
|
@ -197,7 +196,6 @@ if options_.order==1
|
|||
end
|
||||
title=add_filter_subtitle(title, options_);
|
||||
headers = M_.exo_names;
|
||||
headers(M_.exo_names_orig_ord) = headers;
|
||||
headers = vertcat(' ', headers, 'ME');
|
||||
lh = cellofchararraymaxlength(var_list_)+2;
|
||||
dyntable(options_, title, headers, observable_name_requested_vars,100*temp,lh,8,2);
|
||||
|
@ -236,7 +234,6 @@ if options_.order==1
|
|||
for step_iter=1:length(Steps)
|
||||
title_print=[title, ' Period ' int2str(Steps(step_iter))];
|
||||
headers = M_.exo_names;
|
||||
headers(M_.exo_names_orig_ord) = headers;
|
||||
headers = vertcat(' ', headers);
|
||||
lh = cellofchararraymaxlength(var_list_)+2;
|
||||
dyntable(options_,title_print,headers, var_list_,100* ...
|
||||
|
@ -280,7 +277,6 @@ if options_.order==1
|
|||
for step_iter=1:length(Steps)
|
||||
title_print = [title, ' Period ' int2str(Steps(step_iter))];
|
||||
headers = M_.exo_names;
|
||||
headers(M_.exo_names_orig_ord) = headers;
|
||||
headers = vertcat(' ', headers, 'ME');
|
||||
lh = cellofchararraymaxlength(var_list_)+2;
|
||||
dyntable(options_, title_print, headers, observable_name_requested_vars, 100*temp(:,:,step_iter), lh, 8, 2);
|
||||
|
|
|
@ -67,6 +67,7 @@ options_.mode_check.number_of_points = 20;
|
|||
options_.mode_check.nolik = false;
|
||||
|
||||
options_.huge_number = 1e7;
|
||||
options_.add_tiny_number_to_cholesky=1e-14;
|
||||
|
||||
% Default number of threads for parallelized mex files.
|
||||
options_.threads.kronecker.sparse_hessian_times_B_kronecker_C = num_procs;
|
||||
|
|
|
@ -196,7 +196,6 @@ if ~options_.nodecomposition
|
|||
title='VARIANCE DECOMPOSITION SIMULATING ONE SHOCK AT A TIME (in percent)';
|
||||
title=add_filter_subtitle(title,options_);
|
||||
headers = M_.exo_names;
|
||||
headers(M_.exo_names_orig_ord) = headers;
|
||||
headers = vertcat(' ', headers);
|
||||
lh = cellofchararraymaxlength(M_.endo_names(ivar))+2;
|
||||
dyntable(options_, title, vertcat(headers, 'Tot. lin. contr.'), ...
|
||||
|
|
|
@ -96,7 +96,6 @@ if size(stationary_vars, 1) > 0
|
|||
end
|
||||
title = add_filter_subtitle(title, options_);
|
||||
headers = M_.exo_names;
|
||||
headers(M_.exo_names_orig_ord) = headers;
|
||||
headers = vertcat(' ', headers);
|
||||
labels=get_labels_transformed_vars(M_.endo_names,ivar(stationary_vars),options_,false);
|
||||
lh = cellofchararraymaxlength(labels)+2;
|
||||
|
|
|
@ -33,7 +33,6 @@ function display_conditional_variance_decomposition(conditional_decomposition_ar
|
|||
if size(conditional_decomposition_array,3)==M_.exo_nbr %no ME input
|
||||
shock_number=M_.exo_nbr;
|
||||
headers = M_.exo_names;
|
||||
headers(M_.exo_names_orig_ord) = headers;
|
||||
if options_.TeX
|
||||
headers_TeX = vertcat(' ', M_.exo_names_tex);
|
||||
end
|
||||
|
@ -41,7 +40,6 @@ if size(conditional_decomposition_array,3)==M_.exo_nbr %no ME input
|
|||
elseif size(conditional_decomposition_array,3)==M_.exo_nbr+1 %ME input
|
||||
shock_number=M_.exo_nbr+1;
|
||||
headers = M_.exo_names;
|
||||
headers(M_.exo_names_orig_ord) = headers;
|
||||
headers = vertcat(headers, 'ME');
|
||||
if options_.TeX
|
||||
headers_TeX = vertcat(M_.exo_names_tex, 'ME');
|
||||
|
|
|
@ -534,7 +534,7 @@ if options_gsa.glue
|
|||
Out1(jsmoo).ini = 'yes';
|
||||
end
|
||||
end
|
||||
tit(M_.exo_names_orig_ord) = M_.exo_names;
|
||||
tit = M_.exo_names;
|
||||
for j=1:M_.exo_nbr
|
||||
Exo(j).name = tit{j};
|
||||
end
|
||||
|
|
|
@ -27,7 +27,7 @@ function irf_shocks_indx=getIrfShocksIndx(M_, options_)
|
|||
% along with Dynare. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
if (isfield(options_,'irf_shocks')==0)
|
||||
irf_shocks_indx = M_.exo_names_orig_ord;
|
||||
irf_shocks_indx = 1:M_.exo_nbr;
|
||||
else
|
||||
irf_shocks_indx = zeros(1,size(options_.irf_shocks,1));
|
||||
for i=1:size(options_.irf_shocks,1)
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
function chol_sigma=get_lower_cholesky_covariance(Sigma_e,add_tiny_number_to_cholesky)
|
||||
% function chol_sigma=get_lower_cholesky_covariance(Sigma_e)
|
||||
% Computes the lower triangular Cholesky decomposition of a covariance matrix,
|
||||
% working around zero entries on the diagonal and perfect correlation
|
||||
%
|
||||
% INPUTS
|
||||
% Sigma_e [double] covariance matrix
|
||||
%
|
||||
% OUTPUTS
|
||||
% chol_sigma [cell] Cholesky factor
|
||||
%
|
||||
% ALGORITHM
|
||||
% Add small value to diagonal to break perfect correlation
|
||||
%
|
||||
% SPECIAL REQUIREMENTS.
|
||||
% None.
|
||||
%
|
||||
% 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
if nargin<2
|
||||
add_tiny_number_to_cholesky=1e-14;
|
||||
end
|
||||
std_deviation=sqrt(diag(Sigma_e));
|
||||
non_zero_indices=find(std_deviation~=0); %find non-zero shocks;
|
||||
try
|
||||
chol_sigma=zeros(size(Sigma_e));
|
||||
chol_sigma(non_zero_indices,non_zero_indices)=chol(Sigma_e(non_zero_indices,non_zero_indices),'lower');
|
||||
catch
|
||||
% cases with perfect correlation
|
||||
fprintf('Non-positive definite covariance matrix encountered. Using add_tiny_number_to_cholesky one the diagonal.\n')
|
||||
chol_sigma=zeros(size(Sigma_e));
|
||||
chol_sigma(non_zero_indices,non_zero_indices)=chol(Sigma_e(non_zero_indices,non_zero_indices)+add_tiny_number_to_cholesky*eye(length(non_zero_indices)),'lower');
|
||||
% correlation=diag(std_deviation(non_zero_indices))\Sigma_e(non_zero_indices,non_zero_indices)/diag(std_deviation(non_zero_indices));
|
||||
end
|
||||
|
||||
return % --*-- Unit tests --*--
|
||||
|
||||
%@test:1
|
||||
|
||||
Sigma_e=diag(4*ones(3,1));
|
||||
Sigma_e(2,2)=0;
|
||||
chol_1=get_lower_cholesky_covariance(Sigma_e);
|
||||
if max(max(abs(chol_1-diag([2,0,2]))))>eps
|
||||
t(1)=false;
|
||||
else
|
||||
t(1)=true;
|
||||
end
|
||||
|
||||
Sigma_e=ones(3,3);
|
||||
chol_2=get_lower_cholesky_covariance(Sigma_e,1e-14);
|
||||
chol_3=get_lower_cholesky_covariance(Sigma_e+1e-14*eye(3),1e-14);
|
||||
if max(max(abs(chol_2-chol_3)))>eps || any(any(triu(chol_3,1)))
|
||||
t(2)=false;
|
||||
else
|
||||
t(2)=true;
|
||||
end
|
||||
|
||||
Sigma_e=ones(3,3);
|
||||
Sigma_e(2,:)=0;
|
||||
Sigma_e(:,2)=0;
|
||||
chol_4=get_lower_cholesky_covariance(Sigma_e,1e-14);
|
||||
if chol_4(2,2)~=0 || any(any(triu(chol_4,1)))
|
||||
t(3)=false;
|
||||
else
|
||||
t(3)=true;
|
||||
end
|
||||
|
||||
Sigma_e=[4 0.5 0; 0.5 9 0; 0 0 16];
|
||||
chol_5=get_lower_cholesky_covariance(Sigma_e,1e-14);
|
||||
if any(any(triu(chol_5,1))) %should be lower triangular
|
||||
t(4)=false;
|
||||
else
|
||||
t(4)=true;
|
||||
end
|
||||
|
||||
T = all(t);
|
||||
%@eof:1
|
|
@ -116,7 +116,7 @@ rr=DD*QQ*DD'+RR;
|
|||
ZSIG0=disc_riccati_fast(ff,DD,rr,hh);
|
||||
PP=ZSIG0 +QQ;
|
||||
|
||||
exo_names=M_.exo_names(M_.exo_names_orig_ord);
|
||||
exo_names=M_.exo_names;
|
||||
|
||||
DPDR=DD*PP*DD'+RR;
|
||||
I_DPDR=inv(DPDR);
|
||||
|
|
|
@ -129,7 +129,7 @@ rr=DD*QQ*DD'+RR;
|
|||
ZSIG0=disc_riccati_fast(ff,DD,rr,hh);
|
||||
PP=ZSIG0 +QQ;
|
||||
|
||||
exo_names = M_.exo_names(M_.exo_names_orig_ord);
|
||||
exo_names = M_.exo_names;
|
||||
|
||||
DPDR=DD*PP*DD'+RR;
|
||||
I_DPDR=inv(DPDR);
|
||||
|
|
|
@ -231,23 +231,22 @@ if options_.irf
|
|||
fprintf(fidTeX,['%% ' datestr(now,0) '\n']);
|
||||
fprintf(fidTeX,' \n');
|
||||
end
|
||||
SS(M_.exo_names_orig_ord,M_.exo_names_orig_ord)=M_.Sigma_e+1e-14*eye(M_.exo_nbr);
|
||||
cs = transpose(chol(SS));
|
||||
tit(M_.exo_names_orig_ord) = M_.exo_names;
|
||||
cs=get_lower_cholesky_covariance(M_.Sigma_e,options_.add_tiny_number_to_cholesky);
|
||||
tit = M_.exo_names;
|
||||
if TeX
|
||||
titTeX(M_.exo_names_orig_ord) = M_.exo_names_tex;
|
||||
titTeX = M_.exo_names_tex;
|
||||
end
|
||||
irf_shocks_indx = getIrfShocksIndx(M_, options_);
|
||||
for i=irf_shocks_indx
|
||||
if SS(i,i) > 1e-13
|
||||
if cs(i,i) > 5e-7
|
||||
if PI_PCL_solver
|
||||
y=PCL_Part_info_irf (0, PCL_varobs, i_var, M_, oo_.dr, options_.irf, i);
|
||||
else
|
||||
if options_.order>1 && options_.relative_irf % normalize shock to 0.01 before IRF generation for GIRFs; multiply with 100 later
|
||||
y=irf(M_, options_, oo_.dr,cs(M_.exo_names_orig_ord,i)./cs(i,i)/100, options_.irf, options_.drop, ...
|
||||
y=irf(M_, options_, oo_.dr,cs(:,i)./cs(i,i)/100, options_.irf, options_.drop, ...
|
||||
options_.replic, options_.order);
|
||||
else %for linear model, rescaling is done later
|
||||
y=irf(M_, options_, oo_.dr,cs(M_.exo_names_orig_ord,i), options_.irf, options_.drop, ...
|
||||
y=irf(M_, options_, oo_.dr,cs(:,i), options_.irf, options_.drop, ...
|
||||
options_.replic, options_.order);
|
||||
end
|
||||
end
|
||||
|
|
|
@ -73,7 +73,6 @@ if local_order~=1 && M_.hessian_eq_zero
|
|||
end
|
||||
|
||||
endo_nbr = M_.endo_nbr;
|
||||
exo_names_orig_ord = M_.exo_names_orig_ord;
|
||||
if isoctave
|
||||
warning('off', 'Octave:divide-by-zero')
|
||||
else
|
||||
|
@ -173,11 +172,10 @@ if options_.hp_filter == 0 && ~options_.bandpass.indicator
|
|||
Gamma_y{nar+2} = ones(nvar,1);
|
||||
else
|
||||
Gamma_y{nar+2} = NaN(nvar,M_.exo_nbr);
|
||||
SS(exo_names_orig_ord,exo_names_orig_ord)=M_.Sigma_e+1e-14*eye(M_.exo_nbr);
|
||||
cs = chol(SS)';
|
||||
b1(:,exo_names_orig_ord) = ghu1;
|
||||
cs = get_lower_cholesky_covariance(M_.Sigma_e,options_.add_tiny_number_to_cholesky);
|
||||
b1 = ghu1;
|
||||
b1 = b1*cs;
|
||||
b2(:,exo_names_orig_ord) = ghu(iky,:);
|
||||
b2 = ghu(iky,:);
|
||||
b2 = b2*cs;
|
||||
vx = lyapunov_symm(A,b1*b1',options_.lyapunov_fixed_point_tol,options_.qz_criterium,options_.lyapunov_complex_threshold,1,options_.debug);
|
||||
vv = diag(aa*vx*aa'+b2*b2');
|
||||
|
@ -251,11 +249,10 @@ else% ==> Theoretical filters.
|
|||
Gamma_y{nar+2} = ones(nvar,1);
|
||||
else
|
||||
Gamma_y{nar+2} = zeros(nvar,M_.exo_nbr);
|
||||
SS(exo_names_orig_ord,exo_names_orig_ord) = M_.Sigma_e+1e-14*eye(M_.exo_nbr); %make sure Covariance matrix is positive definite
|
||||
cs = chol(SS)';
|
||||
cs = get_lower_cholesky_covariance(M_.Sigma_e); %make sure Covariance matrix is positive definite
|
||||
SS = cs*cs';
|
||||
b1(:,exo_names_orig_ord) = ghu1;
|
||||
b2(:,exo_names_orig_ord) = ghu(iky,:);
|
||||
b1 = ghu1;
|
||||
b2 = ghu(iky,:);
|
||||
mathp_col = NaN(ngrid,length(ivar)^2);
|
||||
IA = eye(size(A,1));
|
||||
IE = eye(M_.exo_nbr);
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 1b0e5581378bc98cf73b090c9a849d0e578a895d
|
||||
Subproject commit 0990492e2fe10d06e1955ae5072fda94fe51f8d2
|
Loading…
Reference in New Issue