Merge pull request #955 from JohannesPfeifer/identification_fixes

Various fixes to GSA and Identification
time-shift
Houtan Bastani 2015-06-08 10:17:24 +02:00
commit 41155369ac
20 changed files with 653 additions and 121 deletions

View File

@ -5358,6 +5358,7 @@ decomposition of the above k-step ahead filtered values. Stores results in @code
@item diffuse_filter
@anchor{diffuse_filter}
Uses the diffuse Kalman filter (as described in
@cite{Durbin and Koopman (2012)} and @cite{Koopman and Durbin
(2003)}) to estimate models with non-stationary observed variables.
@ -7238,8 +7239,8 @@ for identification analysis. Default: @code{0}
@item ar = @var{INTEGER}
Maximum number of lags for moments in identification analysis. Default: @code{1}
@item lik_init = @var{INTEGER}
@xref{lik_init}.
@item diffuse_filter = @var{INTEGER}
@xref{diffuse_filter}.
@end table

View File

@ -59,8 +59,24 @@ options_ident = set_default_option(options_ident,'periods',300);
options_ident = set_default_option(options_ident,'replic',100);
options_ident = set_default_option(options_ident,'advanced',0);
options_ident = set_default_option(options_ident,'normalize_jacobians',1);
%Deal with non-stationary cases
if isfield(options_ident,'diffuse_filter') %set lik_init and options_
options_ident.lik_init=3; %overwrites any other lik_init set
options_.diffuse_filter=options_ident.diffuse_filter; %make options_ inherit diffuse filter; will overwrite any conflicting lik_init in dynare_estimation_init
else
if options_.diffuse_filter==1 %warning if estimation with diffuse filter was done, but not passed
warning('IDENTIFICATION:: Previously the diffuse_filter option was used, but it was not passed to the identification command. This may result in problems if your model contains unit roots.')
end
if isfield(options_ident,'lik_init')
if options_ident.lik_init==3 %user specified diffuse filter using the lik_init option
options_ident.analytic_derivation=0; %diffuse filter not compatible with analytic derivation
end
end
end
options_ident = set_default_option(options_ident,'lik_init',1);
options_ident = set_default_option(options_ident,'analytic_derivation',1);
if isfield(options_ident,'nograph'),
options_.nograph=options_ident.nograph;
end
@ -70,6 +86,9 @@ end
if isfield(options_ident,'graph_format'),
options_.graph_format=options_ident.graph_format;
end
if isfield(options_ident,'prior_trunc'),
options_.prior_trunc=options_ident.prior_trunc;
end
if options_ident.gsa_sample_file,
GSAFolder = checkpath('gsa',M_.dname);
@ -122,8 +141,7 @@ options_.prior_mc = options_ident.prior_mc;
options_.options_ident = options_ident;
options_.Schur_vec_tol = 1.e-8;
options_.nomoments=0;
options_.analytic_derivation=1;
options_ = set_default_option(options_,'analytic_derivation',1);
options_ = set_default_option(options_,'datafile','');
options_.mode_compute = 0;
options_.plot_priors = 0;

View File

@ -52,6 +52,7 @@ else
end
i = 1;
c = zeros(n,1,p);
c1 = zeros(n,1,p);
while i < m
if t(i+1,i) == 0
if i == 1

View File

