dsge_var: pass data moments as function inputs instead of via base workspace

going via base prevents parallel execution
pac-components
Johannes Pfeifer 2021-12-08 12:54:03 +01:00
parent 1638374b46
commit 5f732803d8
3 changed files with 41 additions and 38 deletions

View File

@ -1,9 +1,17 @@
function [fval,info,exit_flag,grad,hess,SteadyState,trend_coeff,PHI_tilde,SIGMA_u_tilde,iXX,prior] = dsge_var_likelihood(xparam1,DynareDataset,DynareInfo,DynareOptions,Model,EstimatedParameters,BayesInfo,BoundsInfo,DynareResults)
% Evaluates the posterior kernel of the bvar-dsge model.
function [fval,info,exit_flag,grad,hess,SteadyState,trend_coeff,PHI_tilde,SIGMA_u_tilde,iXX,prior] = dsge_var_likelihood(xparam1,DynareDataset,DataSetInfo,DynareOptions,Model,EstimatedParameters,BayesInfo,BoundsInfo,DynareResults)
% Evaluates the posterior kernel of the BVAR-DSGE model.
%
% INPUTS
% o xparam1 [double] Vector of model's parameters.
% o gend [integer] Number of observations (without conditionning observations for the lags).
% o xparam1 [double] Vector of model's parameters.
% o gend [integer] Number of observations (without conditionning observations for the lags).
% o DynareDataset [dseries] object storing the dataset
% o DataSetInfo [structure] storing informations about the sample.
% o DynareOptions [structure] describing the options
% o Model [structure] decribing the model
% o EstimatedParameters [structure] characterizing parameters to be estimated
% o BayesInfo [structure] describing the priors
% o BoundsInfo [structure] containing prior bounds
% o DynareResults [structure] storing the results
%
% OUTPUTS
% o fval [double] Value of the posterior kernel at xparam1.
@ -54,8 +62,6 @@ function [fval,info,exit_flag,grad,hess,SteadyState,trend_coeff,PHI_tilde,SIGMA_
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <https://www.gnu.org/licenses/>.
persistent dsge_prior_weight_idx
% Initialize some of the output arguments.
fval = [];
exit_flag = 1;
@ -77,9 +83,7 @@ if ~isempty(xparam1)
end
% Initialization of of the index for parameter dsge_prior_weight in Model.params.
if isempty(dsge_prior_weight_idx)
dsge_prior_weight_idx = strmatch('dsge_prior_weight', Model.param_names);
end
dsge_prior_weight_idx = strmatch('dsge_prior_weight', Model.param_names);
% Get the number of estimated (dsge) parameters.
nx = EstimatedParameters.nvx + EstimatedParameters.np;
@ -101,10 +105,9 @@ if ~DynareOptions.noconstant
end
% Get empirical second order moments for the observed variables.
mYY = evalin('base', 'mYY');
mYX = evalin('base', 'mYX');
mXY = evalin('base', 'mXY');
mXX = evalin('base', 'mXX');
mYY= DataSetInfo.mYY;
mYX= DataSetInfo.mYX;
mXX= DataSetInfo.mXX;
Model = set_all_parameters(xparam1,EstimatedParameters,Model);
@ -206,10 +209,6 @@ end
GYY = TheoreticalAutoCovarianceOfTheObservedVariables(:,:,1);
assignin('base','GYY',GYY);
assignin('base','GXX',GXX);
assignin('base','GYX',GYX);
iGXX = inv(GXX);
PHI_star = iGXX*transpose(GYX); %formula (22), DS (2004)
SIGMA_u_star=GYY - GYX*PHI_star; %formula (23), DS (2004)

View File

@ -115,10 +115,10 @@ if options_.dsge_var
error('Estimation::DsgeVarLikelihood: I cannot estimate a DSGE-VAR model with missing observations!')
end
if options_.noconstant
var_sample_moments(options_.dsge_varlag, -1, dataset_);
dataset_info=var_sample_moments(options_.dsge_varlag, -1, dataset_, dataset_info);
else
% The steady state is non zero ==> a constant in the VAR is needed!
var_sample_moments(options_.dsge_varlag, 0, dataset_);
dataset_info=var_sample_moments(options_.dsge_varlag, 0, dataset_, dataset_info);
end
end

View File

@ -1,4 +1,4 @@
function var_sample_moments(nlag, var_trend_order, dataset_)%datafile,varobs,xls_sheet,xls_range)
function dataset_info=var_sample_moments(nlag, var_trend_order, dataset_, dataset_info)%datafile,varobs,xls_sheet,xls_range)
% Computes the sample moments of a VAR model.
%
% The VAR(p) model is defined by:
@ -37,22 +37,21 @@ function var_sample_moments(nlag, var_trend_order, dataset_)%datafile,varobs,xls
% = 0 constant and no linear trend,
% = 1 constant and linear trend.
% o dataset_ [dseries] The sample.
% o dataset_info [structure] data set information
%
% OUTPUTS
% o YtY [double] Y'*Y an m*m matrix.
% o XtY [double] X'*Y an (mp+q)*m matrix.
% o YtX [double] Y'*X an m*(mp+q) matrix.
% o XtX [double] X'*X an (mp+q)*(mp+q) matrix.
% o Y [double] Y a T*m matrix.
% o X [double] X a T*(mp+q) matrix.
% dataset_info [structure] containing the following new fields
% o mYY [double] Y'*Y an m*m matrix.
% o mXY [double] X'*Y an (mp+q)*m matrix.
% o mYX [double] Y'*X an m*(mp+q) matrix.
% o mXX [double] X'*X an (mp+q)*(mp+q) matrix.
% o Ydata [double] Y a T*m matrix.
% o Xdata [double] X a T*(mp+q) matrix.
%
% SPECIAL REQUIREMENTS
% None.
%
% REMARKS
% Outputs are saved in the base workspace (not returned by the function).
% Copyright (C) 2007-2014 Dynare Team
% Copyright (C) 2007-2021 Dynare Team
%
% This file is part of Dynare.
%
@ -102,12 +101,17 @@ for t=1:NumberOfObservations
end
if (var_trend_order == 1)
X(:,end) = transpose(1:NumberOfObservations)
X(:,end) = transpose(1:NumberOfObservations);
end
assignin('base', 'mYY', Y'*Y);
assignin('base', 'mYX', Y'*X);
assignin('base', 'mXY', X'*Y);
assignin('base', 'mXX', X'*X);
assignin('base', 'Ydata', Y);
assignin('base', 'Xdata', X);
dataset_info.mYY=Y'*Y;
dataset_info.mYX=Y'*X;
dataset_info.mXY=X'*Y;
dataset_info.mXX=X'*X;
dataset_info.Ydata=Y;
dataset_info.Xdata=X;
% assignin('base', 'mYY', Y'*Y);
% assignin('base', 'mYX', Y'*X);
% assignin('base', 'mXY', X'*Y);
% assignin('base', 'mXX', X'*X);
% assignin('base', 'Ydata', Y);
% assignin('base', 'Xdata', X);