Tags: basic, estimation, following, function, generalized, gmm, matlab, method, moments, pretty, programming, stuckt

Generalized Method of Moments

On Programmer » Matlab

10,268 words with 9 Comments; publish: Thu, 08 May 2008 01:01:00 GMT; (200171.88, « »)

Hi, I have the following problem with Generalized Method of Moments

(GMM) estimation. That is pretty basic but I am stuckt.

I have the function to be minimized with respect to parameter called

'param':

function f = myfunction(param)

g = ... %g: data and 'param' depending vector valued function

W =... % W: matrix fixed in the first iteration, dependent from

'param' and data

f = g'*inv(W)*g --> (*)

now I minimize f with respect to 'param':

[param]=fminunc(.matlab.questionfor.info.myfunction, 'starting value for param')

and get vector 'param' which optimizes 'myfunction'. Then I calculate

W with respect to (new) 'param'-->get W1 and want to apply

received matrix W1 in 'myfunction', simply replace in the function

formula so f = g'*W1*g see(*).

how to do it automatically'

Then optimize myfunction (with W1) with respect to 'param' get new W

say W2, then apply to (*) and iterate in that manner.

I am sure all GMM users know the problem.

best, robert

All Comments

Leave a comment...

  • 9 Comments
    • Rob,

      The structure of the code would be along these lines.

      while (stopping_condition == false)

      ...

      W=...

      fhandle = .matlab.questionfor.info.(x)myfunction(x,W)

      [param]=fminunc(fhandle, 'starting value for param')

      ...

      loop

      Notice that "myfunction" is nested within an anonymous function, that

      way the function passed on to fminunc, changes according to new values

      of W in each iteration.

      #1; Thu, 08 May 2008 01:02:00 GMT
    • Hi Phil, thanks a lot for help.

      If you don't mind please have a look at the following. I tried to

      apply your suggestions.

      Is it correct the following code? since it stucked on

      fhandle = .matlab.questionfor.info.(x)myfunction(x,W) telling that:

      "identifier" expected, "(" found. (**)

      I changed a little bit and wrote:

      while (stopping_condition == false) (***)

      W = eye(4); % as starting matrix (fixed one)

      fhandle = myfunction(.matlab.questionfor.info.param,W); %here I changed as response to

      indicated above (**), correct'

      st = [0.01 0.2 0.01];

      [param] = fminunc(fhandle,st)

      W = autocov(param); % generates new W matrix by external function

      'autocov'

      loop

      end

      now matlab asks me about the line (***)

      "Expected a variable, function, or constant, found "% comment".", I

      don't know the stopping loop value of param since I want to estimate

      it. What kind of stopping_value I need ' is it the number of

      iterations?

      would very appreciate your corrections to my version.

      best, rob

      Phil wrote:

      >

      > Rob,

      > The structure of the code would be along these lines.

      > while (stopping_condition == false)

      > ...

      > W=...

      > fhandle = .matlab.questionfor.info.(x)myfunction(x,W)

      > [param]=fminunc(fhandle, 'starting value for param')

      > ...

      > loop

      > Notice that "myfunction" is nested within an anonymous function,

      > that

      > way the function passed on to fminunc, changes according to new

      > values

      > of W in each iteration.

      >

      #2; Thu, 08 May 2008 01:03:00 GMT
    • robert wrote:

      >

      > Hi Phil, thanks a lot for help.

      > If you don't mind please have a look at the following. I tried to

      > apply your suggestions.

      > Is it correct the following code? since it stucked on

      > fhandle = .matlab.questionfor.info.(x)myfunction(x,W) telling that:

      > "identifier" expected, "(" found. (**)

      You cannot use anonymous functions

      unless you upgrade your matlab release.

      They were not introduced until release

      14.

      John

      #3; Thu, 08 May 2008 01:04:00 GMT
    • Rob,

      First of all, did u change your "myfunction" to accept W as one of its?

      i.e.

      gmm_value = myfunction(params,W)

      having done so, the instruction

      fhandle = .matlab.questionfor.info.(x)myfunction(x,W)

      should work properly.

      Further, you have to initialize W outside of the while...loop

      statement, if not in each iteration you'll have W=eye(4) as the input

      to "myfunction".

      It should then look like this:

      W = eye(4); % as starting matrix (fixed one)

      while (stopping_condition == false)

      fhandle = .matlab.questionfor.info.(x)myfunction(x,W);

      st = [0.01 0.2 0.01];

      [param] = fminunc(fhandle,st)

      W = autocov(param)

      loop

      (by the way...as u are trying to get GMM work, I'm at the moment

      trying to code a quasi-maximum likelihood estimation)

      robert wrote:

      > Hi Phil, thanks a lot for help.

      > If you don't mind please have a look at the following. I tried to

      > apply your suggestions.

      > Is it correct the following code? since it stucked on

      > fhandle = .matlab.questionfor.info.(x)myfunction(x,W) telling that:

      > "identifier" expected, "(" found. (**)

      > I changed a little bit and wrote:

      > while (stopping_condition == false) (***)

      > W = eye(4); % as starting matrix (fixed one)

      > fhandle = myfunction(.matlab.questionfor.info.param,W); %here I changed as response to

      > indicated above (**), correct'

      > st = [0.01 0.2 0.01];

      > [param] = fminunc(fhandle,st)

      > W = autocov(param); % generates new W matrix by external function

      > 'autocov'

      > loop

      > end

      > now matlab asks me about the line (***)

      > "Expected a variable, function, or constant, found "% comment".", I

      > don't know the stopping loop value of param since I want to estimate

      > it. What kind of stopping_value I need ' is it the number of

      > iterations?

      > would very appreciate your corrections to my version.

      > best, rob

      > Phil wrote:

      #4; Thu, 08 May 2008 01:05:00 GMT
    • Phil, I followed your suggestions about myfunction(x,W) but still my

      procedure stucks in line:

      > fhandle = .matlab.questionfor.info.(x)myfunction(x,W)

      telling:

      "identifier" expected, "(" found.

      (concerns the bracket before x)

      I work on matlab release 13th so as John posted anonymous functions

      are not supported until release 14th..

      Do you have any suggestions, since I am not s much familiar with

      handling procedure' in matlab

      rob

      Phil wrote:

      >

      > Rob,

      > First of all, did u change your "myfunction" to accept W as one of

      > its?

      > i.e.

      > gmm_value = myfunction(params,W)

      > having done so, the instruction

      > fhandle = .matlab.questionfor.info.(x)myfunction(x,W)

      > should work properly.

      > Further, you have to initialize W outside of the while...loop

      > statement, if not in each iteration you'll have W=eye(4) as the

      > input

      > to "myfunction".

      > It should then look like this:

      > W = eye(4); % as starting matrix (fixed one)

      > while (stopping_condition == false)

      > fhandle = .matlab.questionfor.info.(x)myfunction(x,W);

      > st = [0.01 0.2 0.01];

      > [param] = fminunc(fhandle,st)

      > W = autocov(param)

      > loop

      > (by the way...as u are trying to get GMM work, I'm at the moment

      > trying to code a quasi-maximum likelihood estimation)

      >

      >

      >

      > robert wrote:

      to

      function

      comment".",

      > I

      > estimate

      > function,

      to new

      >

      #5; Thu, 08 May 2008 01:06:00 GMT
    • Hi John,

      yes it seems to be like that, do you have any suggestions how to

      overcome this obstacle in Matlab release 13th'

      will very appreciate any help

      rob

      John D'Errico wrote:

      >

      > robert wrote:

      to

      > You cannot use anonymous functions

      > unless you upgrade your matlab release.

      > They were not introduced until release

      > 14.

      > John

      #6; Thu, 08 May 2008 01:07:00 GMT
    • rob wrote:

      >

      > Hi John,

      > yes it seems to be like that, do you have any suggestions how to

      > overcome this obstacle in Matlab release 13th'

      > will very appreciate any help

      > rob

      As I expected. There are just so many R13

      holdouts, even R11 and 12.

      Here is a snippet of code from a previous

      response in this thread. I'ver repaired

      it in a few places, as well as changed

      the call to fminunc to use the older

      style for calling it.

      W = eye(4); % as starting matrix (fixed one)

      param0 = [0.01 0.2 0.01];

      tol = 1.e-6;

      delta = inf;

      while (delta > tol)

      [param] = fminunc('myfunction',param0,[],W);

      W = autocov(param);

      delta= norm(param-param0);

      param0 = param;

      end

      You must also have defined the function

      'myfunction' to take TWO arguments: param

      and W, in that order.

      Choose your own value for tol as desired.

      HTH,

      John D'Errico

      #7; Thu, 08 May 2008 01:08:00 GMT
    • it is working! thanks a lot

      one more question, how to count the number of iterations in this

      fminunc specification' since options=optimset( iterations) fails

      rob

      John D'Errico wrote:

      >

      > rob wrote:

      to

      > As I expected. There are just so many R13

      > holdouts, even R11 and 12.

      > Here is a snippet of code from a previous

      > response in this thread. I'ver repaired

      > it in a few places, as well as changed

      > the call to fminunc to use the older

      > style for calling it.

      > W = eye(4); % as starting matrix (fixed one)

      > param0 = [0.01 0.2 0.01];

      > tol = 1.e-6;

      > delta = inf;

      > while (delta > tol)

      > [param] = fminunc('myfunction',param0,[],W);

      > W = autocov(param);

      > delta= norm(param-param0);

      > param0 = param;

      > end

      > You must also have defined the function

      > 'myfunction' to take TWO arguments: param

      > and W, in that order.

      > Choose your own value for tol as desired.

      > HTH,

      > John D'Errico

      #8; Thu, 08 May 2008 01:09:00 GMT
    • rob wrote:

      >

      > it is working! thanks a lot

      > one more question, how to count the number of iterations in this

      > fminunc specification' since options=optimset( iterations) fails

      > rob

      Why does optimset fail? It will only

      fail if you fail to pass in options to

      fminunc.

      Note the 3rd argument to fminunc.

      Are you asking how to count the number

      of iterations on W? If so, nothing stops

      you from counting them.

      John

      #9; Thu, 08 May 2008 01:10:00 GMT