Search code examples
for-loopforeachregressionstata

How to write local macros for regression loops


I am programming a regression loop in Stata ato compute several models with different dependent variables and with some constant and some different independent variables. This is an example:

regress y1code1 relcode1 melcode1
regress y2code1 relcode1 melcode1
regress y3code1 relcode1 melcode1

regress y1code2 relcode2 melcode2
regress y2code2 relcode2 melcode2
regress y3code2 relcode2 melcode2

regress y1code3 relcode3 melcode3
regress y2code3 relcode3 melcode3
regress y3code3 relcode3 melcode3

regress y1code4 relcode4 melcode4
regress y2code4 relcode4 melcode4
regress y3code4 relcode4 melcode4

The structure is repeated for other 30 codes** that are not ordered consequentially (in the labels the first go from 1 to 24 and the other from 69 to 74)

Any suggestion to obtain the loop with only the single code regressed for the three dependent variables above mentioned?


Solution

  • I won't attempt to write code for the irregular names you mention. It seems likely that in your best interests you should rename to a consistent logical pattern.

    Your code block

    regress y1code1 relcode1 melcode1
    regress y2code1 relcode1 melcode1
    regress y3code1 relcode1 melcode1
    
    regress y1code2 relcode2 melcode2
    regress y2code2 relcode2 melcode2
    regress y3code2 relcode2 melcode2
    
    regress y1code3 relcode3 melcode3
    regress y2code3 relcode3 melcode3
    regress y3code3 relcode3 melcode3
    
    regress y1code4 relcode4 melcode4
    regress y2code4 relcode4 melcode4
    regress y3code4 relcode4 melcode4
    

    can be rewritten

    forval j = 1/4 { 
    
        local x relcode`j' melcode`j' 
    
        forval k = 1/3 { 
            regress y`k'code`j' `x' 
        } 
    
     }
    

    As a test of the code (there's no data example that I can use) I ran this instead:

    forval j = 1/4 { 
    
        local x relcode`j' melcode`j' 
    
        forval k = 1/3 { 
            display "regress y`k'code`j' `x'"  
        } 
    
     }
    

    with this result:

    regress y1code1 relcode1 melcode1
    regress y2code1 relcode1 melcode1
    regress y3code1 relcode1 melcode1
    regress y1code2 relcode2 melcode2
    regress y2code2 relcode2 melcode2
    regress y3code2 relcode2 melcode2
    regress y1code3 relcode3 melcode3
    regress y2code3 relcode3 melcode3
    regress y3code3 relcode3 melcode3
    regress y1code4 relcode4 melcode4
    regress y2code4 relcode4 melcode4
    regress y3code4 relcode4 melcode4