From 9bea42f41162eb1049ec5be06d64d6898fcd7a5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Wed, 6 Jun 2012 17:06:28 +0200 Subject: [PATCH] order=2 in estimation command now triggers particle filter --- matlab/dynare_estimation_1.m | 4 +- preprocessor/ComputingTasks.cc | 22 ++++++++- tests/Makefile.am | 1 + tests/fs2000/fs2000_particle.mod | 76 ++++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 tests/fs2000/fs2000_particle.mod diff --git a/matlab/dynare_estimation_1.m b/matlab/dynare_estimation_1.m index e4e899392..0264a9003 100644 --- a/matlab/dynare_estimation_1.m +++ b/matlab/dynare_estimation_1.m @@ -40,9 +40,7 @@ if options_.order > 1 elseif options_.particle.status && options_.order>2 error(['Non linear filter are not implemented with order ' int2str(options_.order) ' approximation of the model!']) elseif ~options_.particle.status && options_.order==2 - disp('If you want to estimate the model with a second order approximation using a non linear filter, set options_.particle.status=1;') - disp('I set order=1!') - options_.order=1; + error('For estimating the model with a second order approximation using a non linear filter, one should have options_.particle.status=1;') else error(['Cannot estimate a model with an order ' int2str(options_.order) ' approximation!']) end diff --git a/preprocessor/ComputingTasks.cc b/preprocessor/ComputingTasks.cc index a77d0e28c..25823649f 100644 --- a/preprocessor/ComputingTasks.cc +++ b/preprocessor/ComputingTasks.cc @@ -276,8 +276,18 @@ EstimationStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsoli // Fill in option_order of mod_file_struct OptionsList::num_options_t::const_iterator it = options_list.num_options.find("order"); if (it != options_list.num_options.end()) - mod_file_struct.order_option = max(mod_file_struct.order_option, atoi(it->second.c_str())); - + { + int order = atoi(it->second.c_str()); + + if (order > 2) + { + cerr << "ERROR: order > 2 is not supported in estimation" << endl; + exit(EXIT_FAILURE); + } + + mod_file_struct.order_option = max(mod_file_struct.order_option, order); + } + // Fill in mod_file_struct.partial_information it = options_list.num_options.find("partial_information"); if (it != options_list.num_options.end() && it->second == "1") @@ -334,6 +344,14 @@ void EstimationStatement::writeOutput(ostream &output, const string &basename) const { options_list.writeOutput(output); + + // Special treatment for order option and particle filter + OptionsList::num_options_t::const_iterator it = options_list.num_options.find("order"); + if (it == options_list.num_options.end()) + output << "options_.order = 1;" << endl; + else if (atoi(it->second.c_str()) == 2) + output << "options_.particle.status = 1;" << endl; + symbol_list.writeOutput("var_list_", output); output << "dynare_estimation(var_list_);\n"; } diff --git a/tests/Makefile.am b/tests/Makefile.am index ad2110dea..cdd6945c0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -65,6 +65,7 @@ MODFILES = \ fs2000/fs2000_cmaes.mod \ fs2000/fs2000_calib.mod \ fs2000/fs2000_analytic_derivation.mod \ + fs2000/fs2000_particle.mod \ homotopy/homotopy1_test.mod \ homotopy/homotopy2_test.mod \ homotopy/homotopy3_test.mod \ diff --git a/tests/fs2000/fs2000_particle.mod b/tests/fs2000/fs2000_particle.mod new file mode 100644 index 000000000..ea87fb38d --- /dev/null +++ b/tests/fs2000/fs2000_particle.mod @@ -0,0 +1,76 @@ +// 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; + +estimated_params; +alp, beta_pdf, 0.356, 0.02; +bet, beta_pdf, 0.993, 0.002; +gam, normal_pdf, 0.0085, 0.003; +mst, normal_pdf, 1.0002, 0.007; +rho, beta_pdf, 0.129, 0.223; +psi, beta_pdf, 0.65, 0.05; +del, beta_pdf, 0.01, 0.005; +stderr e_a, inv_gamma_pdf, 0.035449, inf; +stderr e_m, inv_gamma_pdf, 0.008862, inf; +end; + +varobs gp_obs gy_obs; + +options_.solve_tolf = 1e-12; + +/* Not computing the mode because it is very expensive, just running a small MH */ +estimation(order=2,mode_compute=0,datafile=fsdat_simul,nobs=192,loglinear,mh_replic=50);