diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc index 56b6d52b593bf08005f9dc09eaf0a9110bf14d4e..b8f558fbdf6dfc834cc8f592c858f76c231c1dc3 100644 --- a/src/ComputingTasks.cc +++ b/src/ComputingTasks.cc @@ -4738,20 +4738,35 @@ MethodOfMomentsStatement::checkPass(ModFileStructure &mod_file_struct, WarningCo if (order > 2) mod_file_struct.k_order_solver = true; + mod_file_struct.mom_order = order; mod_file_struct.order_option = max(mod_file_struct.order_option, order); } if (options_list.string_options.find("datafile") == options_list.string_options.end()) - { - cerr << "ERROR: The method_of_moments statement requires a data file to be supplied via the datafile option." << endl; - exit(EXIT_FAILURE); - } + { + cerr << "ERROR: The method_of_moments statement requires a data file to be supplied via the datafile option." << endl; + exit(EXIT_FAILURE); + } if (options_list.string_options.find("mom.mom_method") == options_list.string_options.end()) - { - cerr << "ERROR: The method_of_moments statement requires a method to be supplied via the mom_method option. Possible values are GMM or SMM." << endl; - exit(EXIT_FAILURE); - } + { + cerr << "ERROR: The method_of_moments statement requires a method to be supplied via the mom_method option. Possible values are GMM or SMM." << endl; + exit(EXIT_FAILURE); + } + + if (auto it = options_list.string_options.find("mom.mom_method"); + it != options_list.string_options.end() && it->second == "GMM") + mod_file_struct.GMM_present = true; + + if (auto it = options_list.num_options.find("mom.analytic_standard_errors"); + it != options_list.num_options.end() && it->second == "true") + mod_file_struct.analytic_standard_errors_present = true; + + if (!mod_file_struct.GMM_present && mod_file_struct.analytic_standard_errors_present) + { + cerr << "ERROR: The analytic_standard_errors statement requires the GMM option." << endl; + exit(EXIT_FAILURE); + } } void diff --git a/src/DynareBison.yy b/src/DynareBison.yy index b72672488d058fb2ed176ed4a894f4a1f41ffb56..806df45de7febd39b96dbed334c640f330b3cf85 100644 --- a/src/DynareBison.yy +++ b/src/DynareBison.yy @@ -141,8 +141,8 @@ class ParsingDriver; %token VLISTLOG VLISTPER SPECTRAL_DENSITY INIT2SHOCKS %token RESTRICTION RESTRICTION_FNAME CROSS_RESTRICTIONS NLAGS CONTEMP_REDUCED_FORM REAL_PSEUDO_FORECAST %token DUMMY_OBS NSTATES INDXSCALESSTATES NO_BAYESIAN_PRIOR SPECIFICATION SIMS_ZHA -%token <string> ALPHA BETA ABAND NINV CMS NCMS CNUM GAMMA INV_GAMMA INV_GAMMA1 INV_GAMMA2 NORMAL UNIFORM EPS PDF FIG DR NONE PRIOR PRIOR_VARIANCE HESSIAN IDENTITY_MATRIX DIRICHLET DIAGONAL OPTIMAL GMM SMM -%token GSIG2_LMDM Q_DIAG FLAT_PRIOR NCSK NSTD WEIBULL WEIBULL_PDF +%token <string> ALPHA BETA ABAND NINV CMS NCMS CNUM GAMMA INV_GAMMA INV_GAMMA1 INV_GAMMA2 NORMAL UNIFORM EPS PDF FIG DR NONE PRIOR PRIOR_VARIANCE HESSIAN IDENTITY_MATRIX DIRICHLET DIAGONAL OPTIMAL +%token GSIG2_LMDM Q_DIAG FLAT_PRIOR NCSK NSTD WEIBULL WEIBULL_PDF GMM SMM %token INDXPARR INDXOVR INDXAP APBAND INDXIMF INDXFORE FOREBAND INDXGFOREHAT INDXGIMFHAT %token INDXESTIMA INDXGDLS EQ_MS FILTER_COVARIANCE FILTER_DECOMPOSITION SMOOTHED_STATE_UNCERTAINTY %token EQ_CMS TLINDX TLNUMBER RESTRICTIONS POSTERIOR_SAMPLER_OPTIONS @@ -167,7 +167,7 @@ class ParsingDriver; %token RANDOM_FUNCTION_CONVERGENCE_CRITERION RANDOM_PARAMETER_CONVERGENCE_CRITERION /* Method of Moments */ %token METHOD_OF_MOMENTS MOM_METHOD -%token BARTLETT_KERNEL_LAG WEIGHTING_MATRIX WEIGHTING_MATRIX_SCALING_FACTOR PENALIZED_ESTIMATOR VERBOSE +%token BARTLETT_KERNEL_LAG WEIGHTING_MATRIX WEIGHTING_MATRIX_SCALING_FACTOR ANALYTIC_STANDARD_ERRORS PENALIZED_ESTIMATOR VERBOSE %token SIMULATION_MULTIPLE MOM_SEED SEED BOUNDED_SHOCK_SUPPORT ADDITIONAL_OPTIMIZER_STEPS MOM_SE_TOLX SE_TOLX MOM_BURNIN BURNIN %token EQTAGS STEADY_STATE_GROWTH %token ANALYTICAL_GIRF IRF_IN_PERCENT EMAS_GIRF EMAS_DROP EMAS_TOLF EMAS_MAX_ITER @@ -1289,6 +1289,7 @@ method_of_moments_option : o_mom_method | o_verbose | o_weighting_matrix | o_weighting_matrix_scaling_factor + | o_analytic_standard_errors | o_additional_optimizer_steps | o_prefilter | o_bounded_shock_support @@ -3704,10 +3705,12 @@ o_weighting_matrix : WEIGHTING_MATRIX EQUAL vec_str { driver.option_vec_cellstr( o_weighting_matrix_scaling_factor : WEIGHTING_MATRIX_SCALING_FACTOR EQUAL non_negative_number { driver.option_num("mom.weighting_matrix_scaling_factor", $3); }; +o_analytic_standard_errors : ANALYTIC_STANDARD_ERRORS { driver.option_num("mom.analytic_standard_errors", "true"); }; + o_mom_method : MOM_METHOD EQUAL GMM - { driver.option_str("mom.mom_method", $3); } + { driver.option_str("mom.mom_method", "GMM"); } | MOM_METHOD EQUAL SMM - { driver.option_str("mom.mom_method", $3); } + { driver.option_str("mom.mom_method", "SMM"); } ; o_penalized_estimator : PENALIZED_ESTIMATOR { driver.option_num("mom.penalized_estimator", "true"); }; o_verbose : VERBOSE { driver.option_num("mom.verbose", "true"); }; diff --git a/src/DynareFlex.ll b/src/DynareFlex.ll index 5b5c6b8446a921139a2b10ff2521576c6431ec93..a5a4929c72d1c7868dbf4049eca2de5a5653226b 100644 --- a/src/DynareFlex.ll +++ b/src/DynareFlex.ll @@ -686,6 +686,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]) } <DYNARE_STATEMENT>weighting_matrix {return token::WEIGHTING_MATRIX; } <DYNARE_STATEMENT>weighting_matrix_scaling_factor {return token::WEIGHTING_MATRIX_SCALING_FACTOR; } +<DYNARE_STATEMENT>analytic_standard_errors {return token::ANALYTIC_STANDARD_ERRORS; } <DYNARE_STATEMENT>mom_method {return token::MOM_METHOD; } <DYNARE_STATEMENT>penalized_estimator {return token::PENALIZED_ESTIMATOR; } <DYNARE_STATEMENT>verbose {return token::VERBOSE; } diff --git a/src/ModFile.cc b/src/ModFile.cc index 0752b5daa36d1dff5a9db51c3d4a38f926f5d062..16e1e723d4e230f47b574c354603bf3044478223 100644 --- a/src/ModFile.cc +++ b/src/ModFile.cc @@ -748,10 +748,13 @@ ModFile::computingPass(bool no_tmp_terms, FileOutputType output, int params_deri int derivsOrder = 1; int paramsDerivsOrder = 0; if (mod_file_struct.identification_present || mod_file_struct.estimation_analytic_derivation) - { - derivsOrder = 2; - paramsDerivsOrder = params_derivs_order; - } + derivsOrder = 2; + + if (mod_file_struct.identification_present + || mod_file_struct.estimation_analytic_derivation + || (mod_file_struct.GMM_present && mod_file_struct.analytic_standard_errors_present)) + paramsDerivsOrder = params_derivs_order; + static_model.computingPass(derivsOrder, paramsDerivsOrder, global_eval_context, no_tmp_terms, block, bytecode); } // Set things to compute for dynamic model @@ -775,14 +778,19 @@ ModFile::computingPass(bool no_tmp_terms, FileOutputType output, int params_deri cerr << "ERROR: Incorrect order option..." << endl; exit(EXIT_FAILURE); } - int derivsOrder = max(mod_file_struct.order_option, - mod_file_struct.identification_order + 1); // See preprocessor#40 + int derivsOrder = max(mod_file_struct.order_option,mod_file_struct.identification_order + 1); // See preprocessor#40 + if (mod_file_struct.GMM_present && mod_file_struct.analytic_standard_errors_present) //analytic standard errors require one order more + derivsOrder = max(mod_file_struct.order_option, + max(mod_file_struct.identification_order,mod_file_struct.mom_order) + 1); // See preprocessor#40 + if (mod_file_struct.sensitivity_present || linear || output == FileOutputType::second) derivsOrder = max(derivsOrder, 2); if (mod_file_struct.estimation_analytic_derivation || output == FileOutputType::third) derivsOrder = max(derivsOrder, 3); int paramsDerivsOrder = 0; - if (mod_file_struct.identification_present || mod_file_struct.estimation_analytic_derivation) + if (mod_file_struct.identification_present + || mod_file_struct.estimation_analytic_derivation + || (mod_file_struct.GMM_present && mod_file_struct.analytic_standard_errors_present)) paramsDerivsOrder = params_derivs_order; dynamic_model.computingPass(true, derivsOrder, paramsDerivsOrder, global_eval_context, no_tmp_terms, block, use_dll, bytecode, linear_decomposition); if (linear && mod_file_struct.ramsey_model_present) diff --git a/src/Statement.hh b/src/Statement.hh index fab30d99decc192dc851e157717da8482c4d1bcc..99d2bbb7ce5ec6f7ad59c842efa505a46efe4720 100644 --- a/src/Statement.hh +++ b/src/Statement.hh @@ -80,6 +80,12 @@ public: bool k_order_solver{false}; //! Whether an method_of_moments statement is present bool mom_estimation_present{false}; + //! Whether an GMM-option is present + bool GMM_present{false}; + //! Whether an analytic_standard_errors-option is present + bool analytic_standard_errors_present{false}; + //! The maximum of the “order” option in method_of_moments statements + int mom_order{0}; //! Whether there is a calibrated measurement error bool calibrated_measurement_errors{false}; //! Whether dsge_prior_weight was initialized as a parameter