在 Stata 中生成假人
Generating dummies in 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
...
请注意,您的所有假人都将创建为 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
这就是所有的傻瓜(有些人更喜欢说"indicators")一口气通过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
是可有可无的,除非记忆力很差,但无论如何都是很好的练习。
如果有人决定编写一个循环来为字符串变量的不同值创建指标,那也可以做到。这里有两种可能性。在原始 post 中缺少一个易于重现的示例,让我们创建一个沙箱。第一种方法是先 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:
使用i.<dummy_variable_name>
例如,在您的情况下,您可以使用以下命令进行回归:
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
我在 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
...
请注意,您的所有假人都将创建为 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
这就是所有的傻瓜(有些人更喜欢说"indicators")一口气通过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
是可有可无的,除非记忆力很差,但无论如何都是很好的练习。
如果有人决定编写一个循环来为字符串变量的不同值创建指标,那也可以做到。这里有两种可能性。在原始 post 中缺少一个易于重现的示例,让我们创建一个沙箱。第一种方法是先 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:
使用i.<dummy_variable_name>
例如,在您的情况下,您可以使用以下命令进行回归:
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