Statalist


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

st: RE: Re: local macro with if qualifier


From   "Nick Cox" <n.j.cox@durham.ac.uk>
To   <statalist@hsphsun2.harvard.edu>
Subject   st: RE: Re: local macro with if qualifier
Date   Tue, 7 Apr 2009 14:45:39 +0100

How to tackle problems like Sabrina's? Here are suggestions of tactics
on several levels. 

Read help files very closely and carefully
==========================================

-help local- indicates allowed syntaxes with -local-. If -if- (or -in-)
were allowed, that would be explicit in the syntax diagram. It is not. 

Only rarely does Stata disguise its syntax and only for good reason! 

(It follows, in this case, that Martin's comment about -if- being
evaluated for the first observation does not apply here. More on that in
a moment.) 

Experiment with simple cases
============================

If you're unsure about what a definition implies, experiment with simple
cases. Let Stata tell you. Here's an illustration: 

. sysuse auto
(1978 Automobile Data)

. local a = 1

. local a = `a' + 1 if mpg == 1
if not allowed
r(101);

In short, syntax like this is not allowed. (So, in relation to Martin's
comment, whether it would do what you want is immaterial.) 

Now this is legal: 

. local a if mpg == 1

But what is the result? 

. di "`a'"
if mpg == 1

What you typed is just copied as text, without being executed. So this
strategy is unlikely to be what Sabrina wants. 

Illustrate your problem with mutually accessible data
=====================================================

I just did what anybody can do, as datasets like the -auto- data are
installed with Stata. The converse should be obvious: we don't have your
data, which makes it harder to get to the position you are in. 

Don't say "it didn't work"; say what happened
=============================================

I have an evolving private document detailing (so far) 19 different
senses of "didn't work", collected from Statalist postings. Even Stata
experts familiar with what you are doing often can't tell what you mean
when you say "it didn't work". A report like that above makes it
clearer. 

Don't treat Statalist as write-only
===================================

Some members of Statalist post only when they have a problem and ignore
it otherwise. That's understandable, especially as we are all "too
busy", but it means that those members often miss relevant material.
Only two hours before Sabrina's posting Ihsuan Li closed a thread in
which the difference between 

if <condition> { 
		<action>
}

and 

<action> if <condition> 

was clearly exposed. 

State the problem, as well as your failed solution
===================================================

As Martin signalled wisely, Sabrina did not explain her problem. My
instinct is that her code looks way more complicated than her problem is
likely to require, but I too am too busy to give more time to trying to
infer what the problem is. 

Don't get out of your depth
===========================

If you are struggling with Stata basics, writing long complicated code
is almost never going to work. 

Nick 
n.j.cox@durham.ac.uk 

Martin Weiss

What exactly are those "d31b_`i'"? If they are variables, then the -if- 
qualifiers are evaluated for the first value only. This may be what you 
want, but experience shows that users are unaware of this more often
than 
they actually want it. If you could give a description of your data and
what 
you want to achieve, I am quite sure that you will soon get a much
easier 
solution...

Sabrina Carrossa

> how can i use a local macro with the if qualifier option?
> Unfortunately, this code doesn't work:
>
> local i=`i'+1 if d31b_`i'!=d31b_`y' & d31b_`i'==0 & `y'<3
>
> Thank you in advance.
>
> The full code is:
>
> gen amico=0
> local i=1
> set trace on
> forval y=2/3 {
>    replace amico=`i' if d31b_`i'!=d31b_`y' & d31b_`i'==1 & `y'==3
>    replace amico=`i' if d31b_`i'==d31b_`y' & d31b_`i'==1 &
> d31c_`i'>d31c_`y' & `y'==3
>    replace amico=`i' if d31b_`i'==d31b_`y' & d31b_`i'==1 &
> d31c_`i'==d31c_`y' & d31d_`i'>d31d_`y' & `y'==3
>    replace amico=`i' if d31b_`i'==d31b_`y' & d31b_`i'==1 &
> d31c_`i'==d31c_`y' & d31d_`i'==d31d_`y' & `y'==3
>    replace debug=1 if d31b_`i'==d31b_`y' & d31b_`i'==1 &
> d31c_`i'==d31c_`y' & d31d_`i'==d31d_`y' & `y'==3
>
>    replace amico=`y' if d31b_`i'!=d31b_`y' & d31b_`i'==0 & `y'==3
>    replace amico=`y' if d31b_`i'==d31b_`y' & d31b_`i'==1 &
> d31c_`i'<d31c_`y' & `y'==3
>    replace amico=`y' if d31b_`i'==d31b_`y' & d31b_`i'==1 &
> d31c_`i'==d31c_`y' & d31d_`i'<d31d_`y' & `y'==3
>    replace amico=`y' if d31b_`i'==d31b_`y' & d31b_`i'==1 &
> d31c_`i'==d31c_`y' & d31d_`i'==d31d_`y' & `y'==3
>
>    local i=`i'+1 if d31b_`i'!=d31b_`y' & d31b_`i'==0 & `y'<3
>    local i=`i'+1 if d31b_`i'==d31b_`y' & d31b_`i'==1 &
> d31c_`i'<d31c_`y' & `y'<3
>    local i=`i'+1 if d31b_`i'==d31b_`y' & d31b_`i'==1 &
> d31c_`i'==d31c_`y' & d31d_`i'<d31d_`y' & `y'<3
> }
> set trace off

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



© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   What's new   |   Site index