Bookmark and Share

Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.


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

st: for loops in Mata


From   Karina Corbett <[email protected]>
To   "[email protected]" <[email protected]>
Subject   st: for loops in Mata
Date   Tue, 29 Oct 2013 11:07:28 +0000

Dear Statalist members,

I am using Stata 12 for Windows (and Stata 13 for Mac )

I have a dataset with annual updates of the municipality in which people live for all individuals in a birth cohort (n=650 000). The follow-up period spans 30 years, and the variable names are in the format municipality1968, municipality1969, etc. I also have a variable for year of birth. I want is to generate a new variable that indicates how many times a person moved (between municipalities) from two years prior to birth to age 18. Perhaps there is an easier way of doing this (and if there is, I would be happy to know!), but I have tried using Mata interactively, and have run into a problem.

The municipality variables are ordered in the dataset according to year of observation. I started off just checking whether first column differed from second, etc, and added +1 to an indicator variable (cum_move) each time they differed (each time a person moved).  So far so good. However, when I tried to restrict column range according to year of birth, so that for people born in 1970, I would only check columns 1-20, and for those born in 1971, I would check column numbers 2-21, etc, the program just runs seemingly forever (or until I stop it). I transformed year of birth into the variable "yob_ind" that takes on value 1 for person born in 1970, and 2 for person born in 1971, etc.


ds municpality*
local municpality `r(varlist)' 
di"` municpality "

mata
municpality =st_local("municpality ") 
st_view(K=., ., tokens(municpality), "touse" )
st_view(cum=., .,("cum_mov"), "touse" )
st_view(yob=., .,("yob_ind"), "touse")

for (i=1; i<=rows(K); i++) {
               for (j=yob[i]; j=(yob[i]+19); j++) {
                              if (K[i,j] != K[i,j+1])                                         {
                                            cum[i]= cum[i]+1
                                                                                         }             
                                                                          }
                                                           }

Does anyone know what I am doing wrong here? Is there a better way of solving this problem? 
I am just starting out using Mata so apologies for poor style or  if I've left out important information.
Any advice would be greatly appreciated

Karina

--
Karina Corbett, MPhil
PhD student, Department of occupational medicine and epidemiology 
National Institute of Occupational Health, Norway



*
*   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/


© Copyright 1996–2018 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index