2015-02-03 5 views
3

Я довольно новичок в программировании Stata.Stata - динамически определять имена переменных в цикле

Мой вопрос: мне нужно переупорядочить/изменить набор данных через (я думаю) макрос.

У меня есть набор данных для индивидуумов с переменной birthyear '(год рождения) и переменными, каждый из которых содержит вес в данном году КАЛЕНДАРА: например.

BIRTHYEAR | W_1990 | W_1991 | W_1992 | ... | w_2000 
1989 | 7.2 | 9.3 | 10.2 | ... | 35.2 
1981 | 33.2 | 35.3 | ... 

Я хотел бы получить новые переменные, содержащие вес в разном возрасте, например. Weight_age_1, Weight_age_2 и т. Д .: это означает, например, первый пример примера, оставить Weight_age_1 blank, положить 7.2 в Weight_age_2 и так далее.

Я пытался что-то вроде ...

forvalues i = 1/10{ 
    capture drop weight_age_`i' 
    capture drop birth`i 

    gen birth_`i'=birthyear-1+`i' 
    tostring birth_`i', replace 

    gen weight_age_`i'= w_birth_`i' 
} 

.. но он не работает.

Не могли бы вы помочь мне?

ответ

3

Опытные пользователи Stata не будут пытаться писать автономную программу здесь: они увидели бы, что суть проблемы - reshape.

clear 
input birthyear w_1990 w_1991 w_1992 
1989 7.2 9.3 10.2 
1981 33.2 35.3 37.6 
end 

gen id = _n 
reshape long w_, i(id) 
rename _j year 
gen age = year - birthyear 
l, sepby(id) 

     +-----------------------------------+ 
     | id year birthy~r  w_ age | 
     |-----------------------------------| 
     1. | 1 1990  1989 7.2  1 | 
     2. | 1 1991  1989 9.3  2 | 
     3. | 1 1992  1989 10.2  3 | 
     |-----------------------------------| 
     4. | 2 1990  1981 33.2  9 | 
     5. | 2 1991  1981 35.3 10 | 
     6. | 2 1992  1981 37.6 11 | 
     +-----------------------------------+ 

Чтобы получить переменные, которые вы говорите, что вы хотите, вы могли бы reshape wide, но это long структура, безусловно, более удобный способ хранения этих данных для будущей работы Stata.

P.S. Сердцем вашей проблемы программирования является то, что вы путаетесь между именами переменных и их содержимым.

Но это «просмотровых» подход сделал работу:

clear 
input birthyear w_1990 w_1991 w_1992 
1989 7.2 9.3 10.2 
1981 33.2 35.3 37.6 
end 

quietly forval j = 1/10 { 
    gen weight_`j' = . 

    forval k = 1990/1992 { 
     replace weight_`j' = w_`k' if (`k' - birthyear) == `j' 
    } 
}  

Эфирное Хитрость заключается в том, чтобы сделать манипуляцию имя, используя локальные макросы. В Stata переменные в основном предназначены для хранения данных; однозначные константы лучше сохраняются в локальных макросах и скалярах. (Ваше ощущение слова «макрос» как смысл скрипта или программы не так, как этот термин используется в Stata.)

Как указано выше: это структура данных, которую вы запрашиваете, но это, вероятно, будет более проблематичным, чем который производится reshape long.