dynare/matlab/dyn_forecast.m

160 lines
5.4 KiB
Matlab
Raw Normal View History

function [forecast,info] = dyn_forecast(var_list,M,options,oo,task,dataset_info)
% function dyn_forecast(var_list,M,options,oo,task,dataset_info)
% computes mean forecast for a given value of the parameters
% computes also confidence band for the forecast
%
% INPUTS
% var_list: list of variables (character matrix)
% M: Dynare model structure
% options: Dynare options structure
% oo: Dynare results structure
% task: indicates how to initialize the forecast
% either 'simul' or 'smoother'
% dataset_info: Various informations about the dataset (descriptive statistics and missing observations).
% OUTPUTS
% nothing is returned but the procedure saves output
% in oo_.forecast.Mean
% oo_.forecast.HPDinf
% oo_.forecast.HPDsup
%
% SPECIAL REQUIREMENTS
% none
% Copyright (C) 2003-2016 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/>.
if nargin<3 && options_.prefilter
error('The prefiltering option is not allow without providing a dataset')
else
mean_varobs=dataset_info.descriptive.mean';
end
info = 0;
oo=make_ex_(M,options,oo);
maximum_lag = M.maximum_lag;
endo_names = M.endo_names;
if isempty(var_list)
var_list = endo_names(1:M.orig_endo_nbr, :);
end
i_var = [];
for i = 1:size(var_list)
tmp = strmatch(var_list(i,:),endo_names,'exact');
if isempty(tmp)
error([var_list(i,:) ' isn''t and endogenous variable'])
end
i_var = [i_var; tmp];
end
n_var = length(i_var);
trend = 0;
switch task
case 'simul'
horizon = options.periods;
if horizon == 0
horizon = 5;
end
if isempty(M.endo_histval)
y0 = repmat(oo.dr.ys,1,maximum_lag);
else
y0 = M.endo_histval;
end
case 'smoother'
horizon = options.forecast;
y_smoothed = oo.SmoothedVariables;
y0 = zeros(M.endo_nbr,maximum_lag);
for i = 1:M.endo_nbr
v_name = deblank(M.endo_names(i,:));
y0(i,:) = y_smoothed.(v_name)(end-maximum_lag+1:end)+oo.dr.ys(i); %does not need to be logged in loglinear case, because simult_ will subtract unlooged steady state
end
gend = options.nobs;
if isfield(oo.Smoother,'TrendCoeffs')
var_obs = options.varobs;
endo_names = M.endo_names;
order_var = oo.dr.order_var;
i_var_obs = [];
trend_coeffs = [];
for i=1:length(var_obs)
tmp = strmatch(var_obs{i},endo_names(i_var,:),'exact');
if ~isempty(tmp)
i_var_obs = [ i_var_obs; tmp];
trend_coeffs = [trend_coeffs; oo.Smoother.TrendCoeffs(i)];
end
end
if ~isempty(trend_coeffs)
trend = trend_coeffs*(options.first_obs+gend-1+(1-M.maximum_lag:horizon));
end
end
if options.prefilter
trend = trend - repmat(mean(trend_coeffs*[options.first_obs:options.first_obs+gend-1],2),1,horizon+1); %subtract mean trend
end
otherwise
error('Wrong flag value')
end
if M.exo_det_nbr == 0
[yf,int_width] = forcst(oo.dr,y0,horizon,var_list);
else
exo_det_length = size(oo.exo_det_simul,1)-M.maximum_lag;
if horizon > exo_det_length
ex = zeros(horizon,M.exo_nbr);
oo.exo_det_simul = [ oo.exo_det_simul;...
repmat(oo.exo_det_steady_state',...
horizon- ...
exo_det_length,1)];
elseif horizon < exo_det_length
ex = zeros(exo_det_length,M.exo_nbr);
end
[yf,int_width] = simultxdet(y0,ex,oo.exo_det_simul,...
options.order,var_list,M,oo,options);
end
if ~isscalar(trend)
yf(i_var_obs,:) = yf(i_var_obs,:) + trend;
end
if options.loglinear == 1
yf=yf-oo.dr.ys(i_var)*ones(1,horizon+M.maximum_lag)+log(oo.dr.ys(i_var))*ones(1,horizon+M.maximum_lag); %take care of logged steady state in this case; above the unlogged one was added
if options.prefilter == 1 %subtract steady state and add mean for observables
yf(i_var_obs,:)=yf(i_var_obs,:)-repmat(log(oo.dr.ys(i_var_obs)),1,horizon+M.maximum_lag)+ repmat(bayestopt_.mean_varobs,1,horizon+M.maximum_lag);
end
else
if options.prefilter == 1 %subtract steady state and add mean for observables
yf(i_var_obs,:)=yf(i_var_obs,:)-repmat(oo.dr.ys(i_var_obs),1,horizon+M.maximum_lag)+ repmat(bayestopt_.mean_varobs,1,horizon+M.maximum_lag);
end
end
for i=1:n_var
vname = deblank(var_list(i,:));
forecast.Mean.(vname) = yf(i,maximum_lag+(1:horizon))';
forecast.HPDinf.(vname)= yf(i,maximum_lag+(1:horizon))' - int_width(1:horizon,i);
forecast.HPDsup.(vname) = yf(i,maximum_lag+(1:horizon))' + int_width(1:horizon,i);
end
for i=1:M.exo_det_nbr
forecast.Exogenous.(deblank(M.exo_det_names(i,:))) = oo.exo_det_simul(maximum_lag+(1:horizon),i);
end
if options.nograph == 0
oo.forecast = forecast;
forecast_graphs(var_list,M, oo,options)
end