Merge branch 'exo_names_orig_ord' of git.dynare.org:JohannesPfeifer/dynare

Ref. !2142
remove-submodule
Sébastien Villemot 2023-07-04 16:37:26 +02:00
commit a044ec45b1
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
18 changed files with 123 additions and 47 deletions

2
.gitmodules vendored
View File

@ -25,4 +25,4 @@
url = https://github.com/fangq/jsonlab.git
[submodule "preprocessor"]
path = preprocessor
url = ../../Dynare/preprocessor.git
url = ../../JohannesPfeifer/preprocessor.git

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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.'), ...

View File

@ -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;

View File

@ -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');

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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