@ -19,10 +19,18 @@ function [H, dA, dOm, Hss, gp, d2A, d2Om, H2ss] = getH(A, B, M_,oo_,options_,kro
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
if nargin<6 || isempty(kronflag), kronflag = 0; end
if nargin<7 || isempty(indx), indx = [1:M_.param_nbr]; end,
if nargin<8 || isempty(indexo), indexo = []; end,
if nargin<9 || isempty(iv), iv = (1:length(A))'; end,
if nargin<6 || isempty(kronflag)
kronflag = 0;
end
if nargin<7 || isempty(indx)
indx = [];
end
if nargin<8 || isempty(indexo)
indexo = [];
end
if nargin<9 || isempty(iv)
iv = (1:length(A))';
end
[I,J]=find(M_.lead_lag_incidence');
yy0=oo_.dr.ys(I);

View File

@ -17,10 +17,18 @@ function [JJ, H, gam, gp, dA, dOm, dYss] = getJJ(A, B, M_,oo_,options_,kronflag,
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
if nargin<7 || isempty(indx), indx = [1:M_.param_nbr];, end,
if nargin<8 || isempty(indexo), indexo = [];, end,
if nargin<10 || isempty(nlags), nlags=3; end,
if nargin<11 || isempty(useautocorr), useautocorr=0; end,
if nargin<7 || isempty(indx)
% indx = [1:M_.param_nbr];
end,
if nargin<8 || isempty(indexo)
indexo = [];
end,
if nargin<10 || isempty(nlags)
nlags=3;
end
if nargin<11 || isempty(useautocorr)
useautocorr=0;
end
% if useautocorr,
warning('off','MATLAB:divideByZero')

View File

@ -64,7 +64,7 @@ if opt_gsa.load_ident_files==0,
if opt_gsa.morris==2,
pdraws = dynare_identification(options_.options_ident,[lpmatx lpmat(istable,:)]);
% [pdraws, TAU, GAM] = dynare_identification(options_.options_ident,[lpmatx lpmat(istable,:)]);
if max(max(abs(pdraws-[lpmatx lpmat(istable,:)])))==0,
if ~isempty(pdraws) && max(max(abs(pdraws-[lpmatx lpmat(istable,:)])))==0,
disp(['Sample check OK ', num2str(max(max(abs(pdraws-[lpmatx lpmat(istable,:)]))))]),
clear pdraws;
end

View File

@ -20,7 +20,7 @@ function [vdec, cc, ac] = mc_moments(mm, ss, dr)
global options_ M_ estim_params_ oo_
[nr1, nc1, nsam] = size(mm);
nobs=size(options_.varobs,1);
nobs=size(options_.varobs,2);
disp('Computing theoretical moments ...')
h = dyn_waitbar(0,'Theoretical moments ...');
vdec = zeros(nobs,M_.exo_nbr,nsam);
@ -37,7 +37,7 @@ global options_ M_ estim_params_ oo_
cc(:,:,j)=triu(corr);
dum=[];
for i=1:options_.ar
dum=[dum, autocorr{i}];
dum=[dum, autocorr{i}];
end
ac(:,:,j)=dum;
dyn_waitbar(j/nsam,h)

View File

@ -42,7 +42,7 @@ function pdraw = prior_draw_gsa(init,rdraw)
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
global bayestopt_ options_
global bayestopt_ options_ estim_params_ M_
persistent npar pshape p6 p7 p3 p4 lbcum ubcum
if init
@ -55,7 +55,18 @@ if init
pdraw = zeros(npar,1);
lbcum = zeros(npar,1);
ubcum = ones(npar,1);
bounds = prior_bounds(bayestopt_,options_);
[junk1,junk2,junk3,lb,ub,junk4] = set_prior(estim_params_,M_,options_); %Prepare bounds
if ~isempty(bayestopt_) && any(bayestopt_.pshape > 0)
% Set prior bounds
bounds = prior_bounds(bayestopt_,options_);
bounds.lb = max(bounds.lb,lb);
bounds.ub = min(bounds.ub,ub);
else % estimated parameters but no declared priors
% No priors are declared so Dynare will estimate the model by
% maximum likelihood with inequality constraints for the parameters.
bounds.lb = lb;
bounds.ub = ub;
end
% set bounds for cumulative probabilities
for i = 1:npar
switch pshape(i)
@ -63,8 +74,8 @@ if init
p4(i) = min(p4(i),bounds.ub(i));
p3(i) = max(p3(i),bounds.lb(i));
case 3% Gaussian prior.
lbcum(i) = 0.5 * erfc(-(bounds.lb(i)-p6(i))/p7(i) ./ sqrt(2));;
ubcum(i) = 0.5 * erfc(-(bounds.ub(i)-p6(i))/p7(i) ./ sqrt(2));;
lbcum(i) = 0.5 * erfc(-(bounds.lb(i)-p6(i))/p7(i) ./ sqrt(2));
ubcum(i) = 0.5 * erfc(-(bounds.ub(i)-p6(i))/p7(i) ./ sqrt(2));
case 2% Gamma prior.
lbcum(i) = gamcdf(bounds.lb(i)-p3(i),p6(i),p7(i));
ubcum(i) = gamcdf(bounds.ub(i)-p3(i),p6(i),p7(i));

View File

@ -1,6 +1,8 @@
function set_shocks_param(xparam1)
% function set_shocks_param(xparam1)
% Set the structural and measurement error variances and covariances
% Copyright (C) 2012 Dynare Team
% Copyright (C) 2012-2015 Dynare Team
%
% This file is part of Dynare.
%
@ -18,31 +20,86 @@ function set_shocks_param(xparam1)
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
global estim_params_ M_
nvx = estim_params_.nvx;
ncx = estim_params_.ncx;
np = estim_params_.np;
Sigma_e = M_.Sigma_e;
offset = 0;
if nvx
offset = offset + nvx;
nvx = estim_params_.nvx;
ncx = estim_params_.ncx;
nvn = estim_params_.nvn;
ncn = estim_params_.ncn;
Sigma_e = M_.Sigma_e;
Correlation_matrix = M_.Correlation_matrix;
H = M_.H;
Correlation_matrix_ME = M_.Correlation_matrix_ME;
% setting shocks variance on the diagonal of Covariance matrix; used later
% for updating covariances
if nvx
var_exo = estim_params_.var_exo;
for i=1:nvx
k = var_exo(i,1);
Sigma_e(k,k) = xparam1(i)^2;
k =var_exo(i,1);
Sigma_e(k,k) = xparam1(i)^2;
end
end
if ncx
offset = offset + estim_params_.nvn;
end
% update offset
offset = nvx;
% setting measument error variance; on the diagonal of Covariance matrix; used later
% for updating covariances
if nvn
for i=1:nvn
k = estim_params_.nvn_observable_correspondence(i,1);
H(k,k) = xparam1(i+offset)^2;
end
end
% update offset
offset = nvx+nvn;
% setting shocks covariances
if ncx
corrx = estim_params_.corrx;
for i=1:ncx
k1 = corrx(i,1);
k2 = corrx(i,2);
Sigma_e(k1,k2) = xparam1(i+offset)*sqrt(Sigma_e_(k1,k1)*Sigma_e_(k2,k2));
Sigma_e(k2,k1) = Sigma_e_(k1,k2);
k1 = corrx(i,1);
k2 = corrx(i,2);
Correlation_matrix(k1,k2) = xparam1(i+offset);
Correlation_matrix(k2,k1) = Correlation_matrix(k1,k2);
end
end
end
%build covariance matrix from correlation matrix and variances already on
%diagonal
Sigma_e = diag(sqrt(diag(Sigma_e)))*Correlation_matrix*diag(sqrt(diag(Sigma_e)));
%if calibrated covariances, set them now to their stored value
if isfield(estim_params_,'calibrated_covariances')
Sigma_e(estim_params_.calibrated_covariances.position)=estim_params_.calibrated_covariances.cov_value;
end
% update offset
offset = nvx+nvn+ncx;
% setting measurement error covariances
if ncn
corrn_observable_correspondence = estim_params_.corrn_observable_correspondence;
for i=1:ncn
k1 = corrn_observable_correspondence(i,1);
k2 = corrn_observable_correspondence(i,2);
Correlation_matrix_ME(k1,k2) = xparam1(i+offset);
Correlation_matrix_ME(k2,k1) = Correlation_matrix_ME(k1,k2);
end
end
%build covariance matrix from correlation matrix and variances already on
%diagonal
H = diag(sqrt(diag(H)))*Correlation_matrix_ME*diag(sqrt(diag(H)));
%if calibrated covariances, set them now to their stored value
if isfield(estim_params_,'calibrated_covariances_ME')
H(estim_params_.calibrated_covariances_ME.position)=estim_params_.calibrated_covariances_ME.cov_value;
end
M_.Sigma_e = Sigma_e;
% updating matrices in M
if nvx || ncx
M_.Sigma_e = Sigma_e;
M_.Correlation_matrix=Correlation_matrix;
end
if nvn || ncn
M_.H = H;
M_.Correlation_matrix_ME=Correlation_matrix_ME;
end

View File

@ -87,7 +87,7 @@ nshock = estim_params_.nvx;
nshock = nshock + estim_params_.nvn;
nshock = nshock + estim_params_.ncx;
nshock = nshock + estim_params_.ncn;
lpmat0=[];
lpmat0=zeros(Nsam,0);
xparam1=[];
pshape = bayestopt_.pshape(nshock+1:end);
@ -96,7 +96,22 @@ p2 = bayestopt_.p2(nshock+1:end);
p3 = bayestopt_.p3(nshock+1:end);
p4 = bayestopt_.p4(nshock+1:end);
bounds = prior_bounds(bayestopt_,options_);
[junk1,junk2,junk3,lb,ub,junk4] = set_prior(estim_params_,M_,options_); %Prepare bounds
if ~isempty(bayestopt_) && any(bayestopt_.pshape > 0)
% Set prior bounds
bounds = prior_bounds(bayestopt_,options_);
bounds.lb = max(bounds.lb,lb);
bounds.ub = min(bounds.ub,ub);
else % estimated parameters but no declared priors
% No priors are declared so Dynare will estimate the model by
% maximum likelihood with inequality constraints for the parameters.
bounds.lb = lb;
bounds.ub = ub;
if opt_gsa.prior_range==0
warning('GSA:: When using ML, sampling from the prior is not possible. Setting prior_range=1')
opt_gsa.prior_range=1;
end
end
if nargin==0,
OutputDirectoryName='';
@ -143,7 +158,7 @@ if fload==0,
end
end
else %ilptau==0
%[lpmat] = rand(Nsam,np);
[lpmat] = NaN(Nsam,np);
for j=1:np,
lpmat(:,j) = randperm(Nsam)'./(Nsam+1); %latin hypercube
end
@ -151,7 +166,7 @@ if fload==0,
end
end
% try
dummy=prior_draw_gsa(1);
dummy=prior_draw_gsa(1); %initialize persistent variables
% catch
% if pprior,
% if opt_gsa.prior_range==0;
@ -242,6 +257,7 @@ if fload==0,
else
d = chol(inv(hh));
lp=randn(Nsam*2,nshock+np)*d+kron(ones(Nsam*2,1),xparam1');
lnprior=zeros(1,Nsam*2);
for j=1:Nsam*2,
lnprior(j) = any(lp(j,:)'<=bounds.lb | lp(j,:)'>=bounds.ub);
end
@ -263,6 +279,7 @@ if fload==0,
iwrong=zeros(1,Nsam);
inorestriction=zeros(1,Nsam);
irestriction=zeros(1,Nsam);
infox=zeros(1,Nsam);
for j=1:Nsam,
M_ = set_all_parameters([lpmat0(j,:) lpmat(j,:)]',estim_params_,M_);
%try stoch_simul([]);
@ -273,7 +290,7 @@ if fload==0,
[Tt,Rr,SteadyState,info,M_,options_,oo_] = dynare_resolve(M_,options_,oo_,'restrict');
end
infox(j,1)=info(1);
if infox(j,1)==0 && ~exist('T'),
if infox(j,1)==0 && ~exist('T','var'),
dr_=oo_.dr;
if prepSA,
try
@ -321,7 +338,7 @@ if fload==0,
% bayestopt_.restrict_columns, ...
% bayestopt_.restrict_aux);
end
if ~exist('nspred'),
if ~exist('nspred','var'),
nspred = dr_.nspred; %size(dr_.ghx,2);
nboth = dr_.nboth;
nfwrd = dr_.nfwrd;
@ -339,7 +356,7 @@ if fload==0,
istable(j)=0;
if isfield(dr_,'eigval')
egg(:,j) = sort(dr_.eigval);
if exist('nspred')
if exist('nspred','var')
if any(isnan(egg(1:nspred,j)))
iwrong(j)=j;
else
@ -349,7 +366,7 @@ if fload==0,
end
end
else
if exist('egg'),
if exist('egg','var'),
egg(:,j)=ones(size(egg,1),1).*NaN;
end
iwrong(j)=j;
@ -457,6 +474,7 @@ else
stoch_simul([]);
%T=zeros(size(dr_.ghx,1),size(dr_.ghx,2)+size(dr_.ghu,2),length(istable));
ntrans=length(istable);
yys=NaN(length(ys_),ntrans);
for j=1:ntrans,
M_.params(estim_params_.param_vals(:,1)) = lpmat(istable(j),:)';
%stoch_simul([]);
@ -465,12 +483,12 @@ else
%[Tt,Rr,SteadyState,info] = dynare_resolve(bayestopt_.restrict_var_list,...
% bayestopt_.restrict_columns,...
% bayestopt_.restrict_aux);
if ~exist('T')
if ~exist('T','var')
T=zeros(size(dr_.ghx,1),size(dr_.ghx,2)+size(dr_.ghu,2),ntrans);
end
dr_ = oo_.dr;
T(:,:,j) = [dr_.ghx dr_.ghu];
if ~exist('nspred')
if ~exist('nspred','var')
nspred = dr_.nspred; %size(dr_.ghx,2);
nboth = dr_.nboth;
nfwrd = dr_.nfwrd;

View File

@ -1,6 +1,7 @@
function [vdec, corr, autocorr, z, zz] = th_moments(dr,var_list)
% [vdec, corr, autocorr, z, zz] = th_moments(dr,var_list)
% Copyright (C) 2012 Dynare Team
% Copyright (C) 2012-2015 Dynare Team
%
% This file is part of Dynare.
%
@ -17,38 +18,38 @@ function [vdec, corr, autocorr, z, zz] = th_moments(dr,var_list)
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
global M_ oo_ options_
nvar = size(var_list,1);
if nvar == 0
global M_ oo_ options_
nvar = size(var_list,2);
if nvar == 0
nvar = length(dr.order_var);
ivar = [1:nvar]';
else
else
ivar=zeros(nvar,1);
for i=1:nvar
i_tmp = strmatch(var_list(i,:),M_.endo_names,'exact');
if isempty(i_tmp)
error (['One of the variable specified does not exist']) ;
else
ivar(i) = i_tmp;
end
i_tmp = strmatch(var_list(:,i),M_.endo_names,'exact');
if isempty(i_tmp)
error(['One of the variables specified does not exist']) ;
else
ivar(i) = i_tmp;
end
end
end
[gamma_y,stationary_vars] = th_autocovariances(dr,ivar,M_, options_);
m = dr.ys(ivar(stationary_vars));
end
[gamma_y,stationary_vars] = th_autocovariances(dr,ivar,M_, options_);
m = dr.ys(ivar(stationary_vars));
% i1 = find(abs(diag(gamma_y{1})) > 1e-12);
i1 = [1:length(ivar)];
s2 = diag(gamma_y{1});
sd = sqrt(s2);
i1 = [1:length(ivar)];
s2 = diag(gamma_y{1});
sd = sqrt(s2);
z = [ m sd s2 ];
mean = m;
var = gamma_y{1};
z = [ m sd s2 ];
mean = m;
var = gamma_y{1};
%'THEORETICAL MOMENTS';
%'MEAN','STD. DEV.','VARIANCE');
@ -56,28 +57,27 @@ z;
%'VARIANCE DECOMPOSITION (in percent)';
if M_.exo_nbr>1,
vdec = 100*gamma_y{options_.ar+2}(i1,:);
vdec = 100*gamma_y{options_.ar+2}(i1,:);
else
vdec = 100*ones(size(gamma_y{1}(i1,1)));
end
vdec = 100*ones(size(gamma_y{1}(i1,1)));
end
%'MATRIX OF CORRELATIONS';
if options_.opt_gsa.useautocorr,
corr = gamma_y{1}(i1,i1)./(sd(i1)*sd(i1)');
corr = corr-diag(diag(corr))+diag(diag(gamma_y{1}(i1,i1)));
else
corr = gamma_y{1}(i1,i1);
corr = gamma_y{1}(i1,i1);
end
if options_.ar > 0
%'COEFFICIENTS OF AUTOCORRELATION';
if options_.ar > 0
%'COEFFICIENTS OF AUTOCORRELATION';
for i=1:options_.ar
if options_.opt_gsa.useautocorr,
autocorr{i} = gamma_y{i+1}(i1,i1);
else
autocorr{i} = gamma_y{i+1}(i1,i1).*(sd(i1)*sd(i1)');
end
zz(:,i) = diag(gamma_y{i+1}(i1,i1));
if options_.opt_gsa.useautocorr,
autocorr{i} = gamma_y{i+1}(i1,i1);
else
autocorr{i} = gamma_y{i+1}(i1,i1).*(sd(i1)*sd(i1)');
end
zz(:,i) = diag(gamma_y{i+1}(i1,i1));
end
end
end

View File

@ -86,7 +86,7 @@ if info(1)==0,
if init,
indJJ = (find(max(abs(JJ'),[],1)>1.e-8));
if isempty(indJJ) && any(any(isnan(JJ)))
error('There are NaN in the JJ matrix. Please check whether your model has units roots and you forgot to set lik_init~=1.' )
error('There are NaN in the JJ matrix. Please check whether your model has units roots and you forgot to set diffuse_filter=1.' )
end
while length(indJJ)<nparam && nlags<10,
disp('The number of moments with non-zero derivative is smaller than the number of parameters')
@ -118,14 +118,14 @@ if info(1)==0,
ide_strength_J_prior=NaN(1,nparam);
if init, %~isempty(indok),
normaliz = abs(params);
if prior_exist,
if prior_exist,
if ~isempty(estim_params_.var_exo),
normaliz1 = estim_params_.var_exo(:,7); % normalize with prior standard deviation
normaliz1 = estim_params_.var_exo(:,7)'; % normalize with prior standard deviation
else
normaliz1=[];
end
if ~isempty(estim_params_.param_vals),
normaliz1 = [normaliz1; estim_params_.param_vals(:,7)]'; % normalize with prior standard deviation
normaliz1 = [normaliz1 estim_params_.param_vals(:,7)']; % normalize with prior standard deviation
end
% normaliz = max([normaliz; normaliz1]);
normaliz1(isinf(normaliz1)) = 1;

View File

@ -82,7 +82,7 @@ end
ixnoJ = 0;
if rankJ<npar || rankJJ<npar || min(1-McoJ)<1.e-10
if npar>0 && (rankJ<npar || rankJJ<npar || min(1-McoJ)<1.e-10)
% - find out which parameters are involved
% disp('Some parameters are NOT identified by the moments included in J')
% disp(' ')

View File

@ -56,14 +56,22 @@ if SampleSize == 1,
subplot(211)
mmm = (idehess.ide_strength_J);
[ss, is] = sort(mmm);
bar(log([idehess.ide_strength_J(:,is)' idehess.ide_strength_J_prior(:,is)']))
if ~all(isnan(idehess.ide_strength_J_prior))
bar(log([idehess.ide_strength_J(:,is)' idehess.ide_strength_J_prior(:,is)']))
else
bar(log([idehess.ide_strength_J(:,is)' ]))
end
set(gca,'xlim',[0 nparam+1])
set(gca,'xticklabel','')
dy = get(gca,'ylim');
for ip=1:nparam,
text(ip,dy(1),name{is(ip)},'rotation',90,'HorizontalAlignment','right','interpreter','none')
end
legend('relative to param value','relative to prior std','Location','Best')
if ~all(isnan(idehess.ide_strength_J_prior))
legend('relative to param value','relative to prior std','Location','Best')
else
legend('relative to param value','Location','Best')
end
if idehess.flag_score,
title('Identification strength with asymptotic Information matrix (log-scale)')
else
@ -71,14 +79,23 @@ if SampleSize == 1,
end
subplot(212)
bar(log([idehess.deltaM(is) idehess.deltaM_prior(is)]))
if ~all(isnan(idehess.deltaM_prior))
bar(log([idehess.deltaM(is) idehess.deltaM_prior(is)]))
else
bar(log([idehess.deltaM(is)]))
end
set(gca,'xlim',[0 nparam+1])
set(gca,'xticklabel','')
dy = get(gca,'ylim');
for ip=1:nparam,
text(ip,dy(1),name{is(ip)},'rotation',90,'HorizontalAlignment','right','interpreter','none')
end
legend('relative to param value','relative to prior std','Location','Best')
if ~all(isnan(idehess.deltaM_prior))
legend('relative to param value','relative to prior std','Location','Best')
else
legend('relative to param value','Location','Best')
end
if idehess.flag_score,
title('Sensitivity component with asymptotic Information matrix (log-scale)')
else
@ -91,27 +108,30 @@ if SampleSize == 1,
skipline()
disp('Press ENTER to plot advanced diagnostics'), pause(5),
end
hh = dyn_figure(options_,'Name',[tittxt, ' - Sensitivity plot']);
subplot(211)
mmm = (siJnorm)'./max(siJnorm);
mmm1 = (siHnorm)'./max(siHnorm);
mmm=[mmm mmm1];
mmm1 = (siLREnorm)'./max(siLREnorm);
offset=length(siHnorm)-length(siLREnorm);
mmm1 = [NaN(offset,1); mmm1];
mmm=[mmm mmm1];
bar(log(mmm(is,:).*100))
set(gca,'xlim',[0 nparam+1])
set(gca,'xticklabel','')
dy = get(gca,'ylim');
for ip=1:nparam,
text(ip,dy(1),name{is(ip)},'rotation',90,'HorizontalAlignment','right','interpreter','none')
if all(isnan([siJnorm';siHnorm';siLREnorm']))
fprintf('\nIDENTIFICATION: Skipping sensitivity plot, because standard deviation of parameters is NaN, possibly due to the use of ML.\n')
else
hh = dyn_figure(options_,'Name',[tittxt, ' - Sensitivity plot']);
subplot(211)
mmm = (siJnorm)'./max(siJnorm);
mmm1 = (siHnorm)'./max(siHnorm);
mmm=[mmm mmm1];
mmm1 = (siLREnorm)'./max(siLREnorm);
offset=length(siHnorm)-length(siLREnorm);
mmm1 = [NaN(offset,1); mmm1];
mmm=[mmm mmm1];
bar(log(mmm(is,:).*100))
set(gca,'xlim',[0 nparam+1])
set(gca,'xticklabel','')
dy = get(gca,'ylim');
for ip=1:nparam,
text(ip,dy(1),name{is(ip)},'rotation',90,'HorizontalAlignment','right','interpreter','none')
end
legend('Moments','Model','LRE model','Location','Best')
title('Sensitivity bars using derivatives (log-scale)')
dyn_saveas(hh,[IdentifDirectoryName '/' M_.fname '_sensitivity_' tittxt1 ],options_);
end
legend('Moments','Model','LRE model','Location','Best')
title('Sensitivity bars using derivatives (log-scale)')
dyn_saveas(hh,[IdentifDirectoryName '/' M_.fname '_sensitivity_' tittxt1 ],options_);
% identificaton patterns
for j=1:size(idemoments.cosnJ,2),
pax=NaN(nparam,nparam);

View File

@ -32,8 +32,12 @@ function M = set_all_parameters(xparam1,estim_params,M)
%! @sp 2
%! @end deftypefn
%@eod:
%
% Remarks: Changes to this file also need to be ported to
% gsa/set_shocks_param.m
% Copyright (C) 2003-2013 Dynare Team
% Copyright (C) 2003-2015 Dynare Team
%
% This file is part of Dynare.
%

View File

@ -6,6 +6,7 @@ MODFILES = \
estimation/t_proposal/fs2000_student.mod \
gsa/ls2003.mod \
gsa/ls2003a.mod \
gsa/cod_ML_morris/cod_ML_morris.mod \
ramst.mod \
ramst_a.mod \
ramst_static_tag.mod \
@ -124,6 +125,9 @@ MODFILES = \
seeds.mod \
identification/kim/kim2.mod \
identification/as2007/as2007.mod \
identification/ident_unit_root/ident_unit_root.mod \
identification/rbc_ident/rbc_ident_std_as_structural_par.mod \
identification/rbc_ident/rbc_ident_varexo_only.mod \
simul/example1.mod \
simul/Solow_no_varexo.mod \
simul/simul_ZLB_purely_forward.mod \
@ -304,6 +308,8 @@ deterministic_simulations/rbc_det_exo_lag_2c.o.trs: deterministic_simulations/rb
initval_file/ramst_initval_file.m.trs: initval_file/ramst_initval_file_data.m.tls
initval_file/ramst_initval_file.o.trs: initval_file/ramst_initval_file_data.o.tls
identification/rbc_ident/rbc_ident_varexo_only.m.trs: identification/rbc_ident/rbc_ident_std_as_structural_par.m.trs
identification/rbc_ident/rbc_ident_varexo_only.o.trs: identification/rbc_ident/rbc_ident_std_as_structural_par.o.trs
# Matlab TRS Files

View File

@ -0,0 +1,135 @@
var c, y_ro, psi, s, tt, pi_h, mc_ro, i_ro, pi_ro, pi_eu, pi_f, y_eu, mc_eu, i_eu, g, a, cp, bnr, gs, as ;
varexo eps_a, eps_g, eps_cp, eps_s, eps_m, eps_as, eps_gs, eps_ms;
parameters alfa, niu, delt, teta_h, teta_f, bet, fi, sigm, h, ro, psi_pi, tetas, rhos, psi_pis, psi_y, psi_deltay, rho_g, rho_a, rho_cp, rho_s, rho_gs, rho_as ;
alfa = 0.425 ;
bet = 0.99 ;
niu = 0.6 ;
delt = 0.3 ;
teta_h = 0.7 ;
teta_f = 0.7 ;
fi = 2 ;
sigm = 0.5 ;
h = 0.8 ;
ro = 0.5 ;
psi_pi = 1.5 ;
tetas = 0.7 ;
rhos = 0.5 ;
psi_pis = 1.5 ;
psi_y = 0.25 ;
psi_deltay = 0.25 ;
rho_g = 0.5 ;
rho_a = 0.5 ;
rho_cp = 0.5 ;
rho_s = 0.5 ;
rho_gs = 0.5 ;
rho_as = 0.5 ;
model (linear) ;
// (1) mk clearing condition
(1-alfa) * c = y_ro - alfa * niu* (2-alfa)* tt - alfa * niu * psi - alfa * y_eu ;
// (2) terms of trade
tt - tt(-1) = pi_f - pi_h ;
// (3) terms of trade, real exchange rate, law of one price gap
s = psi + (1 - alfa) * tt;
// (4) domestic producers price setting
pi_h - delt * pi_h(-1) = (1 - teta_h) * (1- bet * teta_h) / teta_h * mc_ro + bet * ( pi_h(+1) - delt * pi_h) ;
// (5) domestic real mg costs
mc_ro = fi * y_ro - (1 + fi) * a + alfa * tt + sigm / (1-h) * (c - h* c(-1)) ;
// (6) importers price setting
pi_f - delt * pi_f(-1) = (1 - teta_f) * (1 - bet * teta_f) / teta_f * psi + bet * (pi_f (+1) - delt * pi_f) + cp;
// (7) complete mk assumption
c - h * c(-1) = y_eu - h * y_eu(-1) + (1 - h) / sigm * (psi + (1 - alfa) * tt) + g ;
// (8) domestic inflation
pi_ro = pi_h + alfa * (tt - tt(-1)) ;
// (9) UIP
i_ro - pi_ro(+1) - i_eu + pi_eu(+1) = s(+1) - s + bnr ;
// (10) domestic monetary policy rule
i_ro = ro * i_ro(-1) + (1 - ro) * (psi_pi * pi_ro + psi_y * y_ro + psi_deltay * (y_ro - y_ro(-1)) ) + eps_m ;
// (11) foreign euler equation
y_eu - h * y_eu(-1) = y_eu(+1) - h * y_eu - (1 - h) / sigm * (i_eu - pi_eu(+1)) + gs - gs(+1) ;
// (12) foreign producers price setting
pi_eu = (1 - tetas) * (1 - bet * tetas) / tetas * mc_eu + bet * pi_eu(+1) ;
// (13) foreign real mg costs
mc_eu = fi * y_eu - (1 + fi) * as + alfa * tt + sigm / (1-h) * (y_eu - h * y_eu(-1)) ;
// (14) foreign monetary policy rule
i_eu = rhos * i_eu(-1) + (1 - rhos) * (psi_pis * pi_eu + psi_y * y_eu) + eps_ms ;
// exogenous processes
// (15) domestic shock in preferences (demand sh)
g = rho_g * g(-1) + eps_g ;
// (16) domestic technological shock (supply sh)
a = rho_a * a(-1) + eps_a ;
// (17) exchange rate shock
bnr = rho_s * bnr(-1) + eps_s ;
// (18) foreign shock in preferences
gs = rho_gs * gs(-1) + eps_gs ;
// (19) foreign technological shock
as = rho_as * as(-1) + eps_as ;
// (20) cost-push shock
cp = rho_cp * cp(-1) + eps_cp ;
end ;
shocks;
var eps_g; stderr 1 ;
var eps_a; stderr 1 ;
var eps_cp; stderr 1 ;
var eps_s; stderr 1 ;
var eps_m ; stderr 1 ;
var eps_gs; stderr 1 ;
var eps_as; stderr 1 ;
var eps_ms ; stderr 1 ;
end ;
/* steady ;
*/
check ;
estimated_params ;
niu, 0.6, 0.01, 0.999 ;
delt, 0.3, 0.01, 0.999 ;
teta_h, 0.7, 0.01, 0.999 ;
teta_f, 0.7, 0.01, 0.999 ;
fi, 2, 0.01, 5 ;
sigm, 0.5, 0.01, 0.999 ;
h, 0.8, 0.01, 0.999 ;
ro, 0.5, 0.01, 0.999 ;
psi_pi, 1.4, 0.01, 8 ;
tetas, 0.6, 0.01, 0.999 ;
rhos, 0.5, 0.01, 0.999 ;
psi_pis, 1.4, 0.01, 8 ;
psi_y, 0.25, 0.01, 0.999 ;
psi_deltay, 0.25, 0.01, 0.999 ;
rho_g, 0.3, 0.01, 0.999 ;
rho_a, 0.3, 0.01, 0.999 ;
rho_cp, 0.3, 0.01, 0.999 ;
rho_s, 0.3, 0.01, 0.999 ;
rho_gs, 0.3, 0.01, 0.999 ;
rho_as, 0.3, 0.01, 0.999 ;
stderr eps_g, 1, 0.01, 10 ;
stderr eps_a, 1, 0.01, 10 ;
stderr eps_cp, 1, 0.01, 10 ;
stderr eps_s, 1, 0.01, 10 ;
stderr eps_gs, 1, 0.01, 10 ;
stderr eps_as, 1, 0.01, 10 ;
% corr eps_g, eps_a, 0, -1, 1;
end;
varobs y_ro, pi_ro, i_ro, s, y_eu, pi_eu, i_eu, tt ;
dynare_sensitivity (identification=1, nsam = 2000, lik_only = 1, morris=2) ;
stoch_simul(order=2,irf=20) y_ro pi_ro i_ro s ;
//order 1 - impulse response functions are simply the algebraic forward iteration of the model's policy
//order 2 - impulse response functions will be the result of actual Monte Carlo simulations of future shocks
//specify sucient periods in IRFs to see the graphs return to steady state
check ;
/* shock_decomposition y_ro ;
*/

View File

@ -0,0 +1,45 @@
//Tests Identification command with ML and unit roots/diffuse filter option
var y delta_y x z;
varexo eps_x eps_z;
parameters rho sigma_z sigma_x;
// set parameter values
sigma_z=0.001;
sigma_x=0.01;
rho=0.9;
model;
z=rho*z(-1)+sigma_z*eps_z;
x=x(-1)+sigma_x*eps_x;
y=x+z;
delta_y=y-y(-1);
end;
steady_state_model;
x=0;
z=0;
y=0;
delta_y=0;
end;
//set shock variances
shocks;
var eps_z=1;
var eps_x=1;
end;
steady;
check;
varobs y delta_y;
stoch_simul(order=1,irf=0);
estimated_params;
rho, 0.9;
sigma_z, 0.01;
sigma_x, 0.01;
end;
identification(diffuse_filter,advanced=1,prior_trunc=0);

View File

@ -0,0 +1,95 @@
% Real Business Cycle Model
close all;
%----------------------------------------------------------------
% 1. Defining variables
%----------------------------------------------------------------
var y c k l x z g ysim xsim;
varexo eps_z eps_g;
parameters gn gz betta delta psi sigma theta rho_z eps_z_sigma rho_g eps_g_sigma q12 zbar gbar;
%----------------------------------------------------------------
% 2. Calibration
%----------------------------------------------------------------
gn = 0.00243918275778010;
gz = 0.00499789993972673;
betta = 0.9722^(1/4)/(1+gz);
delta = 1-(1-0.0464)^(1/4);
psi = 2.24;
sigma = 1.000001;
theta = 0.35;
zbar = 0.0023;
gbar = -0.0382;
rho_z = 0.8;
sig_z = 0.0086;
rho_g = 0.8;
sig_g = 0.0248;
q12 = -0.0002;
%----------------------------------------------------------------
% 3. Model
%----------------------------------------------------------------
model;
% Intratemporal Optimality Condition
(psi*c)/(1-l) = (1-theta)*(k(-1)^theta)*(l^(-theta))*(exp(z)^(1-theta));
% Intertemporal Optimality Condition
(c^(-sigma))*((1-l)^(psi*(1-sigma))) = betta*((c(+1))^(-sigma))*((1-l(+1))^(psi*(1-sigma)))*(theta*(k^(theta-1))*((exp(z(+1))*l(+1))^(1-theta))+(1-delta));
% Aggregate Resource Constraint
y = c + exp(g) + x;
% Capital Accumulation Law
(1+gz)*(1+gn)*k = (1-delta)*k(-1) + x;
% Production Function
y = (k(-1)^theta)*((exp(z)*l)^(1-theta));
% Stochastic Processes
z = zbar + rho_z*z(-1) + eps_z_sigma*eps_z;
g = gbar + rho_g*g(-1) + eps_g_sigma*eps_g;
ysim = y;
xsim = x;
end;
%----------------------------------------------------------------
% 4. Computation
%----------------------------------------------------------------
shocks;
var eps_z ; stderr 1;
var eps_g ; stderr 1;
end;
initval;
z = 0;
k = (betta*theta)^(1/(1-theta))*exp(zbar/(1-rho_z));
c = (1-betta*theta)/(betta*theta)*k;
y = exp(zbar/(1-rho_z))^(1-theta)*k^theta;
l = k/(((1-betta*(1-delta))/(betta*theta*(exp(zbar/(1-rho_z))^(1-theta))))^(1/(theta-1)));
end;
estimated_params;
eps_z_sigma, 0.0001, 0,10;
eps_g_sigma, 0.0001, 0,10;
% betta, 0.9722^(1/4)/(1+gz),0,1;
%corr eps_z, eps_g, 0.0001, -1,1;
end;
varobs ysim xsim;
identification(advanced=1);

View File

@ -0,0 +1,105 @@
% Real Business Cycle Model
close all;
%----------------------------------------------------------------
% 1. Defining variables
%----------------------------------------------------------------
var y c k l x z g ysim xsim;
varexo eps_z eps_g;
parameters gn gz betta delta psi sigma theta rho_z sig_z rho_g sig_g q12 zbar gbar;
%----------------------------------------------------------------
% 2. Calibration
%----------------------------------------------------------------
gn = 0.00243918275778010;
gz = 0.00499789993972673;
betta = 0.9722^(1/4)/(1+gz);
delta = 1-(1-0.0464)^(1/4);
psi = 2.24;
sigma = 1.000001;
theta = 0.35;
zbar = 0.0023;
gbar = -0.0382;
rho_z = 0.8;
sig_z = 0.0086;
rho_g = 0.8;
sig_g = 0.0248;
q12 = -0.0002;
%----------------------------------------------------------------
% 3. Model
%----------------------------------------------------------------
model;
% Intratemporal Optimality Condition
(psi*c)/(1-l) = (1-theta)*(k(-1)^theta)*(l^(-theta))*(exp(z)^(1-theta));
% Intertemporal Optimality Condition
(c^(-sigma))*((1-l)^(psi*(1-sigma))) = betta*((c(+1))^(-sigma))*((1-l(+1))^(psi*(1-sigma)))*(theta*(k^(theta-1))*((exp(z(+1))*l(+1))^(1-theta))+(1-delta));
% Aggregate Resource Constraint
y = c + exp(g) + x;
% Capital Accumulation Law
(1+gz)*(1+gn)*k = (1-delta)*k(-1) + x;
% Production Function
y = (k(-1)^theta)*((exp(z)*l)^(1-theta));
% Stochastic Processes
z = zbar + rho_z*z(-1) + eps_z;
g = gbar + rho_g*g(-1) + eps_g;
ysim = y;
xsim = x;
end;
%----------------------------------------------------------------
% 4. Computation
%----------------------------------------------------------------
shocks;
var eps_z ; stderr sig_z;
var eps_g ; stderr sig_g;
end;
initval;
z = 0;
k = (betta*theta)^(1/(1-theta))*exp(zbar/(1-rho_z));
c = (1-betta*theta)/(betta*theta)*k;
y = exp(zbar/(1-rho_z))^(1-theta)*k^theta;
l = k/(((1-betta*(1-delta))/(betta*theta*(exp(zbar/(1-rho_z))^(1-theta))))^(1/(theta-1)));
end;
estimated_params;
stderr eps_z, 0.0001, 0,10;
stderr eps_g, 0.0001, 0,10;
% betta, 0.9,0,1;
%corr eps_z, eps_g, 0.0001, -1,1;
end;
varobs ysim xsim;
identification(advanced=1);
temp=load([M_.dname filesep 'identification' filesep M_.fname '_ML_Starting_value_identif'])
temp_comparison=load(['rbc_ident_std_as_structural_par' filesep 'identification' filesep 'rbc_ident_std_as_structural_par' '_ML_Starting_value_identif'])
if max(abs(temp.idehess_point.ide_strength_J - temp_comparison.idehess_point.ide_strength_J))>1e-8 ||...
max(abs(temp.idehess_point.deltaM - temp_comparison.idehess_point.deltaM))>1e-8 ||...
max(abs(temp.idemoments_point.GAM- temp.idemoments_point.GAM))>1e-8 ||...
max(abs(temp.idemoments_point.GAM- temp.idemoments_point.GAM))>1e-8
error('Results do not match')
end