Question

I've got experience in a lot of other programming languages, but I'm having a lot of difficulty with Stata syntax. I've got a statement that evaluates with no problem if I put in values, but I can't figure out why it's not evaluating variables like I expect it to.

 gen j=5

 forvalues i = 1(1)5 {
    replace TrustBusiness_local=`i' if TrustBusiness_local2==`j'
    replace j=`j'-1
 }

If I replace i and j with 1 and 5 respectively, like I'm expecting to happen from the code above, then it works fine, but I get an if not found error otherwise, which hasn't produced meaningful results when Googled. Does anyone see what I don't see? I hate to brute-force something that could so simply be done with a loop.

Was it helpful?

Solution

Easy to understand once you approach it the right way!

Problem 1. You never defined local macro j. That in itself is not an error, but it often leads to errors. Macros that don't exist are equivalent to empty strings, so Stata sees in this example the code

    if TrustBusiness_local2==`j'

as

   if TrustBusiness_local2== 

which is illegal; hence the error message.

Problem 2. There is no connection of principle between a variable you called j and a local macro called j but referenced using single quotes. A variable in Stata is a variable (namely, column) in your dataset; that doesn't mean a variable otherwise in the sense of any programming language. Variables meaning single values can be held in Stata within scalars or within macros. Putting a constant into a variable, Stata sense, is legal, but usually bad style. If you have millions of observations, for example, you now have a column j with millions of values of 5 within it.

Problem 3. You could, legally, go

local j "j" 

so that now the local macro j contains the text "j", which depending on how you use it could be interpreted as a variable name. It's hard to see why you would want to do that here, but it would be legal.

Problem 4. Your whole example doesn't even need a loop as it appears to mean

replace TrustBusiness_local= 6 - TrustBusiness_local2 if inlist(TrustBusiness_local2, 1,2,3,4,5) 

and, depending on your data, the if qualifier could be redundant. Flipping 5(1)1 to 1(1)5 is just a matter of subtracting from 6.

Problem 5. Your example written as a loop in Stata style could be

local j = 5

forvalues i = 1/5 {
    replace TrustBusiness_local=`i' if TrustBusiness_local2==`j'
    local j=`j'-1
}

and it could be made more concise, but given Problem 4 that no loop is needed, I will leave it there.

Problem 6. What you talking about are, incidentally, not if statements so far as Stata is concerned, as the if qualifier used in your examples is not the same as the if command.

The problem of translating one language's jargon into another can be challenging. See my comments at http://www.stata.com/statalist/archive/2008-08/msg01258.html After experience in other languages, the macro manipulations of Stata seemed at first strange to me too; they are perhaps best understood as equivalent to shell programming.

I wouldn't try to learn Stata by Googling. Read [U] from beginning to end. (A similar point was made in the reply to your previous question at use value label in if command in Stata but you don't want to believe it!)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top