New Estimation Interface

Suggestions for a simplification of the estimation interface in Dynare and breaking very general commands with lots of options in several commands with more targeted scope.

set_time

This command allows to specify an initial date and a frequency for the data used by dynare or the data generated by dynare (this command is noit specific to estimation). There is only one input argument. The frequency is implicit.

Syntax examples

   set_time(1950Q3)

   set_time(1960)

   set_time(1971M5)

Preprocessor generated code

Instantiate an object from the dynDates class. This object, say initial_period, is stored in options_. If the command set_time is absent, default initial period is 1 (with yearly frequency). For the preceeding examples, the preprocessor should write in the main matlab file:

   options_.initial_period = dynDate('1950Q3');

   options_.initial_period = dynDate('1960');

   options_.initial_period = dynDate('1971M5');

the default being

   options_.initial_period = dynDate(1);

dataset

This command initializes the dataset (an object instantiated by dynSeries). The following options are available:

Syntax examples

   data(file=/home/stepan/Works/MZE/data/data.m)

   data(file=/home/stepan/Works/MZE/data/data.mat)

   data(file=/home/stepan/Works/MZE/data/data.xls)

In this case the implicit initial date is given by the set_time command, and all the observations are used. Input argument file is mandatory.

   data(file=/home/stepan/Works/MZE/data/data.xls,firstobs=1950Q1)

In this first example the beggining of the sample is specified by firstobs. By default, all the observations are used after this initial date. The frequency (quaterly, monthly or yearly data) is implicit. If the implicit frequency in the command data is inconsistent with the implicit frequency declared in set_time an error message must be issued by the preprocessor. If the initial date is anterior to the date specified by set_time, an error will be issued by the matlab code (using the dynDates class).

   data(file=/home/stepan/Works/MZE/data/data.xls,firstobs=1950Q1,lastobs=2000Q4)

or

   data(file=/home/stepan/Works/MZE/data/data.xls,firstobs=1950Q1,nobs=2000Q4)

In these two examples the last arguments (nobs or lastobs) are used to specify the last observation in the sample. If the implicit frequency is inconsistent with the implicit frequency declared in set_time or if nobs is not strictly positive, an error must be issued by the preprocessor.

Preprocessor generated code

All the options in the data command are saved as fields of options_.dataset. For the previous examples we would have:

   options_.dataset.file = '/home/stepan/Works/MZE/data/data.m';
   options_.dataset.firstobs = dynDate('1950Q1');
   options_.dataset.lastobs = dynDate('2000Q4');
   options_.dataset.nobs = 204;

The default values (written by the preprocessor, not defined in global_initialization) are:

   options_.dataset.firstobs = options_.initial_period;
   options_.dataset.lastobs = NaN;
   options_.dataset.nobs = NaN;
   options_.dataset.xls_sheet = NaN;
   options_.dataset.xls_range = NaN;

estimated_params

Rely on options names rather than argument position in the command line. This new interface would replace estimated_params_bounds and estimated_params_init. The following option names would be necessary

Syntax examples

The following instructions given as examples are to be used within the estimated_params block.

     alpha.prior(shape=beta,mean=0.3,variance=0.1^2);

     alpha.prior(shape=beta,interval=(0.2,0.4,.9));

     theta.prior(shape=gamma,mode=4,variance=10,shift=+2);
     sigma.prior(shape=gamma,mode=-1,variance=5,shift=-2);

     plouf.prior(shape=uniform,domain=(.5,2));
     fuolp.prior(shape=beta,mode=1.5,stdev=.05,domain=(1,2));

     alpha.subsamples(name1=1950Q3:1957Q4, name2=1958Q1:1983Q2, name3=1983Q3:2011Q2) 

     alpha.name1.prior(shape=normal,mode=0.30,stdev=.01);
     alpha.name2.prior(shape=normal,mode=0.33,stdev=.01);
     alpha.name2.prior(shape=normal,mode=0.40,stdev=.01);

Preprocessor generated code

