Add new command "calib_smoother"

Closes: #233
time-shift
Sébastien Villemot 2012-05-30 16:28:00 +02:00
parent 312814062f
commit 7044c8da2b
10 changed files with 166 additions and 15 deletions

View File

@ -4520,6 +4520,42 @@ See @file{bvar-a-la-sims.pdf}, which comes with Dynare distribution,
for more information on this command.
@end deffn
@deffn Command calib_smoother [@var{VARIABLE_NAME}]@dots{};
@deffnx Command calib_smoother (@var{OPTIONS}@dots{}) [@var{VARIABLE_NAME}]@dots{};
@descriptionhead
This command computes the smoothed variables (and possible the filtered
variables) on a @code{calibrated} model.
A datafile must be provided, and the observable variables declared with
@code{varobs}.
@vindex{oo_.SmoothedVariables}
@vindex{oo_.SmoothedShocks}
@vindex{oo_.UpdatedVariables}
By default, the command computes the smoothed variables and shocks and stores the
results in @code{oo_.SmoothedVariables} and
@code{oo_.SmoothedShocks}. It also fills @code{oo_.UpdatedVariables}.
@optionshead
@table @code
@item datafile = @var{FILENAME}
@xref{datafile}.
@item filtered_vars
Triggers the computation of filtered variables. @xref{filtered_vars} for
more details.
@item filter_step_ahead = [@var{INTEGER1}:@var{INTEGER2}]
@xref{filter_step_ahead}.
@end table
@end deffn
@node Forecasting
@section Forecasting

View File

@ -56,7 +56,7 @@ end
if isempty(varlist)
disp(' ')
disp(['You did not declare endogenous variables after the estimation command.'])
disp(['You did not declare endogenous variables after the estimation/calib_smoother command.'])
cas = [];
if options_.bayesian_irf
cas = 'Posterior IRFs';
@ -70,30 +70,23 @@ if isempty(varlist)
end
if options_.smoother
if isempty(cas)
cas = 'Posterior smoothed variables';
cas = 'Smoothed variables';
else
cas = [ cas , ', posterior smoothed variables'];
end
end
if options_.smoother
if isempty(cas)
cas = 'Posterior smoothed variables';
else
cas = [ cas , ', posterior smoothed variables'];
cas = [ cas , ', smoothed variables'];
end
end
if ~isempty(options_.filter_step_ahead)
if isempty(cas)
cas = 'Posterior k-step ahead filtered variables';
cas = 'k-step ahead filtered variables';
else
cas = [ cas , ', posterior k-step ahead filtered variables'];
cas = [ cas , ', k-step ahead filtered variables'];
end
end
if options_.forecast
if isempty(cas)
cas = 'Posterior forecasts';
cas = 'Forecasts';
else
cas = [ cas , ' and posterior forecats'];
cas = [ cas , ' and forecats'];
end
end
if ~isempty(cas)

View File

@ -2300,3 +2300,19 @@ OptionsEqualStatement::writeOutput(ostream &output, const string &basename) cons
output << lhs_field << " = " << rhs_field << ";" << endl;
}
CalibSmootherStatement::CalibSmootherStatement(const SymbolList &symbol_list_arg,
const OptionsList &options_list_arg)
: symbol_list(symbol_list_arg), options_list(options_list_arg)
{
}
void
CalibSmootherStatement::writeOutput(ostream &output, const string &basename) const
{
options_list.writeOutput(output);
symbol_list.writeOutput("var_list_", output);
output << "options_.mode_compute = 0;" << endl
<< "options_.smoother = 1;" << endl
<< "dynare_estimation(var_list_);" << endl;
}

View File

