For the latest "Martin" read "Maarten".
A further error in what you wrote was that you refer at various points
to macros xvar, zvar, xvars, zvars. Local or global macro xvars is quite
distinct from local or global xvar and indeed will not even exist
unless you've defined it in earlier code.
You may have noticed that by now.
On the major point, you can bind variable names into groups using double
quotes " ". This follows from the syntax that double quotes bind more
tightly than spaces separate.
Thus you could go
local xset `" "a b c" "d e f" "g h j" "'
local zset `" "A B C" "D E F" "G H J" "'
Note the use of compound double quotes in defining the whole. Then
local T : word count `xset'
forval t = 1/`T' {
[stuff referring to word `t' of `xset']
[stuff referring to word `t' of `zset']
}
I'm all for improving one's mastery of Stata technique, but sometimes
it's just quicker to crunch through the variations of commands using a
do file and a decent text editor -- especially if you may spend much
time later trying to work out what was that clever thing you did.
Incidentally, the approach here of replacing variables by their means
and then reinstating them is quite unnecessary and indeed I would
classify it as very bad style. Never touch originals you care about.
Rather -generate- new variables with the means concerned. Or, something
more like this:
gen work1 = .
gen work2 = .
within a loop {
su <something>, meanonly
replace work1 = r(mean)
su <otherthing>, meanonly
replace work2 = r(mean)
}
Nick
[email protected]
Shehzad Ali
Thanks, Martin. Let me write down a few details about the analysis I am
trying to run. Please ignore if some of the details are irrelevant. I am
trying to run what they call 'standardisation' in literature. So here is
what I intend to do.
First loop:
1. run treatreg model: treatreg y1 x1 x2 x3 x4 x5, treat(y2=x1 x2 x3 x4
x5
instrument1)
2. then set x1 x2 at their mean values (first generate copies of x1 x2,
i.e.
x1_copy x2_copy, then summarize original x1 x2 and replace them with
their
mean values).
3.then predict yhat (so basically it uses coefficients from treatreg but
x1
x2 are at their mean values and others at their actual values)
4. drop x1 x2 (which were set at their mean values) and then rename
x1_copy
and x2_copy as x1 x2 (so these variables are back as original)
Second loop:
4. Run the same as above but this time setting x2 x4 x5 at their mean
values
Going on further, I have a few more loops where the variables which are
set
to their mean values are different (no pattern of selection of
variables)
What I was thinking of doing was to define sets of macros, i.e. for
first
loop, define macro1 as variables to be set at their mean value and
macro2 as
variables to be left as original. For second loop, I do the same and it
goes
on until I have run all the loops I wanted to run. What I needed help
with
is how to assign names to each macro and then I can run a foreach loop
so
that the macros are defined at the start and then treatreg and the rest
is
run as a loop several times.
Maarten buis
It is usually better practice to work with locals. Anyhow the answer to
your question depends on the kind of pattern you want those models to
follow. Do you want something like
x1 x2 x3
x1 x2 x4
x1 x2 x5
or
x1 x2 x3
x1 x2 x3 x4
x1 x2 x3 x4 x5
or
all combinations.
Moreover, do these variables have such systematic names, or do they
have more meaningful, but less systematic names?
Shehzad Ali
> Sorry, Martin, it was a mistake. I actually meant global. The models
> I am
> currently using are:
>
> * First model:
>
> global xvar "x1 x2"
>
> global zvar "x1 x2 v1"
>
> treatreg y1 $xvars, treat(y2=$zvars)
>
> * Second model:
>
> global xvar "x2 x3 x4"
>
> global zvar "x2 x3 x4 v1"
>
> treatreg y1 $xvars, treat(y2=$zvars)
>
> Note that I am not just adding one or two additional variables in the
> second
> model, but I am actually using a different set of variables the
> second time.
> Now I want to loop this somehow so that I just write the - treatreg -
> command line once and - foreach - can pick up different sets of
> macros each
> time the loop is run. Can you please suggest the best way to do it?
Martin Weiss
> Just a remark: are you sure you want to reference a -local- with the
> $
> sign? I do not think that this will actually work...
Shehzad Ali
> > I want to run a 2 separate treatreg models with the same y var but
> > different set of x vars. Here is what I am doing:
> >
> > * First model:
> >
> > local xvar "x1 x2" local zvar "x1 x2 v1"
> >
> > treatreg y1 $xvars, treat(y2=$zvars)
> >
> > * Second model:
> >
> > local xvar "x1 x2 x3" local zvar "x1 x2 x3 v1"
> >
> > treatreg y1 $xvars, treat(y2=$zvars)
> >
> > Now I want to loop this somehow so that I just write the - treatreg
> -
> > line once but - foreach - can pick up different sets of macros. Can
> you
> > suggest the best way to do it?
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/