在Stata中生成假人

在Stata中生成假人,stata,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 i

我在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"


请注意,所有的假人都将创建为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
通过
制表
选项,这些都是傻瓜(有些人更喜欢说“指标”)

对于完整性,考虑一个循环的例子。我们设想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
是可有可无的,除非内存非常短,但无论如何,这都是一种很好的做法

如果有人决定写一个循环来为字符串变量的不同值创建指示符,也可以这样做。这里有两种可能性。在原始帖子中没有一个易于复制的示例,让我们创建一个沙盒。第一种方法是先对编码,然后循环不同的数值。第二种方法是直接查找不同的字符串值,然后在其上循环

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或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
通过
制表
选项,这些都是傻瓜(有些人更喜欢说“指标”)

对于完整性,考虑一个循环的例子。我们设想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
是可有可无的,除非内存非常短,但无论如何,这都是一种很好的做法

如果有人决定写一个循环来为字符串变量的不同值创建指示符,也可以这样做。这里有两种可能性。在原始帖子中没有一个易于复制的示例,让我们创建一个沙盒。第一种方法是先对编码,然后循环不同的数值。第二种方法是直接查找不同的字符串值,然后在其上循环

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: 
使用
i.

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

reg y i.year
使用
i.

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

reg y i.year

我还建议使用

egen year_dum = group(year) 
reg y i.year_dum
这可以任意概括,并且您可以通过这种方式轻松创建,例如,按州划分的固定效应:

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

我还建议使用

egen year_dum = group(year) 
reg y i.year_dum
这可以任意概括,并且您可以通过这种方式轻松创建,例如,按州划分的固定效应:

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

在id中观察的假人呢?这些不是数字,我看不出如何适应forval y=?你不必<代码>表格也涵盖了这种情况和字符串变量。否则,(1)
tablate
在这里提供了简洁的解决方案(2)如果有人感兴趣,也不足为奇地有循环解决方案。但我会在答案中添加一个字符串变量的循环解决方案。那么id中观察的假人呢?这些不是数字,我看不出如何适应forval y=?你不必<代码>表格也涵盖了这种情况和字符串变量。否则,(1)
tablate
在这里提供了简洁的解决方案(2)如果有人感兴趣,也不足为奇地有循环解决方案。但我会在答案中添加一个字符串变量的循环解决方案。你的答案的要点是,通常你根本不需要创建指标。很好,但为了完整起见,我建议你更详细地解释一下。@NickCox-你是对的。所以对于所有的回归,我们只使用这个快捷方式。可以使用#符号进行交互,而不是创建交互变量。示例reg y a b a#b你回答的要点是,通常你根本不需要创建指标。很好,但为了完整起见,我建议你更详细地解释一下。@NickCox-你是对的。所以对于所有的回归,我们只使用这个快捷方式。可以使用#符号进行交互,而不是创建交互变量。你说得对。我只是注意到(例如)有50个州,20年,没有差距,那是一千个傻瓜。这样做是否是一个好主意,与Stata如何做无关。此外,对于编码来说,更重要的是,如果不返回原始值,则很难解释没有标签的组变量。例如,使用年份时,情况并非如此。所以2008年对研究者来说应该是有意义的一年,但18岁的群体并没有直接意义。如果你不打算找所有的傻瓜,那么这就没用了。事实上,有1000个假人你是不会想的。同意,看100个假人是没有意义的。但如果你有个人的观察,你可能仍然希望控制州和年的影响。然后考虑使用AEGG选项“吸收(年份StayeEdUm)”。这将适当地贬低你的数据,给出与你包含所有假人一样的结果。你是对的。我只是注意到(例如)有50个州,20年,没有差距,那是一千个傻瓜。这样做是否是一个好主意,与Stata如何做无关。此外,对于编码来说,更重要的是,很难定义没有标签的组变量