Mar*_*tin 1 for-loop stata dummy-data
我正在尝试为1996年至2012年(包括当年)的每一年生成一个虚拟变量,以使1996年的虚拟变量如果等于1996,则应等于1;否则,请使用foreachStata中的命令减少时间(至少对于将来的项目而言,等于0))。目前正在发生的事情是,1996年的假人正在生产,但没有其他人生产。我认为这与我的定义方式有关j,但我无法完全弄清楚格式以实现所需的结果。我已经在网上和Stata帮助文件中进行了查找,但找不到关于此特定主题的任何内容。
到目前为止,这是我所拥有的:
local var year
local j = 1996
foreach j of var year {
gen d`j' = 1 if year==`j'
local ++j
}
Run Code Online (Sandbox Code Playgroud)
我将继续尝试自己解决这个问题,但是如果有人提出建议,我将不胜感激。
让我们逐行看一下。
local var year
Run Code Online (Sandbox Code Playgroud)
您var使用content 定义了一个本地宏"year"。这是合法的,但是您永远不会在此代码中引用该本地宏,因此定义毫无意义。
local j = 1996
Run Code Online (Sandbox Code Playgroud)
您j使用content 定义了一个本地宏"1996"。这是合法的。
foreach j of var year {
Run Code Online (Sandbox Code Playgroud)
您打开一个循环并将循环索引定义为j。这意味着在循环中,对本地宏的任何引用j都将根据您提供的参数列表进行解释。(之前的定义j在循环中无关紧要,因此在其余代码中无效。)
... of var year
Run Code Online (Sandbox Code Playgroud)
您可以在此处指定循环在变量列表上。请注意,var此处的关键字很短,varlist与var您刚定义的本地宏名称完全没有任何关系。变量列表由单个变量名组成year。
gen d`j' = 1 if year==`j'
Run Code Online (Sandbox Code Playgroud)
该语句将被解释为循环执行的唯一时间,例如
gen dyear = 1 if year==year
Run Code Online (Sandbox Code Playgroud)
作为对本地宏的引用j被其内容(变量名)替换year。year==year每次观察都是正确的。该效果是一个新变量dyear,每个观察值均为1。那不是您想要的指标或虚拟变量。如果仔细查看数据集,您会发现这不是year1996年的虚拟变量。
local ++j
Run Code Online (Sandbox Code Playgroud)
您试图将本地宏j增加1。但是您只是将本地宏设置j为包含字符串"year",这是一个变量名。但是您不能将1加到字符串中,因此错误消息将是type mismatch。您没有报告该错误,这很令人惊讶。这有点微妙,因为在前面的命令中,上下文generate允许将引用解释year为使用year自然为数值的变量进行计算的指令。但是local命令都是关于字符串操作的,它可能具有或不具有数字解释,并且您的命令首先等效于指示Stata添加
"year" + 1
Run Code Online (Sandbox Code Playgroud)
触发类型不匹配错误。
远离代码:考虑循环
forval y = 1996/2012 {
gen d`y' = 1 if year == `y'
}
Run Code Online (Sandbox Code Playgroud)
这更接近您想要的内容,但是使您的代码中的另一个错误更加清晰。这将创建变量d1996,d2012但在指定的年份中每个变量将为1,但否则会丢失,这不是您想要的。您可以通过在循环中添加另一行来解决此问题
replace d`y' = 0 if year != `y'
Run Code Online (Sandbox Code Playgroud)
但更干净的方法是单行
gen d`y' = year == `y'
Run Code Online (Sandbox Code Playgroud)
表达方式
year == `y'
Run Code Online (Sandbox Code Playgroud)
当您需要时,在true时将评估为1,在false时将评估为0。
所有这些都是[U]或[P]中记录的标准技术。
正如@Roberto Ferrer指出的那样,经验丰富的Stata用户不会以这种方式定义虚拟变量,因为它tabulate提供了无循环执行此操作的选项。
http://www.stata-journal.com/sjpdf.html?articlenum=pr0005内有一个教程,该教程汇集了有关本地宏foreach和forvalues循环的注释。
search foreach
Run Code Online (Sandbox Code Playgroud)
Stata内部的读者会指出,这是您可以阅读的各种文章之一。