The preprocessor fills a new matlab structure called estimation_info. This structure is organized as follows:

  estimation_info.parameters.deep.nb = 3;                         
  estimation_info.parameters.list = char('alpha','beta','sigma')  
  estimation_info.parameters.structural_innovation.nb = 2;
  estimation_info.parameters.structural_innovation.list = ĉhar('s1','s2');
  estimated_info.parameters.structural_innovation_corr.nb = 1;
  estimated_info.parameters.structural_innovation_corr.list = char('s1___s2');
  estimation_info.parameters.measurement_error.nb = 2;
  estimation_info.parameters.measurement_error.list = ĉhar('s3','s4');
  estimated_info.parameters.measurement_error_corr.nb = 1;
  estimated_info.parameters.measurement_error_corr.list = char('s3___s4');

If the some parameters are not stable across the whole sample, these parameters are specific to each subsample. For instance if we estimate the model with one structual break on parameter alpha, we would have instead:

  estimation_info.parameters.deep.nb = 4;                         
  estimation_info.parameters.list = char('alpha$1','alpha$2','beta','sigma');
  estimation_info.parameters.structural_innovation.nb = 2;
  estimation_info.parameters.structural_innovation.list = ĉhar('s1','s2');
  estimated_info.parameters.structural_innovation_corr.nb = 1;
  estimated_info.parameters.structural_innovation_corr.list = char('s1___s2');
  estimation_info.parameters.measurement_error.nb = 2;
  estimation_info.parameters.measurement_error.list = ĉhar('s3','s4');
  estimated_info.parameters.measurement_error_corr.nb = 1;
  estimated_info.parameters.measurement_error_corr.list = char('s3___s4');

where alpha$1 and alpha$2 are correspond to alpha for the first and second subsamples.

  estimation_info.init.deep = [1.0; .5; .3 ];                        
  estimation_info.init.structural_innovation = [.01; .05];
  estimated_info.init.structural_innovation_corr = [.1];
  estimation_info.init.measurement_error = [.01; .07];
  estimated_info.init.measurement_error_corr = [-.1];            

or with the structural break on alpha:

  estimation_info.init.deep = [1.0; 1.1; .5; .3 ];                                   
  estimation_info.init.structural_innovation = [.01; .05];
  estimated_info.init.structural_innovation_corr = [.1];
  estimation_info.init.measurement_error = [.01; .07];                        
  estimated_info.init.measurement_error_corr = [-.1];                             

If there is no estimated measurement errors in the model (ie estimation_info.parameters.measurement_error.nb=0) the estimation_info.init.measurement_error and estimation_info.init.measurement_error_corr are set to a empty matrices.

  estimation_info.bounds.deep = [0, 2; 0, 1; -Inf, Inf];
  estimation_info.bounds.structural_innovation = [0, .01; 0, Inf];
  estimated_info.bounds.structural_innovation_corr = [-1 1];
  estimation_info.bounds.measurement_error = [0 Inf; 0 Inf];
  estimated_info.bounds.measurement_error_corr = [-1 1];

Default bounds for the std. are 0 and Inf, default bounds for the deep parameters are -Inf and Inf (meaning no effective bounds for the optimization).

if there is unexpected break on the (first) estimated parameter alpha, we would have

  estimation_info.subsample.deep.alpha = [ '1950:Q1', '1980:Q2'; '1980Q3', '2000:Q4'];

The following instructions given as examples are to be used within the estimated_params block.

     alpha.prior(shape=beta,mean=0.3,variance=0.1^2);

     alpha.prior(shape=beta,interval=(0.2,0.4,.9));

     theta.prior(shape=gamma,mode=4,variance=10,shift=+2);
     sigma.prior(shape=gamma,mode=-1,variance=5,shift=-2);

     plouf.prior(shape=uniform,domain=(.5,2));
     fuolp.prior(shape=beta,mode=1.5,stdev=.05,domain=(1,2));

     alpha.subsamples(name1=1950Q3:1957Q4, name2=1958Q1:1983Q2, name3=1983Q3:2011Q2) 

     alpha.name1.prior(shape=normal,mode=0.30,stdev=.01);
     alpha.name2.prior(shape=normal,mode=0.33,stdev=.01);
     alpha.name2.prior(shape=normal,mode=0.40,stdev=.01);