@ -508,6 +508,17 @@ public:
virtual void writeOutput(ostream &output, const string &basename) const;
};
class CalibSmootherStatement : public Statement
{
private:
const SymbolList symbol_list;
const OptionsList options_list;
public:
CalibSmootherStatement(const SymbolList &symbol_list_arg,
const OptionsList &options_list_arg);
virtual void writeOutput(ostream &output, const string &basename) const;
};
class SvarIdentificationStatement : public Statement
{
public:

View File

@ -95,7 +95,7 @@ class ParsingDriver;
%token BVAR_PRIOR_DECAY BVAR_PRIOR_FLAT BVAR_PRIOR_LAMBDA
%token BVAR_PRIOR_MU BVAR_PRIOR_OMEGA BVAR_PRIOR_TAU BVAR_PRIOR_TRAIN
%token BVAR_REPLIC BYTECODE
%token CHANGE_TYPE CHECK CONDITIONAL_FORECAST CONDITIONAL_FORECAST_PATHS CONF_SIG CONSTANT CONTROLLED_VAREXO CORR COVAR CUTOFF
%token CALIB_SMOOTHER CHANGE_TYPE CHECK CONDITIONAL_FORECAST CONDITIONAL_FORECAST_PATHS CONF_SIG CONSTANT CONTROLLED_VAREXO CORR COVAR CUTOFF
%token DATAFILE FILE DOUBLING DR_ALGO DROP DSAMPLE DYNASAVE DYNATYPE CALIBRATION
%token END ENDVAL EQUAL ESTIMATION ESTIMATED_PARAMS ESTIMATED_PARAMS_BOUNDS ESTIMATED_PARAMS_INIT
%token FILENAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS LAST_OBS SET_TIME
@ -268,6 +268,7 @@ statement : parameters
| ms_forecast
| ms_irf
| ms_variance_decomposition
| calib_smoother
;
dsample : DSAMPLE INT_NUMBER ';'
@ -2113,6 +2114,25 @@ steady_state_equation : symbol EQUAL expression ';'
{ driver.add_steady_state_model_equal_multiple($5); }
;
calib_smoother : CALIB_SMOOTHER ';'
{ driver.calib_smoother(); }
| CALIB_SMOOTHER '(' calib_smoother_options_list ')' ';'
{ driver.calib_smoother(); }
| CALIB_SMOOTHER symbol_list ';'
{ driver.calib_smoother(); }
| CALIB_SMOOTHER '(' calib_smoother_options_list ')' symbol_list ';'
{ driver.calib_smoother(); }
;
calib_smoother_options_list : calib_smoother_option COMMA calib_smoother_options_list
| calib_smoother_option
;
calib_smoother_option : o_filtered_vars
| o_filter_step_ahead
| o_datafile
;
o_dr_algo : DR_ALGO EQUAL INT_NUMBER {
if (*$3 == string("0"))
driver.warning("dr_algo option is now deprecated, and may be removed in a future version of Dynare");

View File

@ -156,6 +156,7 @@ string eofbuff;
<INITIAL>svar {BEGIN DYNARE_STATEMENT; return token::SVAR;}
<INITIAL>external_function {BEGIN DYNARE_STATEMENT; return token::EXTERNAL_FUNCTION;}
/* End of a Dynare statement */
<INITIAL>calib_smoother { BEGIN DYNARE_STATEMENT; return token::CALIB_SMOOTHER; }
<DYNARE_STATEMENT>; {
if (!sigma_e)

View File

@ -1932,6 +1932,14 @@ ParsingDriver::conditional_forecast_paths()
det_shocks.clear();
}
void
ParsingDriver::calib_smoother()
{
mod_file->addStatement(new CalibSmootherStatement(symbol_list, options_list));
symbol_list.clear();
options_list.clear();
}
expr_t
ParsingDriver::add_model_equal(expr_t arg1, expr_t arg2)
{

View File

@ -514,6 +514,8 @@ public:
void conditional_forecast_paths();
//! Plot conditional forecast statement
void plot_conditional_forecast(string *periods = NULL);
//! Smoother on calibrated models
void calib_smoother();
//! Writes token "arg1=arg2" to model tree
expr_t add_model_equal(expr_t arg1, expr_t arg2);
//! Writes token "arg=0" to model tree

View File

@ -22,6 +22,7 @@ MODFILES = \
predetermined_variables.mod \
fs2000_nonstationary.mod \
fs2000_ssfile.mod \
fs2000_calib.mod \
comments.mod \
histval_sto.mod \
histval_det.mod \

View File

@ -0,0 +1,63 @@
// See fs2000.mod in the examples/ directory for details on the model
var m P c e W R k d n l gy_obs gp_obs y dA;
varexo e_a e_m;
parameters alp bet gam mst rho psi del;
alp = 0.33;
bet = 0.99;
gam = 0.003;
mst = 1.011;
rho = 0.7;
psi = 0.787;
del = 0.02;
model;
dA = exp(gam+e_a);
log(m) = (1-rho)*log(mst) + rho*log(m(-1))+e_m;
-P/(c(+1)*P(+1)*m)+bet*P(+1)*(alp*exp(-alp*(gam+log(e(+1))))*k^(alp-1)*n(+1)^(1-alp)+(1-del)*exp(-(gam+log(e(+1)))))/(c(+2)*P(+2)*m(+1))=0;
W = l/n;
-(psi/(1-psi))*(c*P/(1-n))+l/n = 0;
R = P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(-alp)/W;
1/(c*P)-bet*P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)/(m*l*c(+1)*P(+1)) = 0;
c+k = exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)+(1-del)*exp(-(gam+e_a))*k(-1);
P*c = m;
m-1+d = l;
e = exp(e_a);
y = k(-1)^alp*n^(1-alp)*exp(-alp*(gam+e_a));
gy_obs = dA*y/y(-1);
gp_obs = (P/P(-1))*m(-1)/dA;
end;
initval;
k = 6;
m = mst;
P = 2.25;
c = 0.45;
e = 1;
W = 4;
R = 1.02;
d = 0.85;
n = 0.19;
l = 0.86;
y = 0.6;
gy_obs = exp(gam);
gp_obs = exp(-gam);
dA = exp(gam);
end;
shocks;
var e_a; stderr 0.014;
var e_m; stderr 0.005;
end;
steady;
check;
varobs gp_obs gy_obs;
calib_smoother(datafile=fsdat_simul, filtered_vars, filter_step_ahead = [3:4]) m P c e W R k d n l y dA;