Page 2 of 4

Re: Loop over parameters

PostPosted: Fri Jan 17, 2014 1:11 pm
by htastan
Suppose that we want to estimate the parameters using GMM. In particular, we would like to match the theoretical moments implied by the linearized model to the sample moments based on the data. Also assume that we have a separate toolbox for GMM estimation in which we just need to code the moment conditions in a separate m file. In this case, we need to pass the information obtained from first run of the Dynare to parse the code to the moment function in GMM and the objective function. Can we do this as follows:

1. In a Matlab script file define the parameters and all other necessary stuff along with

global var_list_ oo_ M_ ex0_ options_ estimation_info info
save parameters gamma1 alpha1 delta1 rho1 beta1 sigma1
dynare stochgrowth_dyna noclearall

2. In the mod file define

parameters gamma alpha delta rho beta sigma;

load parameters;

set_param_value('gamma',gamma1) % utility parameter
set_param_value('alpha',alpha1) % production elasticity
set_param_value('delta',delta1) % depreciation rate
set_param_value('rho',rho1) % production shock autocorrelation
set_param_value('beta',beta1 ) % discount factor
set_param_value('sigma',sigma1) % production shock volatility

at the beginning, the rest of the mode file is standard.

3. In the GMM moment function matlab m file:

function mom = GMMmoments(theta,X,avg)

global var_list_ oo_ M_ ex0_ options_ estimation_info info

gamma1 = theta(1);
alpha1 = theta(2);
delta1 = theta(3);
rho1 = theta(4);
beta1 = theta(5);
sigma1 = theta(6);

yobs = X(:,1);
cobs = X(:,2);
kobs = X(:,3);
iobs = X(:,4);

set_param_value('gamma',gamma1)
set_param_value('alpha',alpha1)
set_param_value('delta',delta1)
set_param_value('rho',rho1)
set_param_value('beta',beta1 )
set_param_value('sigma',sigma1)

info = stoch_simul(var_list_);
if info
disp('Stochastic Simulation failed');
end

xmean = oo_.mean;
xvar = diag(oo_.var);

Basically, what I did here is to define Dynare solution variables as GLOBAL variables in the main file and the moment file. I am not a big fan of using global variables but I could not use local variables. Is this procedure OK? Is there any other ways?

(By the way I did not post the full codes but they seem to work OK)

Re: Loop over parameters

PostPosted: Fri Jan 17, 2014 1:46 pm
by jpfeifer
Looks correct to me. There are ways to get around using global variables in the main file, but they are typically not worth the hassle. The only global variables you should need are
Code: Select all
oo_ M_  options_


One important comment: if you are using simulated moments, make sure you use the same random numbers for every parameter draw.

Re: Loop over parameters

PostPosted: Fri Jan 17, 2014 2:10 pm
by htastan
Exactly. The same set of shocks has to be used in the SMM or indirect inference. One can easily code this using Dynare with second or third order linearization.
Better way is of course to solve the nonlinear eq'm conditions using residual based methods, e.g. collocation, and then to embed it into the indirect inference framework. That would be a very nice extension to the Dynare.

By the way I think we also need

var_list_

as a global variable in addition to the ones you mentioned.
Thanks for your reply,

Cheers

Re: Loop over parameters

PostPosted: Fri Jan 17, 2014 2:40 pm
by jpfeifer
If you did not specify variables for var_list_, you can just use
Code: Select all
var_list_=[];
info = stoch_simul(var_list_);


If you did, you can either make var_list_ global or use something along the lines of
Code: Select all
var_list_=[];
var_list_ = 'yobs ';
var_list_ = char(var_list_, 'cobs');
var_list_ = char(var_list_, 'kobs');
var_list_ = char(var_list_, 'iobs');
info = stoch_simul(var_list_);

Re: Loop over parameters

PostPosted: Wed Feb 19, 2014 7:29 am
by bpyemba
Hi all,

I am trying to evaluate the conditional welfare and I am getting the following error

??? Reference to non-existent field 'eigval'.

Error in ==> check at 80
eigenvalues_ = dr.eigval;

Error in ==> openeconomy_loop_det at 626
oo_.dr.eigval = check(M_,options_,oo_);

Error in ==> dynare at 120
evalin('base',fname) ;

Error in ==> max_cond_welfare2 at 31
dynare openeconomy_loop_det noclearall nolog

