2015-10-21 3 views
1

У меня есть набор данных в Stata следующей формыГенерирующие манекены в Stata

id | year 
a | 1950  
b | 1950 
c | 1950 
d | 1950 
. 
. 
. 
y | 1950 
----- 
a | 1951 
b | 1951 
c | 1951 
d | 1951 
. 
. 
. 
y | 1951 
----- 
... 

Я ищу быстрый способ переписывания следующий код

gen dummya=1 if id=="a" 
gen dummyb=1 if id=="b" 
gen dummyc=1 if id=="c" 
... 
gen dummyy=1 if id=="y" 

и

gen dummy50=1 if year==1950 
gen dummy51=1 if year==1951 
... 

ответ

3

Обратите внимание, что все ваши манекены будут созданы как 1 или отсутствуют. Почти всегда полезно создавать их непосредственно как 1 или 0. Действительно, это обычное определение манекенов.

В общем, это цикл по возможностям с использованием forvalues или foreach, но ярлык слишком прост, чтобы не быть предпочтительным в этом случае. Рассмотрим этот воспроизводимый пример:

. sysuse auto, clear 
(1978 Automobile Data) 

. tab rep78, gen(rep78) 

    Repair | 
Record 1978 |  Freq.  Percent  Cum. 
------------+----------------------------------- 
      1 |   2  2.90  2.90 
      2 |   8  11.59  14.49 
      3 |   30  43.48  57.97 
      4 |   18  26.09  84.06 
      5 |   11  15.94  100.00 
------------+----------------------------------- 
     Total |   69  100.00 

. d rep78? 

       storage display value 
variable name type format  label  variable label 
------------------------------------------------------------------------------ 
rep781   byte %8.0g     rep78== 1.0000 
rep782   byte %8.0g     rep78== 2.0000 
rep783   byte %8.0g     rep78== 3.0000 
rep784   byte %8.0g     rep78== 4.0000 
rep785   byte %8.0g     rep78== 5.0000 

Это все манекены (некоторые предпочитают говорить «показатели») одним махом через опции tabulate.

Для полноты рассмотрите пример, сделав это методом петли. Мы представляем себе, что годы 1950-2015 представлены:

forval y = 1950/2015 { 
    gen byte dummy`y' = year == `y' 
} 

Две цифры идентификаторы dummy50 для dummy15 бы однозначен в этом примере, поэтому здесь они в качестве бонуса:

forval y = 1950/2015 { 
    local Y : di %02.0f mod(`y', 100) 
    gen byte dummy`y' = year == `y' 
} 

Здесь byte является необязательной, если память очень короткая, но это хорошая практика.

Если кто-то решил написать цикл для создания индикаторов для различных значений строковой переменной, это тоже можно сделать. Вот две возможности. Отсутствие легко воспроизводимого примера в исходном сообщении, создадим песочницу. Первый метод - сначала encode, затем цикл над отдельными числовыми значениями. Второй способ - найти прямые строковые значения, а затем перебрать их.

clear 
set obs 3 
gen mystring = word("frog toad newt", _n) 

* Method 1 

encode mystring, gen(mynumber) 
su mynumber, meanonly 

forval j = 1/`r(max)' { 
    gen dummy`j' = mynumber == `j' 
    label var dummy`j' "mystring == `: label (mynumber) `j''" 
} 

* Method 2 

levelsof mystring 

local j = 1 
foreach level in `r(levels)' { 
    gen dummy2`j' = mystring == `"`level'"' 
    label var dummy2`j' `"mystring == `level'"' 
    local ++j 
} 

describe 

Contains data 
    obs:    3       
vars:    8       
size:   96       
------------------------------------------------------------------------------ 
       storage display value 
variable name type format  label  variable label 
------------------------------------------------------------------------------ 
mystring  str4 %9s     
mynumber  long %8.0g  mynumber 
dummy1   float %9.0g     mystring == frog 
dummy2   float %9.0g     mystring == newt 
dummy3   float %9.0g     mystring == toad 
dummy21   float %9.0g     mystring == frog 
dummy22   float %9.0g     mystring == newt 
dummy23   float %9.0g     mystring == toad 
------------------------------------------------------------------------------ 
Sorted by: 
+0

Как насчет манекенов для наблюдений в id? Это не цифры, и я не вижу, как приспособить forval y =? – user3285148

+0

Вам не обязательно. 'tabulate' также охватывает этот случай, строковые переменные. В противном случае put, (1) 'tabulate' предлагает опрятное решение здесь (2), если кому-то интересно, есть и неудивительно, что решения для цикла тоже. Но я добавлю решение цикла для строковой переменной в ответ. –

1

Использование i.<dummy_variable_name>

Например, в вашем случае, вы можете использовать следующую команду для регрессии:

reg y i.year 
+0

Вопрос вашего ответа в том, что вам даже не нужно вообще создавать индикаторы.Прекрасно, но для полноты я предлагаю вам прочесть это немного подробнее. –

+0

@ NickCox - вы правы. поэтому для всей регрессии мы просто используем этот ярлык. Вместо создания переменной взаимодействия можно использовать символ # для взаимодействия. Пример reg y a b a # b – Vivek

1

Я также рекомендую использовать

egen year_dum = group(year) 
reg y i.year_dum 

Это может быть обобщено произвольно, и вы можете легко создавать, например, фиксированные эффекты по годам следующим образом:

egen year_state_dum = group(year state) 
reg y i.year_state_dum 
+0

Вы правы. Я просто отмечаю, что (например, с 50 штатами и 20 годами и без пробелов - это тысячи манекенов). Независимо от того, является ли это хорошей идеей, не зависит от того, как это сделать в Stata. Кроме того, что более важно для кодирования, групповая переменная без меток трудно интерпретировать, не возвращаясь к оригиналу. Это не относится к использованию, например, год. Таким образом, год 2008 должен означать что-то для исследователя, но группа, которая не является 18, не имеет прямого отношения. Если вы не планируете смотреть все манекены, это не укусит. Действительно, с 1000 манекенами вы не захотите. –

+1

Согласен, глядя на 100 манекенов, не имеет смысла. Но если у вас есть отдельные наблюдения, вы все равно можете контролировать эффекты состояния и года. Затем рассмотрите использование areg с опцией «absorb (year_state_dum)». Это будет унижать ваши данные соответствующим образом, давая тот же результат, как если бы вы включили все манекены. – Superpronker

Смежные вопросы