From f5ec70a06d2de429c572b666fe6d27bd9174be32 Mon Sep 17 00:00:00 2001
From: Willi Mutschler <willi@mutschler.eu>
Date: Wed, 11 Aug 2021 17:30:26 +0200
Subject: [PATCH] MoM: Refactor AnScho test case

Instead of checking everything in one mod file, this commit separates the checks into individual mod files that test:
- whether the translation from matched_moments works
- whether the duplicate moments are found
- whether GMM and SMM both work with different estimated_params blocks.
wip
---
 tests/.gitignore                              |   1 +
 tests/Makefile.am                             |  10 +-
 .../AnScho/AnScho_GMM_estimParams0.mod        |   5 +
 .../AnScho/AnScho_GMM_estimParams1.mod        |   5 +
 .../AnScho/AnScho_GMM_estimParams2.mod        |   5 +
 .../method_of_moments/AnScho/AnScho_MoM.mod   | 286 ------------------
 .../AnScho/AnScho_MoM_common.inc              | 279 +++++++++++++++++
 .../AnScho/AnScho_MoM_data_2.mat              | Bin 0 -> 17684 bytes
 .../AnScho/AnScho_SMM_estimParams0.mod        |   5 +
 .../AnScho/AnScho_SMM_estimParams1.mod        |   5 +
 .../AnScho/AnScho_SMM_estimParams2.mod        |   5 +
 .../AnScho/AnScho_matched_moments.mod         | 134 ++++++++
 12 files changed, 453 insertions(+), 287 deletions(-)
 create mode 100644 tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams0.mod
 create mode 100644 tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams1.mod
 create mode 100644 tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams2.mod
 delete mode 100644 tests/estimation/method_of_moments/AnScho/AnScho_MoM.mod
 create mode 100644 tests/estimation/method_of_moments/AnScho/AnScho_MoM_common.inc
 create mode 100644 tests/estimation/method_of_moments/AnScho/AnScho_MoM_data_2.mat
 create mode 100644 tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams0.mod
 create mode 100644 tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams1.mod
 create mode 100644 tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams2.mod
 create mode 100644 tests/estimation/method_of_moments/AnScho/AnScho_matched_moments.mod

diff --git a/tests/.gitignore b/tests/.gitignore
index 79788679ea..7f26c7b226 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -50,6 +50,7 @@ wsOct
 !/ep/mean_preserving_spread.m
 !/ep/rbcii_steady_state.m
 !/estimation/fsdat_simul.m
+!/estimation/method_of_moments/AnScho/AnScho_MoM_data_2.mat
 !/estimation/method_of_moments/RBC/RBC_MoM_steady_helper.m
 !/estimation/method_of_moments/RBC/RBC_Andreasen_Data_2.mat
 !/estimation/method_of_moments/AFVRR/AFVRR_data.mat
diff --git a/tests/Makefile.am b/tests/Makefile.am
index a49ca3e125..6307b4ff8f 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -62,7 +62,13 @@ MODFILES = \
 	estimation/heteroskedastic_shocks/fs2000_het_corr.mod \
 	estimation/t_proposal/fs2000_student.mod \
 	estimation/tune_mh_jscale/fs2000.mod \
-	estimation/method_of_moments/AnScho/AnScho_MoM.mod \
+	estimation/method_of_moments/AnScho/AnScho_matched_moments.mod \
+	estimation/method_of_moments/AnScho/AnScho_GMM_estimParams0.mod \
+	estimation/method_of_moments/AnScho/AnScho_GMM_estimParams1.mod \
+	estimation/method_of_moments/AnScho/AnScho_GMM_estimParams2.mod \
+	estimation/method_of_moments/AnScho/AnScho_SMM_estimParams0.mod \
+	estimation/method_of_moments/AnScho/AnScho_SMM_estimParams1.mod \
+	estimation/method_of_moments/AnScho/AnScho_SMM_estimParams2.mod \
 	estimation/method_of_moments/RBC/RBC_MoM_Andreasen.mod \
 	estimation/method_of_moments/RBC/RBC_MoM_SMM_ME.mod \
 	estimation/method_of_moments/RBC/RBC_MoM_prefilter.mod \
@@ -1275,6 +1281,8 @@ EXTRA_DIST = \
 	lmmcp/sw-common-header.inc \
 	lmmcp/sw-common-footer.inc \
 	estimation/tune_mh_jscale/fs2000.inc \
+	estimation/method_of_moments/AnScho/AnScho_MoM_common.inc \
+	estimation/method_of_moments/AnScho/AnScho_MoM_data_2.mat \
 	estimation/method_of_moments/RBC/RBC_MoM_common.inc \
 	estimation/method_of_moments/RBC/RBC_MoM_steady_helper.m \
 	estimation/method_of_moments/AFVRR/AFVRR_common.inc \
