2015-03-02 10:45:12 +01:00
function [forecast,info] = dyn_forecast ( var_list,M,options,oo,task,dataset_info)
% function dyn_forecast(var_list,M,options,oo,task,dataset_info)
2009-12-16 18:17:34 +01:00
% 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)
2016-03-11 16:01:21 +01:00
% M: Dynare model structure
% options: Dynare options structure
% oo: Dynare results structure
2009-12-16 18:17:34 +01:00
% task: indicates how to initialize the forecast
% either 'simul' or 'smoother'
2015-03-02 10:45:12 +01:00
% dataset_info: Various informations about the dataset (descriptive statistics and missing observations).
2009-12-16 18:17:34 +01:00
% OUTPUTS
% nothing is returned but the procedure saves output
% in oo_.forecast.Mean
% oo_.forecast.HPDinf
% oo_.forecast.HPDsup
%
% SPECIAL REQUIREMENTS
% none
2016-03-11 16:01:21 +01:00
% Copyright (C) 2003-2016 Dynare Team
2009-12-16 18:17:34 +01:00
%
% 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/>.
2015-03-02 10:45:12 +01:00
if nargin < 3 && options_ . prefilter
error ( ' The prefiltering option is not allow without providing a dataset' )
else
mean_varobs = dataset_info . descriptive . mean ' ;
end
2009-12-16 18:17:34 +01:00
info = 0 ;
2016-03-11 16:01:21 +01:00
oo = make_ex_ ( M , options , oo ) ;
2015-02-15 17:49:01 +01:00
2015-11-24 20:55:33 +01:00
maximum_lag = M . maximum_lag ;
2009-12-16 18:17:34 +01:00
2015-11-24 20:55:33 +01:00
endo_names = M . endo_names ;
2009-12-16 18:17:34 +01:00
if isempty ( var_list )
2015-11-24 20:55:33 +01:00
var_list = endo_names ( 1 : M . orig_endo_nbr , : ) ;
2009-12-16 18:17:34 +01:00
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'
2015-11-24 20:55:33 +01:00
horizon = options . periods ;
2009-12-16 18:17:34 +01:00
if horizon == 0
horizon = 5 ;
end
2015-11-24 20:55:33 +01:00
if isempty ( M . endo_histval )
y0 = repmat ( oo . dr . ys , 1 , maximum_lag ) ;
2009-12-16 18:17:34 +01:00
else
2015-11-24 20:55:33 +01:00
y0 = M . endo_histval ;
2009-12-16 18:17:34 +01:00
end
case ' smoother'
2015-11-24 20:55:33 +01:00
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 , : ) ) ;
2015-03-01 14:25:28 +01:00
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
2009-12-16 18:17:34 +01:00
end
2015-11-24 20:55:33 +01:00
gend = options . nobs ;
if isfield ( oo . Smoother , ' TrendCoeffs' )
var_obs = options . varobs ;
endo_names = M . endo_names ;
order_var = oo . dr . order_var ;
2009-12-16 18:17:34 +01:00
i_var_obs = [ ] ;
trend_coeffs = [ ] ;
2013-05-21 16:38:17 +02:00
for i = 1 : length ( var_obs )
tmp = strmatch ( var_obs { i } , endo_names ( i_var , : ) , ' exact' ) ;
2009-12-16 18:17:34 +01:00
if ~ isempty ( tmp )
i_var_obs = [ i_var_obs ; tmp ] ;
2015-11-24 20:55:33 +01:00
trend_coeffs = [ trend_coeffs ; oo . Smoother . TrendCoeffs ( i ) ] ;
2009-12-16 18:17:34 +01:00
end
2013-03-19 19:04:03 +01:00
end
if ~ isempty ( trend_coeffs )
2015-03-01 15:12:34 +01:00
trend = trend_coeffs * ( options . first_obs + gend - 1 + ( 1 - M . maximum_lag : horizon ) ) ;
2013-03-19 19:04:03 +01:00
end
2009-12-16 18:17:34 +01:00
end
2015-03-01 15:12:34 +01:00
if options . prefilter
trend = trend - repmat ( mean ( trend_coeffs * [ options . first_obs : options . first_obs + gend - 1 ] , 2 ) , 1 , horizon + 1 ) ; %subtract mean trend
2009-12-16 18:17:34 +01:00
end
otherwise
error ( ' Wrong flag value' )
end
2015-11-24 20:55:33 +01:00
if M . exo_det_nbr == 0
[ yf , int_width ] = forcst ( oo . dr , y0 , horizon , var_list ) ;
2009-12-16 18:17:34 +01:00
else
2015-11-24 20:55:33 +01:00
exo_det_length = size ( oo . exo_det_simul , 1 ) - M . maximum_lag ;
2009-12-16 18:17:34 +01:00
if horizon > exo_det_length
2015-11-24 20:55:33 +01:00
ex = zeros ( horizon , M . exo_nbr ) ;
oo . exo_det_simul = [ oo . exo_det_simul ; ...
repmat ( oo . exo_det_steady_state ' , ...
2009-12-16 18:17:34 +01:00
horizon - ...
exo_det_length , 1 ) ] ;
elseif horizon < exo_det_length
2015-11-24 20:55:33 +01:00
ex = zeros ( exo_det_length , M . exo_nbr ) ;
2009-12-16 18:17:34 +01:00
end
2015-11-24 20:55:33 +01:00
[ yf , int_width ] = simultxdet ( y0 , ex , oo . exo_det_simul , ...
options . order , var_list , M , oo , options ) ;
2009-12-16 18:17:34 +01:00
end
if ~ isscalar ( trend )
yf ( i_var_obs , : ) = yf ( i_var_obs , : ) + trend ;
end
2015-03-01 14:25:28 +01:00
if options . loglinear == 1
2015-03-01 15:12:34 +01:00
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
2015-03-01 14:25:28 +01:00
end
2009-12-16 18:17:34 +01:00
for i = 1 : n_var
2015-11-24 20:55:33 +01:00
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 ) ;
2009-12-16 18:17:34 +01:00
end
2015-11-24 20:55:33 +01:00
for i = 1 : M . exo_det_nbr
forecast . Exogenous . ( deblank ( M . exo_det_names ( i , : ) ) ) = oo . exo_det_simul ( maximum_lag + ( 1 : horizon ) , i ) ;
2009-12-16 18:17:34 +01:00
end
2015-11-24 20:55:33 +01:00
if options . nograph == 0
2015-11-30 21:30:42 +01:00
oo . forecast = forecast ;
2015-11-24 20:55:33 +01:00
forecast_graphs ( var_list , M , oo , options )
2009-12-16 18:17:34 +01:00
end