404 lines
14 KiB
Matlab
404 lines
14 KiB
Matlab
function prior_posterior_statistics(type,dataset,dataset_info)
|
|
|
|
% function prior_posterior_statistics(type,dataset)
|
|
% Computes Monte Carlo filter smoother and forecasts
|
|
%
|
|
% INPUTS
|
|
% type: posterior
|
|
% prior
|
|
% gsa
|
|
% dataset: data structure
|
|
%
|
|
% OUTPUTS
|
|
% none
|
|
%
|
|
% SPECIAL REQUIREMENTS
|
|
% none
|
|
%
|
|
% PARALLEL CONTEXT
|
|
% See the comments in the posterior_sampler.m funtion.
|
|
|
|
|
|
% Copyright (C) 2005-2020 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 <http://www.gnu.org/licenses/>.
|
|
|
|
global options_ estim_params_ oo_ M_ bayestopt_
|
|
|
|
localVars=[];
|
|
|
|
Y = transpose(dataset.data);
|
|
gend = dataset.nobs;
|
|
data_index = dataset_info.missing.aindex;
|
|
missing_value = dataset_info.missing.state;
|
|
mean_varobs = dataset_info.descriptive.mean;
|
|
|
|
|
|
nvx = estim_params_.nvx;
|
|
nvn = estim_params_.nvn;
|
|
ncx = estim_params_.ncx;
|
|
ncn = estim_params_.ncn;
|
|
np = estim_params_.np ;
|
|
npar = nvx+nvn+ncx+ncn+np;
|
|
naK = length(options_.filter_step_ahead);
|
|
|
|
MaxNumberOfBytes=options_.MaxNumberOfBytes;
|
|
endo_nbr=M_.endo_nbr;
|
|
exo_nbr=M_.exo_nbr;
|
|
meas_err_nbr=length(M_.Correlation_matrix_ME);
|
|
iendo = 1:endo_nbr;
|
|
horizon = options_.forecast;
|
|
IdObs = bayestopt_.mfys;
|
|
if horizon
|
|
i_last_obs = gend+(1-M_.maximum_endo_lag:0);
|
|
end
|
|
maxlag = M_.maximum_endo_lag;
|
|
|
|
if strcmpi(type,'posterior')
|
|
DirectoryName = CheckPath('metropolis',M_.dname);
|
|
B = options_.sub_draws;
|
|
elseif strcmpi(type,'gsa')
|
|
RootDirectoryName = CheckPath('gsa',M_.dname);
|
|
if options_.opt_gsa.pprior
|
|
DirectoryName = CheckPath(['gsa',filesep,'prior'],M_.dname);
|
|
load([ RootDirectoryName filesep M_.fname '_prior.mat'],'lpmat0','lpmat','istable')
|
|
else
|
|
DirectoryName = CheckPath(['gsa',filesep,'mc'],M_.dname);
|
|
load([ RootDirectoryName filesep M_.fname '_mc.mat'],'lpmat0','lpmat','istable')
|
|
end
|
|
if ~isempty(lpmat0)
|
|
x=[lpmat0(istable,:) lpmat(istable,:)];
|
|
else
|
|
x=lpmat(istable,:);
|
|
end
|
|
clear lpmat lpmat0 istable
|
|
B = size(x,1);
|
|
elseif strcmpi(type,'prior')
|
|
DirectoryName = CheckPath('prior',M_.dname);
|
|
B = options_.prior_draws;
|
|
end
|
|
|
|
MAX_nruns = min(B,ceil(MaxNumberOfBytes/(npar+2)/8));
|
|
MAX_nsmoo = min(B,ceil(MaxNumberOfBytes/((endo_nbr)*gend)/8));
|
|
MAX_n_smoothed_constant = min(B,ceil(MaxNumberOfBytes/((endo_nbr)*gend)/8));
|
|
MAX_n_smoothed_trend = min(B,ceil(MaxNumberOfBytes/((endo_nbr)*gend)/8));
|
|
MAX_n_trend_coeff = min(B,ceil(MaxNumberOfBytes/endo_nbr/8));
|
|
MAX_ninno = min(B,ceil(MaxNumberOfBytes/(exo_nbr*gend)/8));
|
|
MAX_nerro = min(B,ceil(MaxNumberOfBytes/(size(options_.varobs,1)*gend)/8));
|
|
|
|
if naK
|
|
MAX_naK = min(B,ceil(MaxNumberOfBytes/(endo_nbr* ...
|
|
length(options_.filter_step_ahead)*(gend+max(options_.filter_step_ahead)))/8));
|
|
end
|
|
|
|
if horizon
|
|
MAX_nforc1 = min(B,ceil(MaxNumberOfBytes/((endo_nbr)*(horizon+maxlag))/8));
|
|
MAX_nforc2 = min(B,ceil(MaxNumberOfBytes/((endo_nbr)*(horizon+maxlag))/8));
|
|
if ~isequal(M_.H,0)
|
|
MAX_nforc_ME = min(B,ceil(MaxNumberOfBytes/((size(options_.varobs,1))*(horizon+maxlag))/8));
|
|
end
|
|
end
|
|
MAX_momentsno = min(B,ceil(MaxNumberOfBytes/(get_moments_size(options_)*8)));
|
|
|
|
if options_.filter_covariance
|
|
MAX_filter_covariance = min(B,ceil(MaxNumberOfBytes/(endo_nbr^2*(gend+1))/8));
|
|
end
|
|
|
|
if options_.smoothed_state_uncertainty
|
|
MAX_n_smoothed_state_uncertainty = min(B,ceil(MaxNumberOfBytes/((endo_nbr*endo_nbr)*gend)/8));
|
|
end
|
|
|
|
varlist = options_.varlist;
|
|
if isempty(varlist)
|
|
varlist = sort(M_.endo_names(1:M_.orig_endo_nbr));
|
|
end
|
|
nvar = length(varlist);
|
|
SelecVariables = [];
|
|
for i=1:nvar
|
|
if ~isempty(strmatch(varlist{i}, M_.endo_names, 'exact'))
|
|
SelecVariables = [SelecVariables; strmatch(varlist{i}, M_.endo_names, 'exact')];
|
|
end
|
|
end
|
|
|
|
n_variables_to_fill=13;
|
|
|
|
irun = ones(n_variables_to_fill,1);
|
|
ifil = zeros(n_variables_to_fill,1);
|
|
|
|
run_smoother = 0;
|
|
if options_.smoother || options_.forecast || options_.filter_step_ahead || options_.smoothed_state_uncertainty
|
|
run_smoother = 1;
|
|
if options_.loglinear
|
|
oo_.Smoother.loglinear = true;
|
|
else
|
|
oo_.Smoother.loglinear = false;
|
|
end
|
|
end
|
|
|
|
filter_covariance=0;
|
|
if options_.filter_covariance
|
|
filter_covariance=1;
|
|
end
|
|
|
|
smoothed_state_uncertainty=0;
|
|
if options_.smoothed_state_uncertainty
|
|
smoothed_state_uncertainty=1;
|
|
end
|
|
|
|
% Store the variable mandatory for local/remote parallel computing.
|
|
|
|
localVars.type=type;
|
|
localVars.run_smoother=run_smoother;
|
|
localVars.filter_covariance=filter_covariance;
|
|
localVars.smoothed_state_uncertainty=smoothed_state_uncertainty;
|
|
localVars.gend=gend;
|
|
localVars.Y=Y;
|
|
localVars.data_index=data_index;
|
|
localVars.missing_value=missing_value;
|
|
localVars.varobs=options_.varobs;
|
|
localVars.mean_varobs=mean_varobs;
|
|
localVars.irun=irun;
|
|
localVars.endo_nbr=endo_nbr;
|
|
localVars.nvn=nvn;
|
|
localVars.naK=naK;
|
|
localVars.horizon=horizon;
|
|
localVars.iendo=iendo;
|
|
localVars.IdObs=IdObs;
|
|
if horizon
|
|
localVars.i_last_obs=i_last_obs;
|
|
localVars.MAX_nforc1=MAX_nforc1;
|
|
localVars.MAX_nforc2=MAX_nforc2;
|
|
if ~isequal(M_.H,0)
|
|
localVars.MAX_nforc_ME = MAX_nforc_ME;
|
|
end
|
|
end
|
|
localVars.exo_nbr=exo_nbr;
|
|
localVars.maxlag=maxlag;
|
|
localVars.MAX_nsmoo=MAX_nsmoo;
|
|
localVars.MAX_ninno=MAX_ninno;
|
|
localVars.MAX_nerro = MAX_nerro;
|
|
if naK
|
|
localVars.MAX_naK=MAX_naK;
|
|
end
|
|
if options_.filter_covariance
|
|
localVars.MAX_filter_covariance = MAX_filter_covariance;
|
|
end
|
|
if options_.smoothed_state_uncertainty
|
|
localVars.MAX_n_smoothed_state_uncertainty = MAX_n_smoothed_state_uncertainty ;
|
|
end
|
|
localVars.MAX_n_smoothed_constant=MAX_n_smoothed_constant;
|
|
localVars.MAX_n_smoothed_trend=MAX_n_smoothed_trend;
|
|
localVars.MAX_n_trend_coeff=MAX_n_trend_coeff;
|
|
localVars.MAX_nruns=MAX_nruns;
|
|
localVars.MAX_momentsno = MAX_momentsno;
|
|
localVars.ifil=ifil;
|
|
localVars.DirectoryName = DirectoryName;
|
|
|
|
if strcmpi(type,'posterior')
|
|
BaseName = [DirectoryName filesep M_.fname];
|
|
load_last_mh_history_file(DirectoryName, M_.fname);
|
|
FirstMhFile = record.KeepedDraws.FirstMhFile;
|
|
FirstLine = record.KeepedDraws.FirstLine;
|
|
TotalNumberOfMhFiles = sum(record.MhDraws(:,2));
|
|
LastMhFile = TotalNumberOfMhFiles;
|
|
TotalNumberOfMhDraws = sum(record.MhDraws(:,1));
|
|
NumberOfDraws = TotalNumberOfMhDraws-floor(options_.mh_drop*TotalNumberOfMhDraws);
|
|
mh_nblck = options_.mh_nblck;
|
|
if B==NumberOfDraws*mh_nblck
|
|
% we load all retained MH runs !
|
|
logpost=GetAllPosteriorDraws(0, FirstMhFile, FirstLine, TotalNumberOfMhFiles, NumberOfDraws);
|
|
for column=1:npar
|
|
x(:,column) = GetAllPosteriorDraws(column, FirstMhFile, FirstLine, TotalNumberOfMhFiles, NumberOfDraws);
|
|
end
|
|
else
|
|
logpost=NaN(B,1);
|
|
for b=1:B
|
|
[x(b,:), logpost(b)] = GetOneDraw(type,M_,estim_params_,oo_,options_,bayestopt_);
|
|
end
|
|
end
|
|
localVars.logpost=logpost;
|
|
end
|
|
|
|
if ~strcmpi(type,'prior')
|
|
localVars.x=x;
|
|
end
|
|
|
|
% Like sequential execution!
|
|
if isnumeric(options_.parallel)
|
|
[fout] = prior_posterior_statistics_core(localVars,1,B,0);
|
|
% Parallel execution!
|
|
else
|
|
[~, totCPU, nBlockPerCPU] = distributeJobs(options_.parallel, 1, B);
|
|
ifil=zeros(n_variables_to_fill,totCPU);
|
|
for j=1:totCPU-1
|
|
if run_smoother
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_nsmoo);
|
|
ifil(1,j+1) =ifil(1,j)+nfiles;
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_ninno);
|
|
ifil(2,j+1) =ifil(2,j)+nfiles;
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_nerro);
|
|
ifil(3,j+1) =ifil(3,j)+nfiles;
|
|
end
|
|
if naK
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_naK);
|
|
ifil(4,j+1) =ifil(4,j)+nfiles;
|
|
end
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_nruns);
|
|
ifil(5,j+1) =ifil(5,j)+nfiles;
|
|
if horizon
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_nforc1);
|
|
ifil(6,j+1) =ifil(6,j)+nfiles;
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_nforc2);
|
|
ifil(7,j+1) =ifil(7,j)+nfiles;
|
|
if ~isequal(M_.H,0)
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_nforc_ME);
|
|
ifil(12,j+1) =ifil(12,j)+nfiles;
|
|
end
|
|
end
|
|
if options_.filter_covariance
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_filter_covariance);
|
|
ifil(8,j+1) =ifil(8,j)+nfiles;
|
|
end
|
|
if run_smoother
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_n_trend_coeff);
|
|
ifil(9,j+1) =ifil(9,j)+nfiles;
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_n_smoothed_constant);
|
|
ifil(10,j+1) =ifil(10,j)+nfiles;
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_n_smoothed_trend);
|
|
ifil(11,j+1) =ifil(11,j)+nfiles;
|
|
if smoothed_state_uncertainty
|
|
nfiles = ceil(nBlockPerCPU(j)/MAX_n_smoothed_state_uncertainty);
|
|
ifil(13,j+1) =ifil(13,j)+nfiles;
|
|
end
|
|
end
|
|
end
|
|
localVars.ifil = ifil;
|
|
globalVars = struct('M_',M_, ...
|
|
'options_', options_, ...
|
|
'bayestopt_', bayestopt_, ...
|
|
'estim_params_', estim_params_, ...
|
|
'oo_', oo_);
|
|
% which files have to be copied to run remotely
|
|
NamFileInput(1,:) = {'',[M_.fname '.static.m']};
|
|
NamFileInput(2,:) = {'',[M_.fname '.dynamic.m']};
|
|
if M_.set_auxiliary_variables
|
|
NamFileInput(3,:) = {'',[M_.fname '.set_auxiliary_variables.m']};
|
|
end
|
|
if options_.steadystate_flag
|
|
if options_.steadystate_flag == 1
|
|
NamFileInput(length(NamFileInput)+1,:)={'',[M_.fname '_steadystate.m']};
|
|
else
|
|
NamFileInput(length(NamFileInput)+1,:)={'',[M_.fname '.steadystate.m']};
|
|
end
|
|
end
|
|
[fout] = masterParallel(options_.parallel, 1, B,NamFileInput,'prior_posterior_statistics_core', localVars,globalVars, options_.parallel_info);
|
|
|
|
end
|
|
ifil = fout(end).ifil;
|
|
|
|
stock_gend=gend;
|
|
stock_data=Y;
|
|
save([DirectoryName '/' M_.fname '_data.mat'],'stock_gend','stock_data');
|
|
|
|
if strcmpi(type,'gsa')
|
|
return
|
|
end
|
|
|
|
if ~isnumeric(options_.parallel),
|
|
leaveSlaveOpen = options_.parallel_info.leaveSlaveOpen;
|
|
if options_.parallel_info.leaveSlaveOpen == 0,
|
|
% Commenting for testing!!!
|
|
options_.parallel_info.leaveSlaveOpen = 1; % Force locally to leave open remote matlab sessions (repeated pm3 calls)
|
|
end
|
|
end
|
|
|
|
if options_.smoother
|
|
pm3(endo_nbr,gend,ifil(1),B,'Smoothed variables',...
|
|
'',varlist, M_.endo_names_tex,M_.endo_names,...
|
|
varlist,'SmoothedVariables',DirectoryName,'_smooth');
|
|
pm3(exo_nbr,gend,ifil(2),B,'Smoothed shocks',...
|
|
'',M_.exo_names,M_.exo_names_tex,M_.exo_names,...
|
|
M_.exo_names,'SmoothedShocks',DirectoryName,'_inno');
|
|
pm3(endo_nbr,1,ifil(9),B,'Trend_coefficients',...
|
|
'',varlist,M_.endo_names_tex,M_.endo_names,...
|
|
varlist,'TrendCoeff',DirectoryName,'_trend_coeff');
|
|
pm3(endo_nbr,gend,ifil(10),B,'Smoothed constant',...
|
|
'',varlist,M_.endo_names_tex,M_.endo_names,...
|
|
varlist,'Constant',DirectoryName,'_smoothed_constant');
|
|
pm3(endo_nbr,gend,ifil(11),B,'Smoothed trend',...
|
|
'',varlist,M_.endo_names_tex,M_.endo_names,...
|
|
varlist,'Trend',DirectoryName,'_smoothed_trend');
|
|
pm3(endo_nbr,gend,ifil(1),B,'Updated Variables',...
|
|
'',varlist,M_.endo_names_tex,M_.endo_names,...
|
|
varlist,'UpdatedVariables',DirectoryName, ...
|
|
'_update');
|
|
if smoothed_state_uncertainty
|
|
pm3(endo_nbr,endo_nbr,ifil(13),B,'State Uncertainty',...
|
|
'',varlist,M_.endo_names_tex,M_.endo_names,...
|
|
varlist,'StateUncertainty',DirectoryName,'_state_uncert');
|
|
end
|
|
|
|
if nvn
|
|
for obs_iter=1:length(options_.varobs)
|
|
meas_error_names{obs_iter,1}=['SE_EOBS_' M_.endo_names{strmatch(options_.varobs{obs_iter},M_.endo_names,'exact')}];
|
|
texnames{obs_iter,1}=['SE_EOBS_' M_.endo_names_tex{strmatch(options_.varobs{obs_iter},M_.endo_names,'exact')}];
|
|
end
|
|
pm3(meas_err_nbr,gend,ifil(3),B,'Smoothed measurement errors',...
|
|
'',meas_error_names,texnames,meas_error_names,...
|
|
meas_error_names,'SmoothedMeasurementErrors',DirectoryName,'_error')
|
|
end
|
|
end
|
|
|
|
if options_.filtered_vars
|
|
pm3(endo_nbr,gend,ifil(4),B,'One step ahead forecast (filtered variables)',...
|
|
'',varlist,M_.endo_names_tex,M_.endo_names,...
|
|
varlist,'FilteredVariables',DirectoryName,'_filter_step_ahead');
|
|
end
|
|
|
|
if options_.forecast
|
|
pm3(endo_nbr,horizon,ifil(6),B,'Forecasted variables (mean)',...
|
|
'',varlist,M_.endo_names_tex,M_.endo_names,...
|
|
varlist,'MeanForecast',DirectoryName,'_forc_mean');
|
|
pm3(endo_nbr,horizon,ifil(7),B,'Forecasted variables (point)',...
|
|
'',varlist,M_.endo_names_tex,M_.endo_names,...
|
|
varlist,'PointForecast',DirectoryName,'_forc_point');
|
|
if ~isequal(M_.H,0) && ~isempty(intersect(options_.varobs,varlist))
|
|
texnames = cell(length(options_.varobs), 1);
|
|
obs_names = cell(length(options_.varobs), 1);
|
|
for obs_iter=1:length(options_.varobs)
|
|
obs_names{obs_iter}=M_.endo_names{strmatch(options_.varobs{obs_iter},M_.endo_names,'exact')};
|
|
texnames{obs_iter}=M_.endo_names_tex{strmatch(options_.varobs{obs_iter},M_.endo_names,'exact')};
|
|
end
|
|
varlist_forecast_ME=intersect(options_.varobs,varlist);
|
|
pm3(meas_err_nbr,horizon,ifil(12),B,'Forecasted variables (point) with ME',...
|
|
'',varlist_forecast_ME,texnames,obs_names,...
|
|
varlist_forecast_ME,'PointForecastME',DirectoryName,'_forc_point_ME')
|
|
end
|
|
end
|
|
|
|
if options_.filter_covariance
|
|
pm3(endo_nbr,endo_nbr,ifil(8),B,'Filtered covariances',...
|
|
'',varlist,M_.endo_names_tex,M_.endo_names,...
|
|
varlist,'FilterCovariance',DirectoryName,'_filter_covar');
|
|
end
|
|
|
|
|
|
if ~isnumeric(options_.parallel)
|
|
options_.parallel_info.leaveSlaveOpen = leaveSlaveOpen;
|
|
if leaveSlaveOpen == 0
|
|
closeSlave(options_.parallel,options_.parallel_info.RemoteTmpFolder),
|
|
end
|
|
end |