在Stata中生成假人

时间:2015-10-21 14:18:45

标签: 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 个答案:

答案 0 :(得分:3)

请注意,您的所有假人都会被创建为1或缺失。将它们直接创建为1或0几乎总是更有用。的确,这通常是假的定义

一般来说,它是使用forvaluesforeach的可能性的循环,但在这种情况下,快捷方式太容易不被优先考虑。考虑这个可重复的例子:

. 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' 
} 

在这个例子中,两位数的标识符dummy50dummy15将是明确的,所以在这里它们是奖励:

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: 

答案 1 :(得分:1)

使用i.<dummy_variable_name>

例如,在您的情况下,您可以使用以下命令进行回归:

reg y i.year

答案 2 :(得分:1)

我还建议使用

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

这可以任意推广,你可以通过这种方式轻松创建,例如逐年固定效果:

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