diff --git a/tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams0.mod b/tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams0.mod
new file mode 100644
index 0000000000..7cf864dbb1
--- /dev/null
+++ b/tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams0.mod
@@ -0,0 +1,5 @@
+% Test estimated_params block using initial values without bounds
+
+@#define estimParams = 0
+@#define MoM_Method = "GMM"
+@#include "AnScho_MoM_common.inc"
\ No newline at end of file
diff --git a/tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams1.mod b/tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams1.mod
new file mode 100644
index 0000000000..fcfe14c278
--- /dev/null
+++ b/tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams1.mod
@@ -0,0 +1,5 @@
+% Test estimated_params block using initial values and bounds
+
+@#define estimParams = 1
+@#define MoM_Method = "GMM"
+@#include "AnScho_MoM_common.inc"
\ No newline at end of file
diff --git a/tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams2.mod b/tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams2.mod
new file mode 100644
index 0000000000..afb65adf7b
--- /dev/null
+++ b/tests/estimation/method_of_moments/AnScho/AnScho_GMM_estimParams2.mod
@@ -0,0 +1,5 @@
+% Test estimated_params block using prior information
+
+@#define estimParams = 2
+@#define MoM_Method = "GMM"
+@#include "AnScho_MoM_common.inc"
\ No newline at end of file
diff --git a/tests/estimation/method_of_moments/AnScho/AnScho_MoM.mod b/tests/estimation/method_of_moments/AnScho/AnScho_MoM.mod
deleted file mode 100644
index fc662d5450..0000000000
--- a/tests/estimation/method_of_moments/AnScho/AnScho_MoM.mod
+++ /dev/null
@@ -1,286 +0,0 @@
-% DSGE model used in replication files of
-% An, Sungbae and Schorfheide, Frank, (2007), Bayesian Analysis of DSGE Models, Econometric Reviews, 26, issue 2-4, p. 113-172.
-% Adapted by Willi Mutschler (@wmutschl, willi@mutschler.eu)
-% =========================================================================
-% Copyright (C) 2020-2021 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 <https://www.gnu.org/licenses/>.
-% =========================================================================
-
-% Define testscenario
-@#define orderApp = 2
-@#define estimParams = 1
-
-% Note that we set the numerical optimization tolerance levels very large to speed up the testsuite
-@#define optimizer = 13
-
-var c p R g y z INFL INT YGR;
-varexo e_r e_g e_z;
-parameters tau nu kap cyst psi1 psi2 rhor rhog rhoz rrst pist gamst;
-
-varobs INT YGR INFL;
-
-tau   = 2;
-nu    = 0.1;
-kap   = 0.33;
-cyst  = 0.85;
-psi1  = 1.5;
-psi2  = 0.125;
-rhor  = 0.75;
-rhog  = 0.95;
-rhoz  = 0.9;
-rrst  = 1;
-pist  = 3.2;
-gamst = 0.55;
-
-model;
-#pist2 = exp(pist/400);
-#rrst2 = exp(rrst/400);
-#bet   = 1/rrst2;
-#phi   = tau*(1-nu)/nu/kap/pist2^2;
-#gst   = 1/cyst;
-#cst   = (1-nu)^(1/tau);
-#yst   = cst*gst;
-#dy    = y-y(-1);
-1 = exp(-tau*c(+1)+tau*c+R-z(+1)-p(+1));
-(1-nu)/nu/phi/(pist2^2)*(exp(tau*c)-1) = (exp(p)-1)*((1-1/2/nu)*exp(p)+1/2/nu) - bet*(exp(p(+1))-1)*exp(-tau*c(+1)+tau*c+y(+1)-y+p(+1));
-exp(c-y) = exp(-g) - phi*pist2^2*gst/2*(exp(p)-1)^2;
-R = rhor*R(-1) + (1-rhor)*psi1*p + (1-rhor)*psi2*(dy+z) + e_r/100;
-g = rhog*g(-1) + e_g/100;
-z = rhoz*z(-1) + e_z/100;
-YGR = gamst+100*(dy+z);
-INFL = pist+400*p;
-INT = pist+rrst+4*gamst+400*R;
-end;
-
-steady_state_model;
-  z = 0; p = 0; g = 0; r = 0; c = 0; y = 0;
-  YGR = gamst; INFL = pist; INT = pist + rrst + 4*gamst;
-end;
-
-shocks;
-  var e_r = 0.20^2;
-  var e_g = 0.80^2;
-  var e_z = 0.45^2;
-  corr e_r,e_g = 0.2;
-end;
-
-@#if estimParams == 0
-% Define only initial values without bounds
-estimated_params;
-  %tau,             1.50;
-  %kap,             0.15;
-  psi1,            1.20;
-  psi2,            0.50;
-  rhor,            0.50;
-  %rhog,            0.50;
-  %rhoz,            0.50;
-  %rrst,            1.20;
-  %pist,            3.00;
-  gamst,           0.75;
-  stderr e_r,      0.30;
-  stderr e_g,      0.30;
-  stderr e_z,      0.30;
-  corr e_r,e_g,    0.10;
-end;
-@#endif
-
-@#if estimParams == 1
-% Define initial values and bounds
-estimated_params;
-  %tau,             1.50,         1e-5,        10;
-  %kap,             0.15,         1e-5,        10;
-  psi1,            1.20,         1e-5,        10;
-  psi2,            0.50,         1e-5,        10;
-  rhor,            0.50,         1e-5,        0.99999;
-  %rhog,            0.50,         1e-5,        0.99999;
-  %rhoz,            0.50,         1e-5,        0.99999;
-  %rrst,            1.20,         1e-5,        10;
-  %pist,            3.00,         1e-5,        20;
-  gamst,           0.75,         -5,          5;
-  stderr e_r,      0.30,         1e-8,        5;
-  stderr e_g,      0.30,         1e-8,        5;
-  stderr e_z,      0.30,         1e-8,        5;
-  corr e_r,e_g,    0.10,         -1,          1;
-end;
-@#endif
-
-@#if estimParams == 2
-% Define prior distribution
-estimated_params;
-  %tau,             1.50,          1e-5,        10,          gamma_pdf,     2.00,       0.50;
-  %kap,             0.15,          1e-5,        10,          gamma_pdf,     0.33,       0.10;
-  psi1,            1.20,          1e-5,        10,          gamma_pdf,     1.50,       0.25;
-  psi2,            0.50,          1e-5,        10,          gamma_pdf,     0.125,      0.25;
-  rhor,            0.50,          1e-5,        0.99999,     beta_pdf,      0.50,       0.20;
-  %rhog,            0.50,          1e-5,        0.99999,     beta_pdf,      0.80,       0.10;
-  %rhoz,            0.50,          1e-5,        0.99999,     beta_pdf,      0.66,       0.15;
-  %rrst,            1.20,          1e-5,        10,          gamma_pdf,     0.50,       0.50;
-  %pist,            3.00,          1e-5,        20,          gamma_pdf,     7.00,       2.00;
-  gamst,           0.75,          -5,          5,           normal_pdf,    0.40,       0.20;
-  stderr e_r,      0.30,          1e-8,        5,           inv_gamma_pdf, 0.50,       0.26;
-  stderr e_g,      0.30,          1e-8,        5,           inv_gamma_pdf, 1.25,       0.65;
-  stderr e_z,      0.30,          1e-8,        5,           inv_gamma_pdf, 0.63,       0.33;
-  corr e_r,e_g,    0.10,          -1,          1,           uniform_pdf,       ,           , -1, 1;
-end;
-@#endif
-
-
-% Simulate data
-stoch_simul(order=@{orderApp},pruning,nodisplay,nomoments,periods=750,drop=500);
-save('AnScho_MoM_data_@{orderApp}.mat', options_.varobs{:} );
-pause(1);
-
-
-%--------------------------------------------------------------------------
-% Method of Moments Estimation
-%--------------------------------------------------------------------------
-matched_moments;
-YGR;
-INFL;
-INT;
-%second-order contemporenous product moments
-YGR*YGR;
-YGR*INFL;
-YGR*INT;
-INFL*INFL;
-INFL*INT;
-INT*INT;
-%second-order temporal product moments
-YGR*YGR(-1);
-INT*INT(-1);
-INFL*INFL(-1);
-end;
-
-% get indices in declaration order
-iYGR  = strmatch('YGR',  M_.endo_names,'exact');
-iINFL = strmatch('INFL', M_.endo_names,'exact');
-iINT  = strmatch('INT',  M_.endo_names,'exact');
-% first entry: number of variable in declaration order
-% second entry: lag
-% third entry: power
-
-matched_moments_ = {
-    %first-order product moments
-    [iYGR       ]  [0   ],  [1  ];
-    [iINFL      ]  [0   ],  [1  ];
-    [iINT       ]  [0   ],  [1  ];
-    %second-order contemporenous product moments
-    [iYGR  iYGR ]  [0  0],  [1 1];
-    [iYGR  iINFL]  [0  0],  [1 1];
-    [iYGR  iINT ]  [0  0],  [1 1];
-    [iINFL iINFL]  [0  0],  [1 1];
-    [iINFL iINT ]  [0  0],  [1 1];
-    [iINT  iINT ]  [0  0],  [1 1];
-    %second-order temporal product moments
-    [iYGR  iYGR ]  [0 -1],  [1 1];
-    %[iINT  iYGR ]  [0 -1],  [1 1];
-    %[iINFL iYGR ]  [0 -1],  [1 1];
-    %[iYGR  iINT ]  [0 -1],  [1 1];
-    [iINT  iINT ]  [0 -1],  [1 1];
-    %[iINFL iINT ]  [0 -1],  [1 1];
-    %[iYGR  iINFL]  [0 -1],  [1 1];
-    %[iINT  iINFL]  [0 -1],  [1 1];
-    [iINFL iINFL]  [0 -1],  [1 1];
-};
-
-if ~isequal(M_.matched_moments,matched_moments_)
-    error('Translation to matched_moments-block failed')
-end
-
-@#for mommethod in ["GMM", "SMM"]
-    method_of_moments(
-    % Necessery options
-          mom_method = @{mommethod}           % method of moments method; possible values: GMM|SMM
-        , datafile   = 'AnScho_MoM_data_@{orderApp}.mat' % name of filename with data
-
-    % Options for both GMM and SMM
-        % , bartlett_kernel_lag = 20          % bandwith in optimal weighting matrix
-        , order = @{orderApp}                 % order of Taylor approximation in perturbation
-        % , penalized_estimator               % include deviation from prior mean as additional moment restriction and use prior precision as weight
-        , pruning                             % use pruned state space system at higher-order
-        % , verbose                           % display and store intermediate estimation results
-        , weighting_matrix = ['optimal']      % weighting matrix in moments distance objective function; possible values: OPTIMAL|IDENTITY_MATRIX|DIAGONAL|filename. Size of cell determines stages in iterated estimation, e.g. two state with ['DIAGONAL','OPTIMAL']
-        %, weighting_matrix_scaling_factor=1  % scaling of weighting matrix in objective function
-        , se_tolx=1e-6                        % step size for numerical computation of standard errors
-
-    % Options for SMM
-        % , burnin=500                        % number of periods dropped at beginning of simulation
-        % , bounded_shock_support             % trim shocks in simulation to +- 2 stdev
-        % , seed = 24051986                   % seed used in simulations
-        % , simulation_multiple = 5           % multiple of the data length used for simulation
-
-    % Options for GMM
-        @#if mommethod == "GMM"
-        , analytic_standard_errors            % compute standard errors using analytical derivatives
-        @#endif
-
-    % General options
-        % , dirname = 'MM'                    % directory in which to store estimation output
-        % , graph_format = EPS                % specify the file format(s) for graphs saved to disk
-        % , nodisplay                         % do not display the graphs, but still save them to disk
-        % , nograph                           % do not create graphs (which implies that they are not saved to the disk nor displayed)
-        % , noprint                           % do not print stuff to console
-        % , plot_priors = 1                   % control plotting of priors
-        % , prior_trunc = 1e-10               % probability of extreme values of the prior density that is ignored when computing bounds for the parameters
-        % , TeX                               % print TeX tables and graphics
-
-    % Data and model options
-        % , first_obs = 501                   % number of first observation
-        % , logdata                           % if data is already in logs
-        , nobs = 250                          % number of observations
-        % , prefilter=0                       % demean each data series by its empirical mean and use centered moments
-
-        % , xls_sheet = data                  % name/number of sheet with data in Excel
-        % , xls_range = B2:D200               % range of data in Excel sheet
-
-    % Optimization options that can be set by the user in the mod file, otherwise default values are provided
-        % , huge_number=1e7                   % value for replacing the infinite bounds on parameters by finite numbers. Used by some optimizers for numerical reasons
-        , mode_compute = @{optimizer}         % specifies the optimizer for minimization of moments distance
-        , additional_optimizer_steps = [1]    % vector of additional mode-finders run after mode_compute
-        % optim: a list of NAME and VALUE pairs to set options for the optimization routines. Available options depend on mode_compute, some exemplary common options:
-        , optim = ('TolFun'      , 1e-6       % termination tolerance on the function value, a positive scalar
-                  ,'TolX'        , 1e-6       % termination tolerance on x, a positive scalar
-                  ,'MaxIter'     , 3000       % maximum number of iterations allowed, a positive integer
-                  ,'MaxFunEvals' , 1D6        % maximum number of function evaluations allowed, a positive integer
-        %           ,'UseParallel' , 1        % when true (and supported by optimizer) solver estimates gradients in parallel (using Matlab/Octave's parallel toolbox)
-        %           ,'Jacobian'    , 'off'    % when 'off' gradient-based solvers approximate Jacobian using finite differences; for GMM we can also pass the analytical Jacobian to gradient-based solvers by setting this 'on'
-                  )                         
-        , silent_optimizer                    % run minimization of moments distance silently without displaying results or saving files in between
-
-    % Numerical algorithms options
-        % , aim_solver                             % Use AIM algorithm to compute perturbation approximation
-        % , k_order_solver                         % use k_order_solver in higher order perturbation approximations
-        % , dr=default                             % method used to compute the decision rule; possible values are DEFAULT, CYCLE_REDUCTION, LOGARITHMIC_REDUCTION
-        % , dr_cycle_reduction_tol = 1e-7          % convergence criterion used in the cycle reduction algorithm
-        % , dr_logarithmic_reduction_tol = 1e-12   % convergence criterion used in the logarithmic reduction algorithm
-        % , dr_logarithmic_reduction_maxiter = 100 % maximum number of iterations used in the logarithmic reduction algorithm
-        % , lyapunov = DEFAULT                     % algorithm used to solve lyapunov equations; possible values are DEFAULT, FIXED_POINT, DOUBLING, SQUARE_ROOT_SOLVER
-        % , lyapunov_complex_threshold = 1e-15     % complex block threshold for the upper triangular matrix in symmetric Lyapunov equation solver
-        % , lyapunov_fixed_point_tol = 1e-10       % convergence criterion used in the fixed point Lyapunov solver
-        % , lyapunov_doubling_tol = 1e-16          % convergence criterion used in the doubling algorithm
-        % , sylvester = default                    % algorithm to solve Sylvester equation; possible values are DEFAULT, FIXED_POINT
-        % , sylvester_fixed_point_tol = 1e-12      % convergence criterion used in the fixed point Sylvester solver
-        % , qz_criterium = 0.999999                % value used to split stable from unstable eigenvalues in reordering the Generalized Schur decomposition used for solving first order problems
-        % , qz_zero_threshold = 1e-6               % value used to test if a generalized eigenvalue is 0/0 in the generalized Schur decomposition
-        % , schur_vec_tol=1e-11                    % tolerance level used to find nonstationary variables in Schur decomposition of the transition matrix
-        % , mode_check                             % plot the target function for values around the computed minimum for each estimated parameter in turn
-        % , mode_check_neighbourhood_size = 5      % width of the window (expressed in percentage deviation) around the computed minimum to be displayed on the diagnostic plots
-        % , mode_check_symmetric_plots=1           % ensure that the check plots are symmetric around the minimum
-        % , mode_check_number_of_points = 20       % number of points around the minimum where the target function is evaluated (for each parameter)
-    );
-@#endfor
-
diff --git a/tests/estimation/method_of_moments/AnScho/AnScho_MoM_common.inc b/tests/estimation/method_of_moments/AnScho/AnScho_MoM_common.inc
new file mode 100644
index 0000000000..866f2ac517
--- /dev/null
+++ b/tests/estimation/method_of_moments/AnScho/AnScho_MoM_common.inc
@@ -0,0 +1,279 @@
+% DSGE model used in replication files of
+% An, Sungbae and Schorfheide, Frank, (2007), Bayesian Analysis of DSGE Models, Econometric Reviews, 26, issue 2-4, p. 113-172.
+% Adapted by Willi Mutschler (@wmutschl, willi@mutschler.eu)
+% =========================================================================
+% Copyright (C) 2020-2021 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 <https://www.gnu.org/licenses/>.
+% =========================================================================
+
+var c p R g y z INFL INT YGR;
+varexo e_r e_g e_z;
+parameters tau nu kap cyst psi1 psi2 rhor rhog rhoz rrst pist gamst;
+
+varobs INT YGR INFL;
+
+tau   = 2;
+nu    = 0.1;
+kap   = 0.33;
+cyst  = 0.85;
+psi1  = 1.5;
+psi2  = 0.125;
+rhor  = 0.75;
+rhog  = 0.95;
+rhoz  = 0.9;
+rrst  = 1;
+pist  = 3.2;
+gamst = 0.55;
+
+model;
+#pist2 = exp(pist/400);
+#rrst2 = exp(rrst/400);
+#bet   = 1/rrst2;
+#phi   = tau*(1-nu)/nu/kap/pist2^2;
+#gst   = 1/cyst;
+#cst   = (1-nu)^(1/tau);
+#yst   = cst*gst;
+#dy    = y-y(-1);
+1 = exp(-tau*c(+1)+tau*c+R-z(+1)-p(+1));
+(1-nu)/nu/phi/(pist2^2)*(exp(tau*c)-1) = (exp(p)-1)*((1-1/2/nu)*exp(p)+1/2/nu) - bet*(exp(p(+1))-1)*exp(-tau*c(+1)+tau*c+y(+1)-y+p(+1));
+exp(c-y) = exp(-g) - phi*pist2^2*gst/2*(exp(p)-1)^2;
+R = rhor*R(-1) + (1-rhor)*psi1*p + (1-rhor)*psi2*(dy+z) + e_r/100;
+g = rhog*g(-1) + e_g/100;
+z = rhoz*z(-1) + e_z/100;
+YGR = gamst+100*(dy+z);
+INFL = pist+400*p;
+INT = pist+rrst+4*gamst+400*R;
+end;
+
+steady_state_model;
+  z = 0; p = 0; g = 0; R = 0; c = 0; y = 0;
+  YGR = gamst; INFL = pist; INT = pist + rrst + 4*gamst;
+end;
+
+shocks;
+  var e_r = 0.20^2;
+  var e_g = 0.80^2;
+  var e_z = 0.45^2;
+  corr e_r,e_g = 0.2;
+end;
+
+@#if estimParams == 0
+% Define only initial values without bounds
+estimated_params;
+  %tau,             1.50;
+  %kap,             0.15;
+  psi1,            1.20;
+  psi2,            0.50;
+  rhor,            0.50;
+  %rhog,            0.50;
+  %rhoz,            0.50;
+  %rrst,            1.20;
+  %pist,            3.00;
+  gamst,           0.75;
+  stderr e_r,      0.30;
+  stderr e_g,      0.30;
+  stderr e_z,      0.30;
+  corr e_r,e_g,    0.10;
+end;
+@#endif
+
+@#if estimParams == 1
+% Define initial values and bounds
+estimated_params;
+  %tau,             1.50,         1e-5,        10;
+  %kap,             0.15,         1e-5,        10;
+  psi1,            1.20,         1e-5,        10;
+  psi2,            0.50,         1e-5,        10;
+  rhor,            0.50,         1e-5,        0.99999;
+  %rhog,            0.50,         1e-5,        0.99999;
+  %rhoz,            0.50,         1e-5,        0.99999;
+  %rrst,            1.20,         1e-5,        10;
+  %pist,            3.00,         1e-5,        20;
+  gamst,           0.75,         -5,          5;
+  stderr e_r,      0.30,         1e-8,        5;
+  stderr e_g,      0.30,         1e-8,        5;
+  stderr e_z,      0.30,         1e-8,        5;
+  corr e_r,e_g,    0.10,         -1,          1;
+end;
+@#endif
+
+@#if estimParams == 2
+% Define prior distribution
+estimated_params;
+  %tau,             1.50,          1e-5,        10,          gamma_pdf,     2.00,       0.50;
+  %kap,             0.15,          1e-5,        10,          gamma_pdf,     0.33,       0.10;
+  psi1,            1.20,          1e-5,        10,          gamma_pdf,     1.50,       0.25;
+  psi2,            0.50,          1e-5,        10,          gamma_pdf,     0.125,      0.25;
+  rhor,            0.50,          1e-5,        0.99999,     beta_pdf,      0.50,       0.20;
+  %rhog,            0.50,          1e-5,        0.99999,     beta_pdf,      0.80,       0.10;
+  %rhoz,            0.50,          1e-5,        0.99999,     beta_pdf,      0.66,       0.15;
+  %rrst,            1.20,          1e-5,        10,          gamma_pdf,     0.50,       0.50;
+  %pist,            3.00,          1e-5,        20,          gamma_pdf,     7.00,       2.00;
+  gamst,           0.75,          -5,          5,           normal_pdf,    0.40,       0.20;
+  stderr e_r,      0.30,          1e-8,        5,           inv_gamma_pdf, 0.50,       0.26;
+  stderr e_g,      0.30,          1e-8,        5,           inv_gamma_pdf, 1.25,       0.65;
+  stderr e_z,      0.30,          1e-8,        5,           inv_gamma_pdf, 0.63,       0.33;
+  corr e_r,e_g,    0.10,          -1,          1,           uniform_pdf,       ,           , -1, 1;
+end;
+@#endif
+
+
+% % Simulate data
+% stoch_simul(order=2,pruning,nodisplay,nomoments,periods=750,drop=500);
+% save('AnScho_MoM_data_2.mat', options_.varobs{:} );
+% pause(1);
+
+%--------------------------------------------------------------------------
+% Method of Moments Estimation
+%--------------------------------------------------------------------------
+matched_moments;
+
+%first-order product moments
+YGR;
+YGR(-1);   %redundant
+YGR(0)^1;  %redundant
+YGR^1;     %redundant
+YGR^1*INFL^0*INT^0; %redundant
+INFL(+2)^1;
+INT(-2);
+INT(2);    %redundant
+
+%second-order contemporenous product moments
+YGR^2;
+YGR(-1)^2; %redundant
+YGR*YGR;   %redundant
+YGR(1)*YGR(1);  %redundant
+INFL*YGR;
+YGR*INFL;  %redundant
+YGR(2)*INT(2);
+INT(2)*YGR(2); %redundant
+INT(2)^1*YGR(2)^1; %redundant
+YGR(2)^1*INT(2)^1; %redundant
+INFL(-2)^1*INFL(-2)^1;
+INFL(-1)*INT(-1);
+INT(0)^1*INT^1;
+INT(0)^1*INT^1*YGR(2)^0*INT(-2)^0*INFL^0; %redundant
+
+%second-order temporal product moments
+YGR*YGR(-1);
+YGR(3)*YGR(2); %redundant
+YGR(2)*YGR(3); %redundant
+YGR(-2)*YGR(-1); %redundant
+INT(3)^1*INT(-2)^1;
+YGR(5)^0*INFL*INFL(2)^1;
+YGR(5)^1*INFL(-3)^1;
+INFL(-3)^1*YGR(5)^1; %redundant
+INFL(3)*INT(2);
+
+@#ifdef Extended_Matched_Moments_Checks
+YGR^3;
+YGR(-3)^2*YGR(-3); %redundant
+YGR(-3)*YGR(-3)^2; %redundant
+YGR(0)^1*YGR(0)*YGR; %redundant
+INT(-2)^2*INFL(-1)^4;
+INFL(1)^4*INT(0)^2; %redundant
+INT(0)^2*INFL(1)^4; %redundant
+YGR^2*INFL(-3)^4*INT(5)^6;
+YGR^2*INT(5)^6*INFL(-3)^4;%redundant
+INT(5)^6*YGR^2*INFL(-3)^4;%redundant
+@#endif
+end;
+
+
+method_of_moments(
+% Necessery options
+      mom_method = @{MoM_Method}           % method of moments method; possible values: GMM|SMM
+    , datafile   = 'AnScho_MoM_data_2.mat' % name of filename with data
+
+% Options for both GMM and SMM
+    % , bartlett_kernel_lag = 20          % bandwith in optimal weighting matrix
+    , order = 2                           % order of Taylor approximation in perturbation
+    % , penalized_estimator               % include deviation from prior mean as additional moment restriction and use prior precision as weight
+    , pruning                             % use pruned state space system at higher-order
+    , verbose                           % display and store intermediate estimation results
+    , weighting_matrix = ['optimal']      % weighting matrix in moments distance objective function; possible values: OPTIMAL|IDENTITY_MATRIX|DIAGONAL|filename. Size of cell determines stages in iterated estimation, e.g. two state with ['DIAGONAL','OPTIMAL']
+    %, weighting_matrix_scaling_factor=1  % scaling of weighting matrix in objective function
+    , se_tolx=1e-6                        % step size for numerical computation of standard errors
+
+% Options for SMM
+        % , burnin=500                        % number of periods dropped at beginning of simulation
+        , bounded_shock_support             % trim shocks in simulation to +- 2 stdev
+        % , seed = 24051986                   % seed used in simulations
+        % , simulation_multiple = 5           % multiple of the data length used for simulation
+
+% Options for GMM
+@#if MoM_Method == "GMM"
+    , analytic_standard_errors            % compute standard errors using analytical derivatives
+@#endif
+% General options
+    % , dirname = 'MM'                    % directory in which to store estimation output
+    % , graph_format = EPS                % specify the file format(s) for graphs saved to disk
+    % , nodisplay                         % do not display the graphs, but still save them to disk
+    % , nograph                           % do not create graphs (which implies that they are not saved to the disk nor displayed)
+    % , noprint                           % do not print stuff to console
+    % , plot_priors = 1                   % control plotting of priors
+    % , prior_trunc = 1e-10               % probability of extreme values of the prior density that is ignored when computing bounds for the parameters
+    % , TeX                               % print TeX tables and graphics
+
+% Data and model options
+    % , first_obs = 501                   % number of first observation
+    % , logdata                           % if data is already in logs
+    , nobs = 250                          % number of observations
+    % , prefilter=0                       % demean each data series by its empirical mean and use centered moments
+
+    % , xls_sheet = data                  % name/number of sheet with data in Excel
+    % , xls_range = B2:D200               % range of data in Excel sheet
+
+% Optimization options that can be set by the user in the mod file, otherwise default values are provided
+    % , huge_number=1e7                   % value for replacing the infinite bounds on parameters by finite numbers. Used by some optimizers for numerical reasons
+    @#ifdef NoEstim
+    , mode_compute = 0
+    @#else
+    , mode_compute = 13                   % specifies the optimizer for minimization of moments distance
+    , additional_optimizer_steps = [1]    % vector of additional mode-finders run after mode_compute
+    @#endif
+    % optim: a list of NAME and VALUE pairs to set options for the optimization routines. Available options depend on mode_compute, some exemplary common options:
+    , optim = ('TolFun'      , 1e-6       % termination tolerance on the function value, a positive scalar
+              ,'TolX'        , 1e-6       % termination tolerance on x, a positive scalar
+              ,'MaxIter'     , 3000       % maximum number of iterations allowed, a positive integer
+              ,'MaxFunEvals' , 1D6        % maximum number of function evaluations allowed, a positive integer
+    %           ,'UseParallel' , 1        % when true (and supported by optimizer) solver estimates gradients in parallel (using Matlab/Octave's parallel toolbox)
+    %           ,'Jacobian'    , 'off'    % when 'off' gradient-based solvers approximate Jacobian using finite differences; for GMM we can also pass the analytical Jacobian to gradient-based solvers by setting this 'on'
+              )                         
+    %, silent_optimizer                    % run minimization of moments distance silently without displaying results or saving files in between
+
+% Numerical algorithms options
+    % , aim_solver                             % Use AIM algorithm to compute perturbation approximation
+    % , k_order_solver                         % use k_order_solver in higher order perturbation approximations
+    % , dr=default                             % method used to compute the decision rule; possible values are DEFAULT, CYCLE_REDUCTION, LOGARITHMIC_REDUCTION
+    % , dr_cycle_reduction_tol = 1e-7          % convergence criterion used in the cycle reduction algorithm
+    % , dr_logarithmic_reduction_tol = 1e-12   % convergence criterion used in the logarithmic reduction algorithm
+    % , dr_logarithmic_reduction_maxiter = 100 % maximum number of iterations used in the logarithmic reduction algorithm
+    % , lyapunov = DEFAULT                     % algorithm used to solve lyapunov equations; possible values are DEFAULT, FIXED_POINT, DOUBLING, SQUARE_ROOT_SOLVER
+    % , lyapunov_complex_threshold = 1e-15     % complex block threshold for the upper triangular matrix in symmetric Lyapunov equation solver
+    % , lyapunov_fixed_point_tol = 1e-10       % convergence criterion used in the fixed point Lyapunov solver
+    % , lyapunov_doubling_tol = 1e-16          % convergence criterion used in the doubling algorithm
+    % , sylvester = default                    % algorithm to solve Sylvester equation; possible values are DEFAULT, FIXED_POINT
+    % , sylvester_fixed_point_tol = 1e-12      % convergence criterion used in the fixed point Sylvester solver
+    % , qz_criterium = 0.999999                % value used to split stable from unstable eigenvalues in reordering the Generalized Schur decomposition used for solving first order problems
+    % , qz_zero_threshold = 1e-6               % value used to test if a generalized eigenvalue is 0/0 in the generalized Schur decomposition
+    % , schur_vec_tol=1e-11                    % tolerance level used to find nonstationary variables in Schur decomposition of the transition matrix
+    , mode_check                             % plot the target function for values around the computed minimum for each estimated parameter in turn
+    % , mode_check_neighbourhood_size = 5      % width of the window (expressed in percentage deviation) around the computed minimum to be displayed on the diagnostic plots
+    % , mode_check_symmetric_plots=1           % ensure that the check plots are symmetric around the minimum
+    % , mode_check_number_of_points = 20       % number of points around the minimum where the target function is evaluated (for each parameter)
+);
diff --git a/tests/estimation/method_of_moments/AnScho/AnScho_MoM_data_2.mat b/tests/estimation/method_of_moments/AnScho/AnScho_MoM_data_2.mat
new file mode 100644
index 0000000000000000000000000000000000000000..bce9e7d36c9cbd41c1a9e1cd230ba71c109df886
GIT binary patch
literal 17684
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
JOxAtM001{1^K}3K

literal 0
HcmV?d00001

diff --git a/tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams0.mod b/tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams0.mod
new file mode 100644
index 0000000000..8c16cfd709
--- /dev/null
+++ b/tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams0.mod
@@ -0,0 +1,5 @@
+% Test estimated_params block using initial values without bounds
+
+@#define estimParams = 0
+@#define MoM_Method = "SMM"
+@#include "AnScho_MoM_common.inc"
\ No newline at end of file
diff --git a/tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams1.mod b/tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams1.mod
new file mode 100644
index 0000000000..ba6c111093
--- /dev/null
+++ b/tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams1.mod
@@ -0,0 +1,5 @@
+% Test estimated_params block using initial values and bounds
+
+@#define estimParams = 1
+@#define MoM_Method = "SMM"
+@#include "AnScho_MoM_common.inc"
\ No newline at end of file
diff --git a/tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams2.mod b/tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams2.mod
new file mode 100644
index 0000000000..7c9a6540d6
--- /dev/null
+++ b/tests/estimation/method_of_moments/AnScho/AnScho_SMM_estimParams2.mod
@@ -0,0 +1,5 @@
+% Test estimated_params block using prior information
+
+@#define estimParams = 2
+@#define MoM_Method = "SMM"
+@#include "AnScho_MoM_common.inc"
\ No newline at end of file
diff --git a/tests/estimation/method_of_moments/AnScho/AnScho_matched_moments.mod b/tests/estimation/method_of_moments/AnScho/AnScho_matched_moments.mod
new file mode 100644
index 0000000000..76c48ad751
--- /dev/null
+++ b/tests/estimation/method_of_moments/AnScho/AnScho_matched_moments.mod
@@ -0,0 +1,134 @@
+% Test translation from matched_moments block to M_.matched_moments
+
+@#define estimParams = 0
+@#define MoM_Method = "SMM"
+@#define NoEstim = 1
+@#define Extended_Matched_Moments_Checks
+@#include "AnScho_MoM_common.inc"
+
+% get indices in declaration order
+iYGR  = strmatch('YGR',  M_.endo_names,'exact');
+iINFL = strmatch('INFL', M_.endo_names,'exact');
+iINT  = strmatch('INT',  M_.endo_names,'exact');
+
+% M_.matched_moments has the following structure:
+%   - first entry: index number of variable in declaration order
+%   - second entry: lead or lag
+%   - third entry: power
+
+matched_moments_orig = {
+    
+    %first-order product moments
+    [iYGR       ]  [0 ],  [1];
+    [iYGR       ]  [-1],  [1];
+    [iYGR       ]  [0 ],  [1];
+    [iYGR       ]  [0 ],  [1];
+    [iYGR       ]  [0 ],  [1];
+    [iINFL      ]  [2 ],  [1];
+    [iINT       ]  [-2],  [1];
+    [iINT       ]  [2 ],  [1];
+    
+    %second-order contemporenous product moments
+    [iYGR       ]  [0     ],  [2  ];
+    [iYGR       ]  [-1    ],  [2  ];
+    [iYGR  iYGR ]  [0    0],  [1 1];
+    [iYGR  iYGR ]  [1    1],  [1 1];
+    [iYGR  iINFL]  [0    0],  [1 1];
+    [iYGR  iINFL]  [0    0],  [1 1];
+    [iINT  iYGR ]  [2    2],  [1 1];
+    [iINT  iYGR ]  [2    2],  [1 1];
+    [iINT  iYGR ]  [2    2],  [1 1];
+    [iINT  iYGR ]  [2    2],  [1 1];
+    [iINFL iINFL]  [-2  -2],  [1 1];
+    [iINFL iINT ]  [-1  -1],  [1 1];
+    [iINT  iINT ]  [0    0],  [1 1];
+    [iINT  iINT ]  [0    0],  [1 1];
+
+    %second-order temporal product moments
+    [iYGR  iYGR ]  [0  -1],  [1 1];
+    [iYGR  iYGR ]  [2   3],  [1 1];
+    [iYGR  iYGR ]  [2   3],  [1 1];
+    [iYGR  iYGR ]  [-1 -2],  [1 1];
+    [iINT  iINT ]  [-2  3],  [1 1];
+    [iINFL iINFL]  [0   2],  [1 1];
+    [iYGR  iINFL]  [5  -3],  [1 1];
+    [iYGR  iINFL]  [5  -3],  [1 1];
+    [iINT  iINFL]  [2   3],  [1 1];
+    
+    [iYGR            ]  [0      ],  [3     ];
+    [iYGR  iYGR      ]  [-3  -3 ],  [1  2  ];
+    [iYGR  iYGR      ]  [-3  -3 ],  [1  2  ];
+    [iYGR  iYGR  iYGR]  [0  0  0],  [1  1  1];
+    [iINT  iINFL     ]  [-2  -1 ],  [2  4  ];
+    [iINFL iINT      ]  [1   0 ],   [4  2  ];
+    [iINFL iINT      ]  [1   0 ],   [4  2  ];
+    [iYGR  iINFL iINT]  [0  -3  5],   [2  4  6];
+    [iINFL iYGR  iINT]  [-3  0  5],   [4  2  6];
+    [iINFL iYGR  iINT]  [-3  0  5],   [4  2  6];    
+};
+
+% Removed duplicate moment conditions
+matched_moments_no_duplicate= {
+    
+    %first-order product moments
+    [iYGR       ]  [0 ],  [1];
+%    [iYGR       ]  [-1],  [1];
+%    [iYGR       ]  [0 ],  [1];
+%    [iYGR       ]  [0 ],  [1];
+%    [iYGR       ]  [0 ],  [1];
+    [iINFL      ]  [2 ],  [1];
+    [iINT       ]  [-2],  [1];
+%    [iINT       ]  [2 ],  [1];
+    
+    %second-order contemporenous product moments
+    [iYGR       ]  [0     ],  [2  ];
+%    [iYGR       ]  [-1    ],  [2  ];
+%    [iYGR  iYGR ]  [0    0],  [1 1];
+%    [iYGR  iYGR ]  [1    1],  [1 1];
+    [iYGR  iINFL]  [0    0],  [1 1];
+%    [iYGR  iINFL]  [0    0],  [1 1];
+    [iINT  iYGR ]  [2    2],  [1 1];
+%    [iINT  iYGR ]  [2    2],  [1 1];
+%    [iINT  iYGR ]  [2    2],  [1 1];
+%    [iINT  iYGR ]  [2    2],  [1 1];
+    [iINFL iINFL]  [-2  -2],  [1 1];
+    [iINFL iINT ]  [-1  -1],  [1 1];
+    [iINT  iINT ]  [0    0],  [1 1];
+%    [iINT  iINT ]  [0    0],  [1 1];
+
+    %second-order temporal product moments
+    [iYGR  iYGR ]  [0  -1],  [1 1];
+%    [iYGR  iYGR ]  [2   3],  [1 1];
+%    [iYGR  iYGR ]  [2   3],  [1 1];
+%    [iYGR  iYGR ]  [-1 -2],  [1 1];
+    [iINT  iINT ]  [-2  3],  [1 1];
+    [iINFL iINFL]  [0   2],  [1 1];
+    [iYGR  iINFL]  [5  -3],  [1 1];
+%    [iYGR  iINFL]  [5  -3],  [1 1];
+    [iINT  iINFL]  [2   3],  [1 1];
+    
+    [iYGR            ]  [0      ],  [3     ];
+%    [iYGR  iYGR      ]  [-3  -3 ],  [1  2  ];
+%    [iYGR  iYGR      ]  [-3  -3 ],  [1  2  ];
+%    [iYGR  iYGR  iYGR]  [0  0  0],  [1  1  1];
+    [iINT  iINFL     ]  [-2  -1 ],  [2  4  ];
+%    [iINFL iINT      ]  [1   0 ],   [4  2  ];
+%    [iINFL iINT      ]  [1   0 ],   [4  2  ];
+    [iYGR  iINFL iINT]  [0  -3  5],   [2  4  6];
+%    [iINFL iYGR  iINT]  [-3  0  5],   [4  2  6];
+%    [iINFL iYGR  iINT]  [-3  0  5],   [4  2  6];    
+};
+
+
+
+if ~isequal(M_.matched_moments_orig,matched_moments_orig)
+    error('Translation to matched_moments-block failed!')
+else
+    fprintf('Translation to matched_moments-block successful!\n\n')
+end
+
+if ~isequal(M_.matched_moments,matched_moments_no_duplicate)
+    error('Removal of duplicate moment conditions failed!')
+else
+    fprintf('Removal of duplicate moment conditions was successful!\n\n')
+end
\ No newline at end of file
-- 
GitLab