get_perturbation_params_derivs and friends: do not pass full oo_ structure
parent
e65662151f
commit
acb9518dec
|
@ -151,7 +151,7 @@ if strcmp(options_mom_.mom.mom_method,'GMM')
|
||||||
stderrparam_nbr = estim_params_.nvx; % number of stderr parameters
|
stderrparam_nbr = estim_params_.nvx; % number of stderr parameters
|
||||||
corrparam_nbr = estim_params_.ncx; % number of corr parameters
|
corrparam_nbr = estim_params_.ncx; % number of corr parameters
|
||||||
totparam_nbr = stderrparam_nbr+corrparam_nbr+modparam_nbr;
|
totparam_nbr = stderrparam_nbr+corrparam_nbr+modparam_nbr;
|
||||||
oo_.dr.derivs = get_perturbation_params_derivs(M_, options_mom_, estim_params_, oo_, indpmodel, indpstderr, indpcorr, 0); %analytic derivatives of perturbation matrices
|
oo_.dr.derivs = get_perturbation_params_derivs(M_, options_mom_, estim_params_, oo_.dr, oo_.steady_state, oo_.exo_steady_state, oo_.exo_det_steady_state, indpmodel, indpstderr, indpcorr, 0); %analytic derivatives of perturbation matrices
|
||||||
oo_.mom.model_moments_params_derivs = NaN(options_mom_.mom.mom_nbr,totparam_nbr);
|
oo_.mom.model_moments_params_derivs = NaN(options_mom_.mom.mom_nbr,totparam_nbr);
|
||||||
pruned_state_space = pruned_state_space_system(M_, options_mom_, oo_.dr, oo_.mom.obs_var, options_mom_.ar, 0, 1);
|
pruned_state_space = pruned_state_space_system(M_, options_mom_, oo_.dr, oo_.mom.obs_var, options_mom_.ar, 0, 1);
|
||||||
else
|
else
|
||||||
|
|
|
@ -64,7 +64,7 @@ if ~options_.analytic_derivation
|
||||||
loss = full(weights(:)'*vx(:));
|
loss = full(weights(:)'*vx(:));
|
||||||
else
|
else
|
||||||
totparam_nbr=length(i_params);
|
totparam_nbr=length(i_params);
|
||||||
oo_.dr.derivs = get_perturbation_params_derivs(M_, options_, [], oo_, i_params, [], [], 0); %analytic derivatives of perturbation matrices
|
oo_.dr.derivs = get_perturbation_params_derivs(M_, options_, [], oo_.dr, oo_.steady_state, oo_.exo_steady_state, oo_.exo_det_steady_state, i_params, [], [], 0); %analytic derivatives of perturbation matrices
|
||||||
|
|
||||||
pruned_state_space = pruned_state_space_system(M_, options_, oo_.dr, i_var, 0, 0, 1);
|
pruned_state_space = pruned_state_space_system(M_, options_, oo_.dr, i_var, 0, 0, 1);
|
||||||
vx = pruned_state_space.Var_y + pruned_state_space.E_y*pruned_state_space.E_y';
|
vx = pruned_state_space.Var_y + pruned_state_space.E_y*pruned_state_space.E_y';
|
||||||
|
|
|
@ -560,14 +560,14 @@ if analytic_derivation
|
||||||
old_analytic_derivation_mode = DynareOptions.analytic_derivation_mode;
|
old_analytic_derivation_mode = DynareOptions.analytic_derivation_mode;
|
||||||
DynareOptions.analytic_derivation_mode = kron_flag;
|
DynareOptions.analytic_derivation_mode = kron_flag;
|
||||||
if full_Hess
|
if full_Hess
|
||||||
DERIVS = get_perturbation_params_derivs(Model, DynareOptions, EstimatedParameters, DynareResults, indparam, indexo, [], true);
|
DERIVS = get_perturbation_params_derivs(Model, DynareOptions, EstimatedParameters, DynareResults.dr, DynareResults.steady_state, DynareResults.exo_steady_state, DynareResults.exo_det_steady_state, indparam, indexo, [], true);
|
||||||
indD2T = reshape(1:Model.endo_nbr^2, Model.endo_nbr, Model.endo_nbr);
|
indD2T = reshape(1:Model.endo_nbr^2, Model.endo_nbr, Model.endo_nbr);
|
||||||
indD2Om = dyn_unvech(1:Model.endo_nbr*(Model.endo_nbr+1)/2);
|
indD2Om = dyn_unvech(1:Model.endo_nbr*(Model.endo_nbr+1)/2);
|
||||||
D2T = DERIVS.d2KalmanA(indD2T(iv,iv),:);
|
D2T = DERIVS.d2KalmanA(indD2T(iv,iv),:);
|
||||||
D2Om = DERIVS.d2Om(dyn_vech(indD2Om(iv,iv)),:);
|
D2Om = DERIVS.d2Om(dyn_vech(indD2Om(iv,iv)),:);
|
||||||
D2Yss = DERIVS.d2Yss(iv,:,:);
|
D2Yss = DERIVS.d2Yss(iv,:,:);
|
||||||
else
|
else
|
||||||
DERIVS = get_perturbation_params_derivs(Model, DynareOptions, EstimatedParameters, DynareResults, indparam, indexo, [], false);
|
DERIVS = get_perturbation_params_derivs(Model, DynareOptions, EstimatedParameters, DynareResults.dr, DynareResults.steady_state, DynareResults.exo_steady_state, DynareResults.exo_det_steady_state, indparam, indexo, [], false);
|
||||||
end
|
end
|
||||||
DT = zeros(Model.endo_nbr, Model.endo_nbr, size(DERIVS.dghx,3));
|
DT = zeros(Model.endo_nbr, Model.endo_nbr, size(DERIVS.dghx,3));
|
||||||
DT(:,Model.nstatic+(1:Model.nspred),:) = DERIVS.dghx;
|
DT(:,Model.nstatic+(1:Model.nspred),:) = DERIVS.dghx;
|
||||||
|
|
|
@ -10,7 +10,7 @@ function fjac = fjaco(f,x,varargin)
|
||||||
% OUTPUT
|
% OUTPUT
|
||||||
% fjac : finite difference Jacobian
|
% fjac : finite difference Jacobian
|
||||||
%
|
%
|
||||||
% Copyright © 2010-2017,2019-2020 Dynare Team
|
% Copyright © 2010-2017,2019-2023 Dynare Team
|
||||||
%
|
%
|
||||||
% This file is part of Dynare.
|
% This file is part of Dynare.
|
||||||
%
|
%
|
||||||
|
@ -31,7 +31,7 @@ ff=feval(f,x,varargin{:});
|
||||||
|
|
||||||
tol = eps.^(1/3); %some default value
|
tol = eps.^(1/3); %some default value
|
||||||
if strcmp(func2str(f),'get_perturbation_params_derivs_numerical_objective') || strcmp(func2str(f),'identification_numerical_objective')
|
if strcmp(func2str(f),'get_perturbation_params_derivs_numerical_objective') || strcmp(func2str(f),'identification_numerical_objective')
|
||||||
tol= varargin{5}.dynatol.x;
|
tol= varargin{4}.dynatol.x;
|
||||||
end
|
end
|
||||||
h = tol.*max(abs(x),1);
|
h = tol.*max(abs(x),1);
|
||||||
xh1=x+h; xh0=x-h;
|
xh1=x+h; xh0=x-h;
|
||||||
|
@ -57,9 +57,9 @@ feval(f,x,varargin{:});
|
||||||
%Auxiliary functions
|
%Auxiliary functions
|
||||||
function disp_info_error_identification_perturbation(info,j)
|
function disp_info_error_identification_perturbation(info,j)
|
||||||
% there are errors in the solution algorithm
|
% there are errors in the solution algorithm
|
||||||
probl_par = get_the_name(j,varargin{5}.TeX,varargin{3},varargin{2},varargin{5});
|
probl_par = get_the_name(j,varargin{4}.TeX,varargin{3},varargin{2},varargin{4});
|
||||||
skipline()
|
skipline()
|
||||||
message = get_error_message(info,varargin{5});
|
message = get_error_message(info,varargin{4});
|
||||||
fprintf('Parameter error in numerical two-sided difference method:\n')
|
fprintf('Parameter error in numerical two-sided difference method:\n')
|
||||||
fprintf('Cannot solve the model for %s (info = %d, %s)\n', probl_par, info(1), message);
|
fprintf('Cannot solve the model for %s (info = %d, %s)\n', probl_par, info(1), message);
|
||||||
fprintf('Possible solutions:\n')
|
fprintf('Possible solutions:\n')
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
function [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dSPECTRUM_NO_MEAN, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params, M, oo, options, options_ident, indpmodel, indpstderr, indpcorr, indvobs)
|
function [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dSPECTRUM_NO_MEAN, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params, M, options, options_ident, indpmodel, indpstderr, indpcorr, indvobs, dr, endo_steady_state, exo_steady_state, exo_det_steady_state)
|
||||||
% function [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params, M, oo, options, options_ident, indpmodel, indpstderr, indpcorr, indvobs)
|
% [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dSPECTRUM_NO_MEAN, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params, M, options, options_ident, indpmodel, indpstderr, indpcorr, indvobs, dr, endo_steady_state, exo_steady_state, exo_det_steady_state)
|
||||||
% previously getJJ.m in Dynare 4.5
|
% previously getJJ.m in Dynare 4.5
|
||||||
% Sets up the Jacobians needed for identification analysis
|
% Sets up the Jacobians needed for identification analysis
|
||||||
% =========================================================================
|
% =========================================================================
|
||||||
% INPUTS
|
% INPUTS
|
||||||
% estim_params: [structure] storing the estimation information
|
% estim_params: [structure] storing the estimation information
|
||||||
% M: [structure] storing the model information
|
% M: [structure] storing the model information
|
||||||
% oo: [structure] storing the reduced-form solution results
|
|
||||||
% options: [structure] storing the options
|
% options: [structure] storing the options
|
||||||
% options_ident: [structure] storing the options for identification
|
% options_ident: [structure] storing the options for identification
|
||||||
% indpmodel: [modparam_nbr by 1] index of estimated parameters in M_.params;
|
% indpmodel: [modparam_nbr by 1] index of estimated parameters in M_.params;
|
||||||
|
@ -22,6 +21,10 @@ function [MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dM
|
||||||
% in the estimated_params block; if estimated_params block
|
% in the estimated_params block; if estimated_params block
|
||||||
% is not available, then no corr parameters are selected
|
% is not available, then no corr parameters are selected
|
||||||
% indvobs: [obs_nbr by 1] index of observed (VAROBS) variables
|
% indvobs: [obs_nbr by 1] index of observed (VAROBS) variables
|
||||||
|
% dr [structure] Reduced form model.
|
||||||
|
% endo_steady_state [vector] steady state value for endogenous variables
|
||||||
|
% exo_steady_state [vector] steady state value for exogenous variables
|
||||||
|
% exo_det_steady_state [vector] steady state value for exogenous deterministic variables
|
||||||
% -------------------------------------------------------------------------
|
% -------------------------------------------------------------------------
|
||||||
% OUTPUTS
|
% OUTPUTS
|
||||||
%
|
%
|
||||||
|
@ -150,94 +153,94 @@ obs_nbr = length(indvobs);
|
||||||
d2flag = 0; % do not compute second parameter derivatives
|
d2flag = 0; % do not compute second parameter derivatives
|
||||||
|
|
||||||
% Get Jacobians (wrt selected params) of steady state, dynamic model derivatives and perturbation solution matrices for all endogenous variables
|
% Get Jacobians (wrt selected params) of steady state, dynamic model derivatives and perturbation solution matrices for all endogenous variables
|
||||||
oo.dr.derivs = get_perturbation_params_derivs(M, options, estim_params, oo, indpmodel, indpstderr, indpcorr, d2flag);
|
dr.derivs = get_perturbation_params_derivs(M, options, estim_params, dr, endo_steady_state, exo_steady_state, exo_det_steady_state, indpmodel, indpstderr, indpcorr, d2flag);
|
||||||
|
|
||||||
[I,~] = find(lead_lag_incidence'); %I is used to select nonzero columns of the Jacobian of endogenous variables in dynamic model files
|
[I,~] = find(lead_lag_incidence'); %I is used to select nonzero columns of the Jacobian of endogenous variables in dynamic model files
|
||||||
yy0 = oo.dr.ys(I); %steady state of dynamic (endogenous and auxiliary variables) in lead_lag_incidence order
|
yy0 = dr.ys(I); %steady state of dynamic (endogenous and auxiliary variables) in lead_lag_incidence order
|
||||||
Yss = oo.dr.ys(oo.dr.order_var); % steady state in DR order
|
Yss = dr.ys(dr.order_var); % steady state in DR order
|
||||||
if order == 1
|
if order == 1
|
||||||
[~, g1 ] = feval([fname,'.dynamic'], yy0, oo.exo_steady_state', params, oo.dr.ys, 1);
|
[~, g1 ] = feval([fname,'.dynamic'], yy0, exo_steady_state', params, dr.ys, 1);
|
||||||
%g1 is [endo_nbr by yy0ex0_nbr first derivative (wrt all dynamic variables) of dynamic model equations, i.e. df/dyy0ex0, rows are in declaration order, columns in lead_lag_incidence order
|
%g1 is [endo_nbr by yy0ex0_nbr first derivative (wrt all dynamic variables) of dynamic model equations, i.e. df/dyy0ex0, rows are in declaration order, columns in lead_lag_incidence order
|
||||||
DYNAMIC = [Yss;
|
DYNAMIC = [Yss;
|
||||||
vec(g1)]; %add steady state and put rows of g1 in DR order
|
vec(g1)]; %add steady state and put rows of g1 in DR order
|
||||||
dDYNAMIC = [oo.dr.derivs.dYss;
|
dDYNAMIC = [dr.derivs.dYss;
|
||||||
reshape(oo.dr.derivs.dg1,size(oo.dr.derivs.dg1,1)*size(oo.dr.derivs.dg1,2),size(oo.dr.derivs.dg1,3)) ]; %reshape dg1 in DR order and add steady state
|
reshape(dr.derivs.dg1,size(dr.derivs.dg1,1)*size(dr.derivs.dg1,2),size(dr.derivs.dg1,3)) ]; %reshape dg1 in DR order and add steady state
|
||||||
REDUCEDFORM = [Yss;
|
REDUCEDFORM = [Yss;
|
||||||
vec(oo.dr.ghx);
|
vec(dr.ghx);
|
||||||
dyn_vech(oo.dr.ghu*Sigma_e*transpose(oo.dr.ghu))]; %in DR order
|
dyn_vech(dr.ghu*Sigma_e*transpose(dr.ghu))]; %in DR order
|
||||||
dREDUCEDFORM = zeros(endo_nbr*nspred+endo_nbr*(endo_nbr+1)/2, totparam_nbr);
|
dREDUCEDFORM = zeros(endo_nbr*nspred+endo_nbr*(endo_nbr+1)/2, totparam_nbr);
|
||||||
for j=1:totparam_nbr
|
for j=1:totparam_nbr
|
||||||
dREDUCEDFORM(:,j) = [vec(oo.dr.derivs.dghx(:,:,j));
|
dREDUCEDFORM(:,j) = [vec(dr.derivs.dghx(:,:,j));
|
||||||
dyn_vech(oo.dr.derivs.dOm(:,:,j))];
|
dyn_vech(dr.derivs.dOm(:,:,j))];
|
||||||
end
|
end
|
||||||
dREDUCEDFORM = [ [zeros(endo_nbr, stderrparam_nbr+corrparam_nbr) oo.dr.derivs.dYss]; dREDUCEDFORM ]; % add steady state
|
dREDUCEDFORM = [ [zeros(endo_nbr, stderrparam_nbr+corrparam_nbr) dr.derivs.dYss]; dREDUCEDFORM ]; % add steady state
|
||||||
|
|
||||||
elseif order == 2
|
elseif order == 2
|
||||||
[~, g1, g2 ] = feval([fname,'.dynamic'], yy0, oo.exo_steady_state', params, oo.dr.ys, 1);
|
[~, g1, g2 ] = feval([fname,'.dynamic'], yy0, exo_steady_state', params, dr.ys, 1);
|
||||||
%g1 is [endo_nbr by yy0ex0_nbr first derivative (wrt all dynamic variables) of dynamic model equations, i.e. df/dyy0ex0, rows are in declaration order, columns in lead_lag_incidence order
|
%g1 is [endo_nbr by yy0ex0_nbr first derivative (wrt all dynamic variables) of dynamic model equations, i.e. df/dyy0ex0, rows are in declaration order, columns in lead_lag_incidence order
|
||||||
%g2 is [endo_nbr by yy0ex0_nbr^2] second derivative (wrt all dynamic variables) of dynamic model equations, i.e. d(df/dyy0ex0)/dyy0ex0, rows are in declaration order, columns in lead_lag_incidence order
|
%g2 is [endo_nbr by yy0ex0_nbr^2] second derivative (wrt all dynamic variables) of dynamic model equations, i.e. d(df/dyy0ex0)/dyy0ex0, rows are in declaration order, columns in lead_lag_incidence order
|
||||||
DYNAMIC = [Yss;
|
DYNAMIC = [Yss;
|
||||||
vec(g1);
|
vec(g1);
|
||||||
vec(g2)]; %add steady state and put rows of g1 and g2 in DR order
|
vec(g2)]; %add steady state and put rows of g1 and g2 in DR order
|
||||||
dDYNAMIC = [oo.dr.derivs.dYss;
|
dDYNAMIC = [dr.derivs.dYss;
|
||||||
reshape(oo.dr.derivs.dg1,size(oo.dr.derivs.dg1,1)*size(oo.dr.derivs.dg1,2),size(oo.dr.derivs.dg1,3)); %reshape dg1 in DR order
|
reshape(dr.derivs.dg1,size(dr.derivs.dg1,1)*size(dr.derivs.dg1,2),size(dr.derivs.dg1,3)); %reshape dg1 in DR order
|
||||||
reshape(oo.dr.derivs.dg2,size(oo.dr.derivs.dg1,1)*size(oo.dr.derivs.dg1,2)^2,size(oo.dr.derivs.dg1,3))]; %reshape dg2 in DR order
|
reshape(dr.derivs.dg2,size(dr.derivs.dg1,1)*size(dr.derivs.dg1,2)^2,size(dr.derivs.dg1,3))]; %reshape dg2 in DR order
|
||||||
REDUCEDFORM = [Yss;
|
REDUCEDFORM = [Yss;
|
||||||
vec(oo.dr.ghx);
|
vec(dr.ghx);
|
||||||
dyn_vech(oo.dr.ghu*Sigma_e*transpose(oo.dr.ghu));
|
dyn_vech(dr.ghu*Sigma_e*transpose(dr.ghu));
|
||||||
vec(oo.dr.ghxx);
|
vec(dr.ghxx);
|
||||||
vec(oo.dr.ghxu);
|
vec(dr.ghxu);
|
||||||
vec(oo.dr.ghuu);
|
vec(dr.ghuu);
|
||||||
vec(oo.dr.ghs2)]; %in DR order
|
vec(dr.ghs2)]; %in DR order
|
||||||
dREDUCEDFORM = zeros(endo_nbr*nspred+endo_nbr*(endo_nbr+1)/2+endo_nbr*nspred^2+endo_nbr*nspred*exo_nbr+endo_nbr*exo_nbr^2+endo_nbr, totparam_nbr);
|
dREDUCEDFORM = zeros(endo_nbr*nspred+endo_nbr*(endo_nbr+1)/2+endo_nbr*nspred^2+endo_nbr*nspred*exo_nbr+endo_nbr*exo_nbr^2+endo_nbr, totparam_nbr);
|
||||||
for j=1:totparam_nbr
|
for j=1:totparam_nbr
|
||||||
dREDUCEDFORM(:,j) = [vec(oo.dr.derivs.dghx(:,:,j));
|
dREDUCEDFORM(:,j) = [vec(dr.derivs.dghx(:,:,j));
|
||||||
dyn_vech(oo.dr.derivs.dOm(:,:,j));
|
dyn_vech(dr.derivs.dOm(:,:,j));
|
||||||
vec(oo.dr.derivs.dghxx(:,:,j));
|
vec(dr.derivs.dghxx(:,:,j));
|
||||||
vec(oo.dr.derivs.dghxu(:,:,j));
|
vec(dr.derivs.dghxu(:,:,j));
|
||||||
vec(oo.dr.derivs.dghuu(:,:,j));
|
vec(dr.derivs.dghuu(:,:,j));
|
||||||
vec(oo.dr.derivs.dghs2(:,j))];
|
vec(dr.derivs.dghs2(:,j))];
|
||||||
end
|
end
|
||||||
dREDUCEDFORM = [ [zeros(endo_nbr, stderrparam_nbr+corrparam_nbr) oo.dr.derivs.dYss]; dREDUCEDFORM ]; % add steady state
|
dREDUCEDFORM = [ [zeros(endo_nbr, stderrparam_nbr+corrparam_nbr) dr.derivs.dYss]; dREDUCEDFORM ]; % add steady state
|
||||||
elseif order == 3
|
elseif order == 3
|
||||||
[~, g1, g2, g3 ] = feval([fname,'.dynamic'], yy0, oo.exo_steady_state', params, oo.dr.ys, 1);
|
[~, g1, g2, g3 ] = feval([fname,'.dynamic'], yy0, exo_steady_state', params, dr.ys, 1);
|
||||||
%g1 is [endo_nbr by yy0ex0_nbr first derivative (wrt all dynamic variables) of dynamic model equations, i.e. df/dyy0ex0, rows are in declaration order, columns in lead_lag_incidence order
|
%g1 is [endo_nbr by yy0ex0_nbr first derivative (wrt all dynamic variables) of dynamic model equations, i.e. df/dyy0ex0, rows are in declaration order, columns in lead_lag_incidence order
|
||||||
%g2 is [endo_nbr by yy0ex0_nbr^2] second derivative (wrt all dynamic variables) of dynamic model equations, i.e. d(df/dyy0ex0)/dyy0ex0, rows are in declaration order, columns in lead_lag_incidence order
|
%g2 is [endo_nbr by yy0ex0_nbr^2] second derivative (wrt all dynamic variables) of dynamic model equations, i.e. d(df/dyy0ex0)/dyy0ex0, rows are in declaration order, columns in lead_lag_incidence order
|
||||||
DYNAMIC = [Yss;
|
DYNAMIC = [Yss;
|
||||||
vec(g1);
|
vec(g1);
|
||||||
vec(g2);
|
vec(g2);
|
||||||
vec(g3)]; %add steady state and put rows of g1 and g2 in DR order
|
vec(g3)]; %add steady state and put rows of g1 and g2 in DR order
|
||||||
dDYNAMIC = [oo.dr.derivs.dYss;
|
dDYNAMIC = [dr.derivs.dYss;
|
||||||
reshape(oo.dr.derivs.dg1,size(oo.dr.derivs.dg1,1)*size(oo.dr.derivs.dg1,2),size(oo.dr.derivs.dg1,3)); %reshape dg1 in DR order
|
reshape(dr.derivs.dg1,size(dr.derivs.dg1,1)*size(dr.derivs.dg1,2),size(dr.derivs.dg1,3)); %reshape dg1 in DR order
|
||||||
reshape(oo.dr.derivs.dg2,size(oo.dr.derivs.dg1,1)*size(oo.dr.derivs.dg1,2)^2,size(oo.dr.derivs.dg1,3));
|
reshape(dr.derivs.dg2,size(dr.derivs.dg1,1)*size(dr.derivs.dg1,2)^2,size(dr.derivs.dg1,3));
|
||||||
reshape(oo.dr.derivs.dg2,size(oo.dr.derivs.dg1,1)*size(oo.dr.derivs.dg1,2)^2,size(oo.dr.derivs.dg1,3))]; %reshape dg3 in DR order
|
reshape(dr.derivs.dg2,size(dr.derivs.dg1,1)*size(dr.derivs.dg1,2)^2,size(dr.derivs.dg1,3))]; %reshape dg3 in DR order
|
||||||
REDUCEDFORM = [Yss;
|
REDUCEDFORM = [Yss;
|
||||||
vec(oo.dr.ghx);
|
vec(dr.ghx);
|
||||||
dyn_vech(oo.dr.ghu*Sigma_e*transpose(oo.dr.ghu));
|
dyn_vech(dr.ghu*Sigma_e*transpose(dr.ghu));
|
||||||
vec(oo.dr.ghxx); vec(oo.dr.ghxu); vec(oo.dr.ghuu); vec(oo.dr.ghs2);
|
vec(dr.ghxx); vec(dr.ghxu); vec(dr.ghuu); vec(dr.ghs2);
|
||||||
vec(oo.dr.ghxxx); vec(oo.dr.ghxxu); vec(oo.dr.ghxuu); vec(oo.dr.ghuuu); vec(oo.dr.ghxss); vec(oo.dr.ghuss)]; %in DR order
|
vec(dr.ghxxx); vec(dr.ghxxu); vec(dr.ghxuu); vec(dr.ghuuu); vec(dr.ghxss); vec(dr.ghuss)]; %in DR order
|
||||||
dREDUCEDFORM = zeros(size(REDUCEDFORM,1)-endo_nbr, totparam_nbr);
|
dREDUCEDFORM = zeros(size(REDUCEDFORM,1)-endo_nbr, totparam_nbr);
|
||||||
for j=1:totparam_nbr
|
for j=1:totparam_nbr
|
||||||
dREDUCEDFORM(:,j) = [vec(oo.dr.derivs.dghx(:,:,j));
|
dREDUCEDFORM(:,j) = [vec(dr.derivs.dghx(:,:,j));
|
||||||
dyn_vech(oo.dr.derivs.dOm(:,:,j));
|
dyn_vech(dr.derivs.dOm(:,:,j));
|
||||||
vec(oo.dr.derivs.dghxx(:,:,j)); vec(oo.dr.derivs.dghxu(:,:,j)); vec(oo.dr.derivs.dghuu(:,:,j)); vec(oo.dr.derivs.dghs2(:,j))
|
vec(dr.derivs.dghxx(:,:,j)); vec(dr.derivs.dghxu(:,:,j)); vec(dr.derivs.dghuu(:,:,j)); vec(dr.derivs.dghs2(:,j))
|
||||||
vec(oo.dr.derivs.dghxxx(:,:,j)); vec(oo.dr.derivs.dghxxu(:,:,j)); vec(oo.dr.derivs.dghxuu(:,:,j)); vec(oo.dr.derivs.dghuuu(:,:,j)); vec(oo.dr.derivs.dghxss(:,:,j)); vec(oo.dr.derivs.dghuss(:,:,j))];
|
vec(dr.derivs.dghxxx(:,:,j)); vec(dr.derivs.dghxxu(:,:,j)); vec(dr.derivs.dghxuu(:,:,j)); vec(dr.derivs.dghuuu(:,:,j)); vec(dr.derivs.dghxss(:,:,j)); vec(dr.derivs.dghuss(:,:,j))];
|
||||||
end
|
end
|
||||||
dREDUCEDFORM = [ [zeros(endo_nbr, stderrparam_nbr+corrparam_nbr) oo.dr.derivs.dYss]; dREDUCEDFORM ]; % add steady state
|
dREDUCEDFORM = [ [zeros(endo_nbr, stderrparam_nbr+corrparam_nbr) dr.derivs.dYss]; dREDUCEDFORM ]; % add steady state
|
||||||
end
|
end
|
||||||
|
|
||||||
% Get (pruned) state space representation:
|
% Get (pruned) state space representation:
|
||||||
pruned = pruned_state_space_system(M, options, oo.dr, indvobs, nlags, useautocorr, 1);
|
pruned = pruned_state_space_system(M, options, dr, indvobs, nlags, useautocorr, 1);
|
||||||
MEAN = pruned.E_y;
|
MEAN = pruned.E_y;
|
||||||
dMEAN = pruned.dE_y;
|
dMEAN = pruned.dE_y;
|
||||||
%storage for Jacobians used in dsge_likelihood.m for analytical Gradient and Hession of likelihood (only at order=1)
|
%storage for Jacobians used in dsge_likelihood.m for analytical Gradient and Hession of likelihood (only at order=1)
|
||||||
derivatives_info = struct();
|
derivatives_info = struct();
|
||||||
if order == 1
|
if order == 1
|
||||||
dT = zeros(endo_nbr,endo_nbr,totparam_nbr);
|
dT = zeros(endo_nbr,endo_nbr,totparam_nbr);
|
||||||
dT(:,(nstatic+1):(nstatic+nspred),:) = oo.dr.derivs.dghx;
|
dT(:,(nstatic+1):(nstatic+nspred),:) = dr.derivs.dghx;
|
||||||
derivatives_info.DT = dT;
|
derivatives_info.DT = dT;
|
||||||
derivatives_info.DOm = oo.dr.derivs.dOm;
|
derivatives_info.DOm = dr.derivs.dOm;
|
||||||
derivatives_info.DYss = oo.dr.derivs.dYss;
|
derivatives_info.DYss = dr.derivs.dYss;
|
||||||
end
|
end
|
||||||
|
|
||||||
%% Compute dMOMENTS
|
%% Compute dMOMENTS
|
||||||
|
@ -255,7 +258,7 @@ if ~no_identification_moments
|
||||||
|
|
||||||
if kronflag == -1
|
if kronflag == -1
|
||||||
%numerical derivative of autocovariogram
|
%numerical derivative of autocovariogram
|
||||||
dMOMENTS = fjaco(str2func('identification_numerical_objective'), xparam1, 1, estim_params, M, oo, options, indpmodel, indpstderr, indpcorr, indvobs, useautocorr, nlags, grid_nbr); %[outputflag=1]
|
dMOMENTS = fjaco(str2func('identification_numerical_objective'), xparam1, 1, estim_params, M, options, indpmodel, indpstderr, indvobs, useautocorr, nlags, grid_nbr, dr, endo_steady_state, exo_steady_state, exo_det_steady_state); %[outputflag=1]
|
||||||
dMOMENTS = [dMEAN; dMOMENTS]; %add Jacobian of steady state of VAROBS variables
|
dMOMENTS = [dMEAN; dMOMENTS]; %add Jacobian of steady state of VAROBS variables
|
||||||
else
|
else
|
||||||
dMOMENTS = zeros(obs_nbr + obs_nbr*(obs_nbr+1)/2 + nlags*obs_nbr^2 , totparam_nbr);
|
dMOMENTS = zeros(obs_nbr + obs_nbr*(obs_nbr+1)/2 + nlags*obs_nbr^2 , totparam_nbr);
|
||||||
|
@ -312,7 +315,7 @@ if ~no_identification_spectrum
|
||||||
IA = eye(size(pruned.A,1));
|
IA = eye(size(pruned.A,1));
|
||||||
if kronflag == -1
|
if kronflag == -1
|
||||||
%numerical derivative of spectral density
|
%numerical derivative of spectral density
|
||||||
dOmega_tmp = fjaco(str2func('identification_numerical_objective'), xparam1, 2, estim_params, M, oo, options, indpmodel, indpstderr, indpcorr, indvobs, useautocorr, nlags, grid_nbr); %[outputflag=2]
|
dOmega_tmp = fjaco(str2func('identification_numerical_objective'), xparam1, 2, estim_params, M, options, indpmodel, indpstderr, indvobs, useautocorr, nlags, grid_nbr, dr, endo_steady_state, exo_steady_state, exo_det_steady_state); %[outputflag=2]
|
||||||
kk = 0;
|
kk = 0;
|
||||||
for ig = 1:length(freqs)
|
for ig = 1:length(freqs)
|
||||||
kk = kk+1;
|
kk = kk+1;
|
||||||
|
@ -389,14 +392,14 @@ if ~no_identification_minimal
|
||||||
dMINIMAL = [];
|
dMINIMAL = [];
|
||||||
else
|
else
|
||||||
% Derive and check minimal state vector of first-order
|
% Derive and check minimal state vector of first-order
|
||||||
SYS.A = oo.dr.ghx(pruned.indx,:);
|
SYS.A = dr.ghx(pruned.indx,:);
|
||||||
SYS.dA = oo.dr.derivs.dghx(pruned.indx,:,:);
|
SYS.dA = dr.derivs.dghx(pruned.indx,:,:);
|
||||||
SYS.B = oo.dr.ghu(pruned.indx,:);
|
SYS.B = dr.ghu(pruned.indx,:);
|
||||||
SYS.dB = oo.dr.derivs.dghu(pruned.indx,:,:);
|
SYS.dB = dr.derivs.dghu(pruned.indx,:,:);
|
||||||
SYS.C = oo.dr.ghx(pruned.indy,:);
|
SYS.C = dr.ghx(pruned.indy,:);
|
||||||
SYS.dC = oo.dr.derivs.dghx(pruned.indy,:,:);
|
SYS.dC = dr.derivs.dghx(pruned.indy,:,:);
|
||||||
SYS.D = oo.dr.ghu(pruned.indy,:);
|
SYS.D = dr.ghu(pruned.indy,:);
|
||||||
SYS.dD = oo.dr.derivs.dghu(pruned.indy,:,:);
|
SYS.dD = dr.derivs.dghu(pruned.indy,:,:);
|
||||||
[CheckCO,minnx,SYS] = get_minimal_state_representation(SYS,1);
|
[CheckCO,minnx,SYS] = get_minimal_state_representation(SYS,1);
|
||||||
|
|
||||||
if CheckCO == 0
|
if CheckCO == 0
|
||||||
|
@ -415,7 +418,7 @@ if ~no_identification_minimal
|
||||||
dminB = reshape(dminB,size(dminB,1)*size(dminB,2),size(dminB,3));
|
dminB = reshape(dminB,size(dminB,1)*size(dminB,2),size(dminB,3));
|
||||||
dminC = reshape(dminC,size(dminC,1)*size(dminC,2),size(dminC,3));
|
dminC = reshape(dminC,size(dminC,1)*size(dminC,2),size(dminC,3));
|
||||||
dminD = reshape(dminD,size(dminD,1)*size(dminD,2),size(dminD,3));
|
dminD = reshape(dminD,size(dminD,1)*size(dminD,2),size(dminD,3));
|
||||||
dvechSig = reshape(oo.dr.derivs.dSigma_e,exo_nbr*exo_nbr,totparam_nbr);
|
dvechSig = reshape(dr.derivs.dSigma_e,exo_nbr*exo_nbr,totparam_nbr);
|
||||||
indvechSig= find(tril(ones(exo_nbr,exo_nbr)));
|
indvechSig= find(tril(ones(exo_nbr,exo_nbr)));
|
||||||
dvechSig = dvechSig(indvechSig,:);
|
dvechSig = dvechSig(indvechSig,:);
|
||||||
Inx = eye(minnx);
|
Inx = eye(minnx);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
function DERIVS = get_perturbation_params_derivs(M, options, estim_params, oo, indpmodel, indpstderr, indpcorr, d2flag)
|
function DERIVS = get_perturbation_params_derivs(M, options, estim_params, dr, endo_steady_state, exo_steady_state, exo_det_steady_state, indpmodel, indpstderr, indpcorr, d2flag)
|
||||||
% DERIVS = get_perturbation_params_derivs(M, options, estim_params, oo, indpmodel, indpstderr, indpcorr, d2flag)
|
% DERIVS = get_perturbation_params_derivs(M, options, estim_params, dr, endo_steady_state, exo_steady_state, exo_det_steady_state, indpmodel, indpstderr, indpcorr, d2flag)
|
||||||
% previously getH.m in dynare 4.5
|
% previously getH.m in dynare 4.5
|
||||||
% -------------------------------------------------------------------------
|
% -------------------------------------------------------------------------
|
||||||
% Computes derivatives (with respect to parameters) of
|
% Computes derivatives (with respect to parameters) of
|
||||||
|
@ -16,17 +16,24 @@ function DERIVS = get_perturbation_params_derivs(M, options, estim_params, oo, i
|
||||||
%
|
%
|
||||||
% =========================================================================
|
% =========================================================================
|
||||||
% INPUTS
|
% INPUTS
|
||||||
% M: [structure] storing the model information
|
% M: [structure] storing the model information
|
||||||
% options: [structure] storing the options
|
% options: [structure] storing the options
|
||||||
% estim_params: [structure] storing the estimation information
|
% estim_params: [structure] storing the estimation information
|
||||||
% oo: [structure] storing the solution results
|
% dr [structure] Reduced form model.
|
||||||
% indpmodel: [modparam_nbr by 1] index of selected (estimated) parameters in M.params;
|
% endo_steady_state [vector] steady state value for endogenous variables
|
||||||
% corresponds to model parameters (no stderr and no corr) in estimated_params block
|
% exo_steady_state [vector] steady state value for exogenous variables
|
||||||
% indpstderr: [stderrparam_nbr by 1] index of selected (estimated) standard errors,
|
% exo_det_steady_state [vector] steady state value for exogenous deterministic variables
|
||||||
% i.e. for all exogenous variables where 'stderr' is given in the estimated_params block
|
% indpmodel: [modparam_nbr by 1] index of selected (estimated) parameters in M.params;
|
||||||
% indpcorr: [corrparam_nbr by 2] matrix of selected (estimated) correlations,
|
% corresponds to model parameters (no stderr and no corr)
|
||||||
% i.e. for all exogenous variables where 'corr' is given in the estimated_params block
|
% in estimated_params block
|
||||||
% d2flag: [boolean] flag to compute second-order parameter derivatives of steady state and first-order Kalman transition matrices
|
% indpstderr: [stderrparam_nbr by 1] index of selected (estimated) standard errors,
|
||||||
|
% i.e. for all exogenous variables where 'stderr' is given
|
||||||
|
% in the estimated_params block
|
||||||
|
% indpcorr: [corrparam_nbr by 2] matrix of selected (estimated) correlations,
|
||||||
|
% i.e. for all exogenous variables where 'corr' is given in
|
||||||
|
% the estimated_params block
|
||||||
|
% d2flag: [boolean] flag to compute second-order parameter derivatives of steady state
|
||||||
|
% and first-order Kalman transition matrices
|
||||||
% -------------------------------------------------------------------------
|
% -------------------------------------------------------------------------
|
||||||
% OUTPUTS
|
% OUTPUTS
|
||||||
% DERIVS: Structure with the following fields:
|
% DERIVS: Structure with the following fields:
|
||||||
|
@ -154,26 +161,25 @@ end
|
||||||
qz_criterium = options.qz_criterium;
|
qz_criterium = options.qz_criterium;
|
||||||
threads_BC = options.threads.kronecker.sparse_hessian_times_B_kronecker_C;
|
threads_BC = options.threads.kronecker.sparse_hessian_times_B_kronecker_C;
|
||||||
|
|
||||||
% Get fields from oo
|
% Get fields from dr
|
||||||
exo_steady_state = oo.exo_steady_state;
|
ghx = dr.ghx;
|
||||||
ghx = oo.dr.ghx;
|
ghu = dr.ghu;
|
||||||
ghu = oo.dr.ghu;
|
|
||||||
if order > 1
|
if order > 1
|
||||||
ghxx = oo.dr.ghxx;
|
ghxx = dr.ghxx;
|
||||||
ghxu = oo.dr.ghxu;
|
ghxu = dr.ghxu;
|
||||||
ghuu = oo.dr.ghuu;
|
ghuu = dr.ghuu;
|
||||||
ghs2 = oo.dr.ghs2;
|
ghs2 = dr.ghs2;
|
||||||
end
|
end
|
||||||
if order > 2
|
if order > 2
|
||||||
ghxxx = oo.dr.ghxxx;
|
ghxxx = dr.ghxxx;
|
||||||
ghxxu = oo.dr.ghxxu;
|
ghxxu = dr.ghxxu;
|
||||||
ghxuu = oo.dr.ghxuu;
|
ghxuu = dr.ghxuu;
|
||||||
ghuuu = oo.dr.ghuuu;
|
ghuuu = dr.ghuuu;
|
||||||
ghxss = oo.dr.ghxss;
|
ghxss = dr.ghxss;
|
||||||
ghuss = oo.dr.ghuss;
|
ghuss = dr.ghuss;
|
||||||
end
|
end
|
||||||
order_var = oo.dr.order_var;
|
order_var = dr.order_var;
|
||||||
ys = oo.dr.ys;
|
ys = dr.ys;
|
||||||
|
|
||||||
% Some checks
|
% Some checks
|
||||||
if exo_det_nbr > 0
|
if exo_det_nbr > 0
|
||||||
|
@ -289,7 +295,7 @@ if analytic_derivation_mode == -1
|
||||||
% - perturbation solution matrices: dghx, dghu, dghxx, dghxu, dghuu, dghs2, dghxxx, dghxxu, dghxuu, dghuuu, dghxss, dghuss
|
% - perturbation solution matrices: dghx, dghu, dghxx, dghxu, dghuu, dghs2, dghxxx, dghxxu, dghxuu, dghuuu, dghxss, dghuss
|
||||||
|
|
||||||
%Parameter Jacobian of covariance matrix and solution matrices (wrt selected stderr, corr and model paramters)
|
%Parameter Jacobian of covariance matrix and solution matrices (wrt selected stderr, corr and model paramters)
|
||||||
dSig_gh = fjaco(numerical_objective_fname, xparam1, 'perturbation_solution', estim_params, M, oo, options);
|
dSig_gh = fjaco(numerical_objective_fname, xparam1, 'perturbation_solution', estim_params, M, options, dr, endo_steady_state, exo_steady_state, exo_det_steady_state);
|
||||||
ind_Sigma_e = (1:exo_nbr^2);
|
ind_Sigma_e = (1:exo_nbr^2);
|
||||||
ind_ghx = ind_Sigma_e(end) + (1:endo_nbr*nspred);
|
ind_ghx = ind_Sigma_e(end) + (1:endo_nbr*nspred);
|
||||||
ind_ghu = ind_ghx(end) + (1:endo_nbr*exo_nbr);
|
ind_ghu = ind_ghx(end) + (1:endo_nbr*exo_nbr);
|
||||||
|
@ -342,7 +348,7 @@ if analytic_derivation_mode == -1
|
||||||
end
|
end
|
||||||
|
|
||||||
%Parameter Jacobian of dynamic model derivatives (wrt selected model parameters only)
|
%Parameter Jacobian of dynamic model derivatives (wrt selected model parameters only)
|
||||||
dYss_g = fjaco(numerical_objective_fname, modparam1, 'dynamic_model', estim_params_model, M, oo, options);
|
dYss_g = fjaco(numerical_objective_fname, modparam1, 'dynamic_model', estim_params_model, M, options, dr, endo_steady_state, exo_steady_state, exo_det_steady_state);
|
||||||
ind_Yss = 1:endo_nbr;
|
ind_Yss = 1:endo_nbr;
|
||||||
if options.discretionary_policy || options.ramsey_policy
|
if options.discretionary_policy || options.ramsey_policy
|
||||||
ind_g1 = ind_Yss(end) + (1:M.eq_nbr*yy0ex0_nbr);
|
ind_g1 = ind_Yss(end) + (1:M.eq_nbr*yy0ex0_nbr);
|
||||||
|
@ -368,7 +374,7 @@ if analytic_derivation_mode == -1
|
||||||
% Hessian (wrt paramters) of steady state and first-order solution matrices ghx and Om
|
% Hessian (wrt paramters) of steady state and first-order solution matrices ghx and Om
|
||||||
% note that hessian_sparse.m (contrary to hessian.m) does not take symmetry into account, but focuses already on unique values
|
% note that hessian_sparse.m (contrary to hessian.m) does not take symmetry into account, but focuses already on unique values
|
||||||
options.order = 1; %make sure only first order
|
options.order = 1; %make sure only first order
|
||||||
d2Yss_KalmanA_Om = hessian_sparse(numerical_objective_fname, xparam1, gstep, 'Kalman_Transition', estim_params, M, oo, options);
|
d2Yss_KalmanA_Om = hessian_sparse(numerical_objective_fname, xparam1, gstep, 'Kalman_Transition', estim_params, M, options, dr, endo_steady_state, exo_steady_state, exo_det_steady_state);
|
||||||
options.order = order; %make sure to set back
|
options.order = order; %make sure to set back
|
||||||
ind_KalmanA = ind_Yss(end) + (1:endo_nbr^2);
|
ind_KalmanA = ind_Yss(end) + (1:endo_nbr^2);
|
||||||
DERIVS.d2KalmanA = d2Yss_KalmanA_Om(ind_KalmanA, indp2tottot2); %only unique elements
|
DERIVS.d2KalmanA = d2Yss_KalmanA_Om(ind_KalmanA, indp2tottot2); %only unique elements
|
||||||
|
@ -399,7 +405,7 @@ if analytic_derivation_mode == -2
|
||||||
% computation of d2Yss and d2g1
|
% computation of d2Yss and d2g1
|
||||||
% note that hessian_sparse does not take symmetry into account, i.e. compare hessian_sparse.m to hessian.m, but focuses already on unique values, which are duplicated below
|
% note that hessian_sparse does not take symmetry into account, i.e. compare hessian_sparse.m to hessian.m, but focuses already on unique values, which are duplicated below
|
||||||
options.order = 1; %d2flag requires only first order
|
options.order = 1; %d2flag requires only first order
|
||||||
d2Yss_g1 = hessian_sparse(numerical_objective_fname, modparam1, gstep, 'dynamic_model', estim_params_model, M, oo, options); % d2flag requires only first-order
|
d2Yss_g1 = hessian_sparse(numerical_objective_fname, modparam1, gstep, 'dynamic_model', estim_params_model, M, options, dr, endo_steady_state, exo_steady_state, exo_det_steady_state); % d2flag requires only first-order
|
||||||
options.order = order; %make sure to set back the order
|
options.order = order; %make sure to set back the order
|
||||||
d2Yss = reshape(full(d2Yss_g1(1:endo_nbr,:)), [endo_nbr modparam_nbr modparam_nbr]); %put into tensor notation
|
d2Yss = reshape(full(d2Yss_g1(1:endo_nbr,:)), [endo_nbr modparam_nbr modparam_nbr]); %put into tensor notation
|
||||||
for j=1:endo_nbr
|
for j=1:endo_nbr
|
||||||
|
@ -425,7 +431,7 @@ if analytic_derivation_mode == -2
|
||||||
end
|
end
|
||||||
|
|
||||||
%Parameter Jacobian of dynamic model derivatives (wrt selected model parameters only)
|
%Parameter Jacobian of dynamic model derivatives (wrt selected model parameters only)
|
||||||
dYss_g = fjaco(numerical_objective_fname, modparam1, 'dynamic_model', estim_params_model, M, oo, options);
|
dYss_g = fjaco(numerical_objective_fname, modparam1, 'dynamic_model', estim_params_model, M, options, dr, endo_steady_state, exo_steady_state, exo_det_steady_state);
|
||||||
ind_Yss = 1:endo_nbr;
|
ind_Yss = 1:endo_nbr;
|
||||||
ind_g1 = ind_Yss(end) + (1:endo_nbr*yy0ex0_nbr);
|
ind_g1 = ind_Yss(end) + (1:endo_nbr*yy0ex0_nbr);
|
||||||
dYss = dYss_g(ind_Yss,:); %in tensor notation, wrt selected model parameters only
|
dYss = dYss_g(ind_Yss,:); %in tensor notation, wrt selected model parameters only
|
||||||
|
@ -592,7 +598,7 @@ elseif (analytic_derivation_mode == 0 || analytic_derivation_mode == 1)
|
||||||
[II, JJ] = ind2sub([yy0ex0_nbr yy0ex0_nbr], find(g2(j,:))); %g2 is [endo_nbr by yy0ex0_nbr^2]
|
[II, JJ] = ind2sub([yy0ex0_nbr yy0ex0_nbr], find(g2(j,:))); %g2 is [endo_nbr by yy0ex0_nbr^2]
|
||||||
for i = 1:yy0ex0_nbr
|
for i = 1:yy0ex0_nbr
|
||||||
is = find(II==i);
|
is = find(II==i);
|
||||||
is = is(find(JJ(is)<=yy0_nbr)); %focus only on oo.dr.ys(I) derivatives as exogenous variables are 0 in a stochastic context
|
is = is(find(JJ(is)<=yy0_nbr)); %focus only on dr.ys(I) derivatives as exogenous variables are 0 in a stochastic context
|
||||||
if ~isempty(is)
|
if ~isempty(is)
|
||||||
tmp_g2 = full(g2(j,find(g2(j,:))));
|
tmp_g2 = full(g2(j,find(g2(j,:))));
|
||||||
dg1(j,i,:) = tmp_g2(is)*dyy0(JJ(is),:); %put into tensor notation
|
dg1(j,i,:) = tmp_g2(is)*dyy0(JJ(is),:); %put into tensor notation
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
function [out,info] = get_perturbation_params_derivs_numerical_objective(params, outputflag, estim_params, M, oo, options)
|
function [out,info] = get_perturbation_params_derivs_numerical_objective(params, outputflag, estim_params, M, options, dr, endo_steady_state, exo_steady_state, exo_det_steady_state)
|
||||||
%function [out,info] = get_perturbation_params_derivs_numerical_objective(params, outputflag, estim_params, M, oo, options)
|
%function [out,info] = get_perturbation_params_derivs_numerical_objective(params, outputflag, estim_params, M, options, dr, steady_state, exo_steady_state, exo_det_steady_state)
|
||||||
% -------------------------------------------------------------------------
|
% -------------------------------------------------------------------------
|
||||||
% Objective function to compute numerically the Jacobians used for get_perturbation_params_derivs
|
% Objective function to compute numerically the Jacobians used for get_perturbation_params_derivs
|
||||||
% =========================================================================
|
% =========================================================================
|
||||||
|
@ -9,8 +9,11 @@ function [out,info] = get_perturbation_params_derivs_numerical_objective(params,
|
||||||
% outputflag: [string] flag which objective to compute (see below)
|
% outputflag: [string] flag which objective to compute (see below)
|
||||||
% estim_params: [structure] storing the estimation information
|
% estim_params: [structure] storing the estimation information
|
||||||
% M: [structure] storing the model information
|
% M: [structure] storing the model information
|
||||||
% oo: [structure] storing the solution results
|
|
||||||
% options: [structure] storing the options
|
% options: [structure] storing the options
|
||||||
|
% dr [structure] Reduced form model.
|
||||||
|
% endo_steady_state [vector] steady state value for endogenous variables
|
||||||
|
% exo_steady_state [vector] steady state value for exogenous variables
|
||||||
|
% exo_det_steady_state [vector] steady state value for exogenous deterministic variables
|
||||||
% -------------------------------------------------------------------------
|
% -------------------------------------------------------------------------
|
||||||
%
|
%
|
||||||
% OUTPUT
|
% OUTPUT
|
||||||
|
@ -51,7 +54,7 @@ function [out,info] = get_perturbation_params_derivs_numerical_objective(params,
|
||||||
|
|
||||||
%% Update stderr, corr and model parameters and compute perturbation approximation and steady state with updated parameters
|
%% Update stderr, corr and model parameters and compute perturbation approximation and steady state with updated parameters
|
||||||
M = set_all_parameters(params,estim_params,M);
|
M = set_all_parameters(params,estim_params,M);
|
||||||
[oo.dr,info,M.params] = compute_decision_rules(M,options,oo.dr, oo.steady_state, oo.exo_steady_state, oo.exo_det_steady_state);
|
[dr,info,M.params] = compute_decision_rules(M,options,dr,endo_steady_state,exo_steady_state,exo_det_steady_state);
|
||||||
Sigma_e = M.Sigma_e;
|
Sigma_e = M.Sigma_e;
|
||||||
|
|
||||||
if info(1) > 0
|
if info(1) > 0
|
||||||
|
@ -59,16 +62,16 @@ if info(1) > 0
|
||||||
out = [];
|
out = [];
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
ys = oo.dr.ys; %steady state of model variables in declaration order
|
ys = dr.ys; %steady state of model variables in declaration order
|
||||||
ghx = oo.dr.ghx; ghu = oo.dr.ghu;
|
ghx = dr.ghx; ghu = dr.ghu;
|
||||||
if options.order > 1
|
if options.order > 1
|
||||||
ghxx = oo.dr.ghxx; ghxu = oo.dr.ghxu; ghuu = oo.dr.ghuu; ghs2 = oo.dr.ghs2;
|
ghxx = dr.ghxx; ghxu = dr.ghxu; ghuu = dr.ghuu; ghs2 = dr.ghs2;
|
||||||
end
|
end
|
||||||
if options.order > 2
|
if options.order > 2
|
||||||
ghxxx = oo.dr.ghxxx; ghxxu = oo.dr.ghxxu; ghxuu = oo.dr.ghxuu; ghxss = oo.dr.ghxss; ghuuu = oo.dr.ghuuu; ghuss = oo.dr.ghuss;
|
ghxxx = dr.ghxxx; ghxxu = dr.ghxxu; ghxuu = dr.ghxuu; ghxss = dr.ghxss; ghuuu = dr.ghuuu; ghuss = dr.ghuss;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
Yss = ys(oo.dr.order_var); %steady state of model variables in DR order
|
Yss = ys(dr.order_var); %steady state of model variables in DR order
|
||||||
|
|
||||||
%% out = [vec(Sigma_e);vec(ghx);vec(ghu);vec(ghxx);vec(ghxu);vec(ghuu);vec(ghs2);vec(ghxxx);vec(ghxxu);vec(ghxuu);vec(ghuuu);vec(ghxss);vec(ghuss)]
|
%% out = [vec(Sigma_e);vec(ghx);vec(ghu);vec(ghxx);vec(ghxu);vec(ghuu);vec(ghs2);vec(ghxxx);vec(ghxxu);vec(ghxuu);vec(ghuuu);vec(ghxss);vec(ghuss)]
|
||||||
if strcmp(outputflag,'perturbation_solution')
|
if strcmp(outputflag,'perturbation_solution')
|
||||||
|
@ -85,13 +88,13 @@ end
|
||||||
if strcmp(outputflag,'dynamic_model')
|
if strcmp(outputflag,'dynamic_model')
|
||||||
[I,~] = find(M.lead_lag_incidence'); %I is used to evaluate dynamic model files
|
[I,~] = find(M.lead_lag_incidence'); %I is used to evaluate dynamic model files
|
||||||
if options.order == 1
|
if options.order == 1
|
||||||
[~, g1] = feval([M.fname,'.dynamic'], ys(I), oo.exo_steady_state', M.params, ys, 1);
|
[~, g1] = feval([M.fname,'.dynamic'], ys(I), exo_steady_state', M.params, ys, 1);
|
||||||
out = [Yss; g1(:)];
|
out = [Yss; g1(:)];
|
||||||
elseif options.order == 2
|
elseif options.order == 2
|
||||||
[~, g1, g2] = feval([M.fname,'.dynamic'], ys(I), oo.exo_steady_state', M.params, ys, 1);
|
[~, g1, g2] = feval([M.fname,'.dynamic'], ys(I), exo_steady_state', M.params, ys, 1);
|
||||||
out = [Yss; g1(:); g2(:)];
|
out = [Yss; g1(:); g2(:)];
|
||||||
elseif options.order == 3
|
elseif options.order == 3
|
||||||
[~, g1, g2, g3] = feval([M.fname,'.dynamic'], ys(I), oo.exo_steady_state', M.params, ys, 1);
|
[~, g1, g2, g3] = feval([M.fname,'.dynamic'], ys(I), exo_steady_state', M.params, ys, 1);
|
||||||
g3 = unfold_g3(g3, length(ys(I))+M.exo_nbr);
|
g3 = unfold_g3(g3, length(ys(I))+M.exo_nbr);
|
||||||
out = [Yss; g1(:); g2(:); g3(:)];
|
out = [Yss; g1(:); g2(:); g3(:)];
|
||||||
end
|
end
|
||||||
|
|
|
@ -138,7 +138,7 @@ error_indicator.identification_spectrum=0;
|
||||||
|
|
||||||
if info(1) == 0 %no errors in solution
|
if info(1) == 0 %no errors in solution
|
||||||
% Compute parameter Jacobians for identification analysis
|
% Compute parameter Jacobians for identification analysis
|
||||||
[MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dSPECTRUM_NO_MEAN, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params_, M_, oo_, options_, options_ident, indpmodel, indpstderr, indpcorr, indvobs);
|
[MEAN, dMEAN, REDUCEDFORM, dREDUCEDFORM, DYNAMIC, dDYNAMIC, MOMENTS, dMOMENTS, dSPECTRUM, dSPECTRUM_NO_MEAN, dMINIMAL, derivatives_info] = get_identification_jacobians(estim_params_, M_, options_, options_ident, indpmodel, indpstderr, indpcorr, indvobs, oo_.dr, oo_.steady_state, oo_.exo_steady_state, oo_.exo_det_steady_state);
|
||||||
if isempty(dMINIMAL)
|
if isempty(dMINIMAL)
|
||||||
% Komunjer and Ng is not computed if (1) minimality conditions are not fullfilled or (2) there are more shocks and measurement errors than observables, so we need to reset options
|
% Komunjer and Ng is not computed if (1) minimality conditions are not fullfilled or (2) there are more shocks and measurement errors than observables, so we need to reset options
|
||||||
error_indicator.identification_minimal = 1;
|
error_indicator.identification_minimal = 1;
|
||||||
|
@ -202,7 +202,7 @@ if info(1) == 0 %no errors in solution
|
||||||
options_ident_local.no_identification_spectrum = 1; %do not recompute dSPECTRUM
|
options_ident_local.no_identification_spectrum = 1; %do not recompute dSPECTRUM
|
||||||
options_ident_local.ar = nlags; %store new lag number
|
options_ident_local.ar = nlags; %store new lag number
|
||||||
options_.ar = nlags; %store new lag number
|
options_.ar = nlags; %store new lag number
|
||||||
[~, ~, ~, ~, ~, ~, MOMENTS, dMOMENTS, ~, ~, ~, ~] = get_identification_jacobians(estim_params_, M_, oo_, options_, options_ident_local, indpmodel, indpstderr, indpcorr, indvobs);
|
[~, ~, ~, ~, ~, ~, MOMENTS, dMOMENTS, ~, ~, ~, ~] = get_identification_jacobians(estim_params_, M_, options_, options_ident_local, indpmodel, indpstderr, indpcorr, indvobs, oo_.dr, oo_.steady_state, oo_.exo_steady_state, oo_.exo_det_steady_state);
|
||||||
|
|
||||||
ind_dMOMENTS = (find(max(abs(dMOMENTS'),[],1) > tol_deriv)); %new index with non-zero rows
|
ind_dMOMENTS = (find(max(abs(dMOMENTS'),[],1) > tol_deriv)); %new index with non-zero rows
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,21 +1,23 @@
|
||||||
function out = identification_numerical_objective(params, outputflag, estim_params, M, oo, options, indpmodel, indpstderr, indpcorr, indvar, useautocorr, nlags, grid_nbr)
|
function out = identification_numerical_objective(params, outputflag, estim_params, M, options, indpmodel, indpstderr, indvar, useautocorr, nlags, grid_nbr, dr, steady_state, exo_steady_state, exo_det_steady_state)
|
||||||
%function out = identification_numerical_objective(params, outputflag, estim_params, M, oo, options, indpmodel, indpstderr, indpcorr, indvar, useautocorr, nlags, grid_nbr)
|
%function out = identification_numerical_objective(params, outputflag, %estim_params, M, options, indpmodel, indpstderr, indvar, useautocorr, nlags, grid_nbr, dr, steady_state, exo_steady_state, exo_det_steady_state)
|
||||||
% -------------------------------------------------------------------------
|
% -------------------------------------------------------------------------
|
||||||
% Objective function to compute numerically the Jacobians used for identification analysis
|
% Objective function to compute numerically the Jacobians used for identification analysis
|
||||||
% Previously this function was called thet2tau.m
|
% Previously this function was called thet2tau.m
|
||||||
% =========================================================================
|
% =========================================================================
|
||||||
% INPUTS
|
% INPUTS
|
||||||
% params: [vector] parameter values at which to evaluate objective function
|
% params: [vector] parameter values at which to evaluate objective function
|
||||||
% stderr parameters come first, corr parameters second, model parameters third
|
% stderr parameters come first, corr parameters second, model parameters third
|
||||||
% outputflag: [integer] flag which objective to compute (see below)
|
% outputflag: [integer] flag which objective to compute (see below)
|
||||||
% estim_params: [structure] storing the estimation information
|
% estim_params: [structure] storing the estimation information
|
||||||
% M: [structure] storing the model information
|
% M: [structure] storing the model information
|
||||||
% oo: [structure] storing the reduced form solution results
|
% options: [structure] storing the options
|
||||||
% options: [structure] storing the options
|
% indpmodel: [vector] Index of model parameters
|
||||||
% indpmodel: [vector] Index of model parameters
|
% indpstderr: [vector] Index of stderr parameters
|
||||||
% indpstderr: [vector] Index of stderr parameters
|
% indvar: [vector] Index of selected or observed variables
|
||||||
% indpcorr: [matrix] Index of corr parameters
|
% dr [structure] Reduced form model.
|
||||||
% indvar: [vector] Index of selected or observed variables
|
% endo_steady_state [vector] steady state value for endogenous variables
|
||||||
|
% exo_steady_state [vector] steady state value for exogenous variables
|
||||||
|
% exo_det_steady_state [vector] steady state value for exogenous deterministic variables
|
||||||
% -------------------------------------------------------------------------
|
% -------------------------------------------------------------------------
|
||||||
% OUTPUTS
|
% OUTPUTS
|
||||||
% out: dependent on outputflag
|
% out: dependent on outputflag
|
||||||
|
@ -76,9 +78,9 @@ else
|
||||||
end
|
end
|
||||||
|
|
||||||
%% compute Kalman transition matrices and steady state with updated parameters
|
%% compute Kalman transition matrices and steady state with updated parameters
|
||||||
[oo.dr,info,M.params] = compute_decision_rules(M,options,oo.dr, oo.steady_state, oo.exo_steady_state, oo.exo_det_steady_state);
|
[dr,info,M.params] = compute_decision_rules(M,options,dr, steady_state, exo_steady_state, exo_det_steady_state);
|
||||||
options = rmfield(options,'options_ident');
|
options = rmfield(options,'options_ident');
|
||||||
pruned = pruned_state_space_system(M, options, oo.dr, indvar, nlags, useautocorr, 0);
|
pruned = pruned_state_space_system(M, options, dr, indvar, nlags, useautocorr, 0);
|
||||||
|
|
||||||
%% out = [vech(cov(Y_t,Y_t)); vec(cov(Y_t,Y_{t-1}); ...; vec(cov(Y_t,Y_{t-nlags})] of indvar variables, in DR order. This is Iskrev (2010)'s J matrix.
|
%% out = [vech(cov(Y_t,Y_t)); vec(cov(Y_t,Y_{t-1}); ...; vec(cov(Y_t,Y_{t-nlags})] of indvar variables, in DR order. This is Iskrev (2010)'s J matrix.
|
||||||
if outputflag == 1
|
if outputflag == 1
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
function set_dynare_seed(varargin)
|
function set_dynare_seed(varargin)
|
||||||
% Set seeds depending on matlab (octave) version. This routine is called is
|
% set_dynare_seed(varargin)
|
||||||
|
% Set seeds depending on Matlab (Octave) version. This routine is
|
||||||
% a wrapper for set_dynare_seed_local_options
|
% a wrapper for set_dynare_seed_local_options
|
||||||
% dynare_config and can be called by the
|
|
||||||
% user in the mod file.
|
|
||||||
%
|
|
||||||
% Copyright © 2010-2023 Dynare Team
|
% Copyright © 2010-2023 Dynare Team
|
||||||
%
|
%
|
||||||
% This file is part of Dynare.
|
% This file is part of Dynare.
|
||||||
|
|
|
@ -460,7 +460,7 @@ for jj = 1:2
|
||||||
for id_kronflag = 1:length(KRONFLAG)
|
for id_kronflag = 1:length(KRONFLAG)
|
||||||
fprintf('***** %s: d2flag=%d and kronflag=%d *****\n',strparamset, d2flag,KRONFLAG(id_kronflag))
|
fprintf('***** %s: d2flag=%d and kronflag=%d *****\n',strparamset, d2flag,KRONFLAG(id_kronflag))
|
||||||
options_.analytic_derivation_mode = KRONFLAG(id_kronflag);
|
options_.analytic_derivation_mode = KRONFLAG(id_kronflag);
|
||||||
DERIVS = get_perturbation_params_derivs(M_, options_, estim_params_, oo_, indpmodel, indpstderr, indpcorr, d2flag);
|
DERIVS = get_perturbation_params_derivs(M_, options_, estim_params_, oo_.dr, oo_.steady_state, oo_.exo_steady_state, oo_.exo_det_steady_state, indpmodel, indpstderr, indpcorr, d2flag);
|
||||||
for id_var = 1:size(lst_dvars,2)
|
for id_var = 1:size(lst_dvars,2)
|
||||||
dx = norm( vec(nSYM.(sprintf('%s',lst_dvars{id_var}))) - vec(DERIVS.(sprintf('%s',lst_dvars{id_var}))), Inf);
|
dx = norm( vec(nSYM.(sprintf('%s',lst_dvars{id_var}))) - vec(DERIVS.(sprintf('%s',lst_dvars{id_var}))), Inf);
|
||||||
fprintf('Max absolute deviation for %s: %e\n', lst_dvars{id_var}, dx);
|
fprintf('Max absolute deviation for %s: %e\n', lst_dvars{id_var}, dx);
|
||||||
|
|
|
@ -170,7 +170,7 @@ KRONFLAGS = [-1 -2 0 1];
|
||||||
for k = 1:length(KRONFLAGS)
|
for k = 1:length(KRONFLAGS)
|
||||||
fprintf('KRONFLAG=%d\n',KRONFLAGS(k));
|
fprintf('KRONFLAG=%d\n',KRONFLAGS(k));
|
||||||
options_.analytic_derivation_mode = KRONFLAGS(k);
|
options_.analytic_derivation_mode = KRONFLAGS(k);
|
||||||
DERIVS = get_perturbation_params_derivs(M_, options_, estim_params_, oo_, indpmodel, indpstderr, indpcorr, d2flag);
|
DERIVS = get_perturbation_params_derivs(M_, options_, estim_params_, oo_.dr, oo_.steady_state, oo_.exo_steady_state, oo_.exo_det_steady_state, indpmodel, indpstderr, indpcorr, d2flag);
|
||||||
oo_.dr.dg_0 = permute(1/2*DERIVS.dghs2,[1 3 2]);
|
oo_.dr.dg_0 = permute(1/2*DERIVS.dghs2,[1 3 2]);
|
||||||
oo_.dr.dg_1 = cat(2,DERIVS.dghx,DERIVS.dghu) + 3/6*cat(2,DERIVS.dghxss,DERIVS.dghuss);
|
oo_.dr.dg_1 = cat(2,DERIVS.dghx,DERIVS.dghu) + 3/6*cat(2,DERIVS.dghxss,DERIVS.dghuss);
|
||||||
oo_.dr.dg_2 = 1/2*cat(2,DERIVS.dghxx,DERIVS.dghxu,DERIVS.dghuu);
|
oo_.dr.dg_2 = 1/2*cat(2,DERIVS.dghxx,DERIVS.dghxu,DERIVS.dghuu);
|
||||||
|
|
Loading…
Reference in New Issue