How can I solve the problem?

Thanks Boniface

Re: Loop over parameters

PostPosted: Wed Feb 19, 2014 9:07 am
by jpfeifer
Your openeconomy_loop_det.mod is unable to compute the steady state.

Re: Loop over parameters

PostPosted: Wed Feb 19, 2014 9:19 am
by bpyemba
The steady state is reached using dynare 4.3.3. It doesn't work using the version 4.4.1.

Re: Loop over parameters

PostPosted: Wed Feb 19, 2014 9:21 am
by bpyemba
Hi,

Could do you please run with 4.3.3?

Boniface

Re: Loop over parameters

PostPosted: Wed Feb 19, 2014 9:34 am
by jpfeifer
No, also with Dynare 4.3.3 it does not find the steady state. This is the fundamental source of your problem.

Re: Loop over parameters

PostPosted: Wed Feb 19, 2014 10:24 am
by bpyemba
Thanks, I don't understand how it works perfectly with 4.3.3 in my computer, but not with 4.4.1. I am working on.

Re: Loop over parameters

PostPosted: Sat Mar 08, 2014 11:40 am
by jpfeifer
You could try
Code: Select all
steady(solve_algo=4);

in Dynare 4.4.2

Re: Loop over parameters

PostPosted: Sun Sep 20, 2015 12:36 am
by dphm
Hi everyone

If I may follow up from this post, I am actually doing the same as kipfilet. But I gotta get the impulse response functions from the newly resolved steady state.

Previously, when I executed the "dynare" command, I simply could use oo_.irfs in my m file. But now, I don't know where the IRFs are stored after I run the command "[dr_,~,M_,~,oo_] = resol(0,M1_,options1_,oo1_);".

May I know how I can plot the impulse response functions thereafter?

Thanks.

Re: Loop over parameters

PostPosted: Mon Sep 21, 2015 7:09 am
by jpfeifer
in that case you actually need to loop over
Code: Select all
info = stoch_simul(var_list_);

instead of resol. The irfs will then be stored in their usual place.

Re: Loop over parameters

PostPosted: Sat Dec 05, 2015 1:34 pm
by HouseC
Dears,
I'm following discussion here and what I'm also doing with grid search is to generate expected welfare for different monetary rules setting.

Here is my example code for loop.
Code: Select all
aaa=[
    0.1 0.3
    0.1 0.3
    0.1 0.3
    0.1 0.3];
first_time = 1;
welfare=zeros(1,2);
for i1=1:2
    e=aaa(1,i1);
    f=aaa(2,i1);
    g=aaa(3,i1);
    h=aaa(4,i1);

    if first_time
save parameterfile1 e f g h;
dynare LcpTax.mod noclearall;
       first_time = 0;
    else
set_param_value('sigma1',e);
set_param_value('sigma2',f);
set_param_value('sigmas1',g);
set_param_value('sigmas2',h);

nv=101;
eu_v=zeros(1,nv);
eus_v=zeros(1,nv);
eu_w=zeros(1,nv);

for jj=1:nv;
v=(jj-1)/(nv-1);
info=stoch_simul(var_list_);
eu_v(jj)=oo_.mean(26);
cbar=oo_.steady_state(1);
lbar=oo_.steady_state(3);
eu_v(jj)=(((eu_v(jj)*(1-beta)+eta*lbar)*(1-rho))^(1/(1-rho))/cbar-1)*100;

eus_v(jj)=oo_.mean(27);
csbar=oo_.steady_state(13);
lsbar=oo_.steady_state(15);
eus_v(jj)=(((eus_v(jj)*(1-beta)+eta*lsbar)*(1-rho))^(1/(1-rho))/csbar-1)*100;
eu_w(jj)=n*eu_v(jj)+(1-n)*eus_v(jj);

end;


My questions is:
based on the discussion, we only need to call dynare once and then change different parameter and redo the simulation. I double check the result in this example code, and find that the estimated welfare are different between calling dynare each time and the method mentioned in the previous code.
I believe that calling dynare for each loop will return the correct result, then anyone could suggest what's the problem with my code listed above?

Re: Loop over parameters

PostPosted: Sun Dec 06, 2015 1:47 am
by monsoon
Just clarifying a doubt with reference to the above topic. Is looping important when we deal with endogenous collateral constraints?