Skip to content
Snippets Groups Projects
Verified Commit 2d8bcd69 authored by Willi Mutschler's avatar Willi Mutschler
Browse files

irfmatching: add function to translate irf_matching blocks into useful structures

This needs to be adapted once we implement an interface in the preprocessor
parent c45c0efe
No related branches found
No related tags found
No related merge requests found
function [data_irfs, weightMat, irfIndex, maxIrfHorizon] = matched_irfs_blocks(matched_irfs, matched_irfs_weight, varobs_id, obs_nbr, exo_nbr, endo_names)
% [data_irfs, weightMat, irfIndex, maxIrfHorizon] = matched_irfs_blocks(matched_irfs, matched_irfs_weight, varobs_id, obs_nbr, exo_nbr, endo_names)
% -------------------------------------------------------------------------
% Checks and transforms matched_irfs and matched_irfs_weight blocks
% for further use in the estimation.
% -------------------------------------------------------------------------
% INPUTS
% matched_irfs: [cell array] original matched_irfs block
% matched_irfs_weight: [cell array] original matched_irfs_weight block
% varobs_id: [vector] index for observable variables in endo_names
% obs_nbr: [scalar] number of observable variables
% exo_nbr: [scalar] number of exogenous variables
% endo_names: [cell array] list of endogenous variables
% -------------------------------------------------------------------------
% OUTPUT
% data_irfs: [matrix] irfs for VAROBS as declared in matched_irfs block
% weightMat: [matrix] weighting matrix for irfs as declared in matched_irfs_weight block
% irfIndex: [vector] index for selecting specific irfs from full irf matrix of observables
% maxIrfHorizon: [scalar] maximum irf horizon as declared in matched_irfs block
% -------------------------------------------------------------------------
% This function is called by
% o mom.run
% -------------------------------------------------------------------------
% 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/>.
maxIrfHorizon = max(cellfun(@(x) x(end), matched_irfs(:,1))); % get maximum irf horizon
% create full matrix where 1st dimension are irf periods, 2nd dimension are variables as declared in VAROBS, 3rd dimension are shocks.
data_irfs = nan(maxIrfHorizon,obs_nbr,exo_nbr);
% overwrite nan values if they are declared in matched_irfs block; remaining nan values will be later ignored in the matching
for jj = 1:size(matched_irfs,1)
idVar = matched_irfs{jj,1}(1);
idVarobs = find(varobs_id==idVar,1);
idShock = matched_irfs{jj,1}(2);
idIrfPeriod = matched_irfs{jj,1}(3);
irfValue = matched_irfs{jj,2};
if isempty(idVarobs)
skipline;
error('method_of_moments: You specified an irf matching involving variable %s, but it is not declared as a varobs!',endo_names{idVar})
end
data_irfs(idIrfPeriod,idVarobs,idShock) = irfValue;
end
% create (full) empirical weighting matrix
weightMat = eye(maxIrfHorizon*obs_nbr*exo_nbr); % identity matrix by default: all irfs are equally important
for jj = 1:size(matched_irfs_weight,1)
idVar1 = matched_irfs_weight{jj,1}(1); idVarobs1 = find(varobs_id==idVar1,1); idShock1 = matched_irfs_weight{jj,1}(2); idIrfPeriod1 = matched_irfs_weight{jj,1}(3);
idVar2 = matched_irfs_weight{jj,2}(1); idVarobs2 = find(varobs_id==idVar2,1); idShock2 = matched_irfs_weight{jj,2}(2); idIrfPeriod2 = matched_irfs_weight{jj,2}(3);
weightMatValue = matched_irfs_weight{jj,3};
if isempty(idVarobs1)
skipline;
error('method_of_moments: You specified a weight for an irf matching involving variable %s, but it is not a varobs!',endo_names{idVar1})
end
if isempty(idVarobs2)s
skipline;
error('method_of_moments: You specified a weight for an irf matching involving variable %s, but it is not a varobs!',endo_names{idVar2})
end
idweightMat1 = sub2ind(size(data_irfs),idIrfPeriod1,idVarobs1,idShock1);
idweightMat2 = sub2ind(size(data_irfs),idIrfPeriod2,idVarobs2,idShock2);
weightMat(idweightMat1,idweightMat2) = weightMatValue;
weightMat(idweightMat2,idweightMat1) = weightMatValue; % symmetry
end
% focus only on specified irfs
irfIndex = find(~isnan(data_irfs));
data_irfs = data_irfs(irfIndex);
weightMat = weightMat(irfIndex,irfIndex);
\ No newline at end of file
function matched_moments = matched_moments_block(matched_moments, mom_method) function matched_moments = matched_moments_block(matched_moments, mom_method)
% function matched_moments = matched_moments_block(matched_moments, mom_method) % matched_moments = matched_moments_block(matched_moments, mom_method)
% -------------------------------------------------------------------------
% Checks and transforms matched_moments block for further use in the estimation
% ------------------------------------------------------------------------- % -------------------------------------------------------------------------
% Checks and transforms matched_moments bock for further use in the estimation
% =========================================================================
% INPUTS % INPUTS
% matched_moments: [cell array] original matched_moments block % matched_moments: [cell array] original matched_moments block
% mom_method: [string] method of moments method (GMM or SMM) % mom_method: [string] method of moments method (GMM or SMM)
...@@ -12,7 +12,8 @@ function matched_moments = matched_moments_block(matched_moments, mom_method) ...@@ -12,7 +12,8 @@ function matched_moments = matched_moments_block(matched_moments, mom_method)
% ------------------------------------------------------------------------- % -------------------------------------------------------------------------
% This function is called by % This function is called by
% o mom.run % o mom.run
% ========================================================================= % -------------------------------------------------------------------------
% Copyright © 2023 Dynare Team % Copyright © 2023 Dynare Team
% %
% This file is part of Dynare. % This file is part of Dynare.
...@@ -29,7 +30,7 @@ function matched_moments = matched_moments_block(matched_moments, mom_method) ...@@ -29,7 +30,7 @@ function matched_moments = matched_moments_block(matched_moments, mom_method)
% %
% You should have received a copy of the GNU General Public License % You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <https://www.gnu.org/licenses/>. % along with Dynare. If not, see <https://www.gnu.org/licenses/>.
% =========================================================================
matched_moments_orig = matched_moments; matched_moments_orig = matched_moments;
% higher-order product moments not supported yet for GMM % higher-order product moments not supported yet for GMM
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment