Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down on April 23, and its replacement, statalist.org is already up and running.

# Re: st: How to incorporate several dependent variables to the moment evaluating function in gmm?

 From "Brian P. Poi" To statalist@hsphsun2.harvard.edu Subject Re: st: How to incorporate several dependent variables to the moment evaluating function in gmm? Date Mon, 26 Nov 2012 09:48:27 -0600

```On 11/26/2012 08:30 AM, Christoph Jäckel wrote:
```
```Hello Stata experts,

I'm just learning Stata and I'm struggling with the following
problem. I want to map a time-series regression with several dependent
variables into a GMM.

Let's make a small example. I have two dependent variables y1 and y2
and one explaining factor x1. Then I get the following moments that
should all be zero:

E[(y1 - a1 - b1 * x1)]
E[(y2 - a2 - b2 * x1)]
E[(y1 - a1 - b1 * x1)x1]
E[(y2 - a2 - b2 * x1)x1]

where a1, a2, b1, and b2 are the parameters to estimate. I found this
link on the list that deals with several equations in a GMM:
http://www.stata.com/statalist/archive/2011-06/msg00363.html

However, as far as I can see, the dependent variable is not changed.
What I actually want: I want to pass a list of vectors to the moment
evaluating function and create the relevant moments for each vector of
that list. Those vectors are the dependent variables.

I think it's clearer when I show you what I tried so far.

_______________
sysuse auto, clear

program mygmm

version 12

syntax varlist [if] , at(name) mylhs(varlist)

local eq1 : word 1 of `mylhs'
local eq2 : word 2 of `mylhs'
*Approach 1: Breaks with error "varlist not allowed"
*        quietly replace `eq1' = `eq1' - `at'[1,1] - `at'[1,3]*turn
*        quietly replace `eq2' = `eq2' - `at'[1,2] - `at'[1,4]*turn

*Approach 2: Breaks with error "varlist not allowed"
local j=1
foreach lhs of varlist `mylhs' {
replace `mylhs' = `mylhs' - `at'[1,j] - `at'[1,2 + j]*turn
j = j + 1
}

end

gmm mygmm, nequations(4) nparameters(4) mylhs(mpg headroom)
instruments(turn) winitial(identity)
_______________

Here, I took the example from the link above, but I am now trying to
have two different dependent variables, namely mpg and headroom. I
tried two approaches: the first is pretty similar to the one given in
the link, the second just loops to the mylhs list. Both don't work,
and I don't quite understand why. I hope I passed the arguments
correctly, but to be fair, I'm not sure if I do. I don't quite get the
evaluating function do exactly? What should it return? In the examples
I found, it always sets  `varlist' to the moments that should be zero,
which makes sense to me. For instance, here
(http://www.stata.com/features/generalized-method-of-moments/gmm.pdf)
on p. 27 the last line is

replace `varlist' = `mylhs' - `mu'*`ybar'/`mubar' `if'

I think I get this: `varlist' is set to an expression that depends on
the parameters and then a search for the parameters is started that
should sets `varlist' to zero (since Moments=Parameters).  My problem
is that
my `varlist' is not just one vector as in the examples I found, but a
list of factors.

Note that the above example is simple enough to just give the formulas:

_______________
#delimit ;
gmm (mpg      - ({alpha1=0} + {beta1=0}*turn))
, inst (turn) onestep winitial(identity) ;
#delimit cr
_______________

However, I want to run more complicated models and therefore I need to
know how to write moment evaluating functions correctly. Any help is
greatly appreciated.

Christoph
```
```
Christoph,

You are almost there.  The `varlist' in the evaluator function is the list of variables into which you are to place the values of the residual functions.  That's different from the list of variables you specify in your mylhs() option.  For simplicity, let me swap the order of two of your moment equations:

```
```E[(y1 - a1 - b1 * x1)]
E[(y1 - a1 - b1 * x1)x1]
E[(y2 - a2 - b2 * x1)]
E[(y2 - a2 - b2 * x1)x1]
```
```
You have two residual functions: (y1 - a1 - b1 * x1) and (y2 - a2 - b2 * x2), each interacted with a constant term and x1, yielding a total of four moment conditions.  When you specify nequations(2) (not 4 as you tried), `varlist' will have two elements where you are to place the two residual functions.  Here's working version of your program:

sysuse auto, clear

program mygmm

version 12

syntax varlist [if] , at(name) mylhs(varlist)

local eq1 : word 1 of `varlist'
local eq2 : word 2 of `varlist'

local y1 : word 1 of `mylhs'
local y2 : word 2 of `mylhs'

quietly replace `eq1' = `y1' - `at'[1,1] - `at'[1,3]*turn
quietly replace `eq2' = `y2' - `at'[1,2] - `at'[1,4]*turn

end

gmm mygmm, nequations(2) nparameters(4) mylhs(mpg headroom)	///
instruments(turn) winitial(identity) onestep

Because we specified instruments(turn) without any suboptions, both turn and a constant will be used as instruments for each of the residual functions.

```
```#delimit ;
gmm (mpg      - ({alpha1=0} + {beta1=0}*turn))
, inst (turn) onestep winitial(identity) ;
#delimit cr
```
```
you'll get the same results, except that the second and third parameters will be swapped.  In the evaluator program, you take the second element of `at' to be alpha2 and the third element to be beta2.  When -gmm- parses your substitutable expression in the latter case, it will come across beta1 before alpha2, and it builds up the parameter vector in the order in which it finds parameters.

-- Brian Poi
-- bpoi@stata.com

*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/faqs/resources/statalist-faq/
*   http://www.ats.ucla.edu/stat/stata/
```