在Stata中使用for循环(foreach)计算年份虚拟变量

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)

我将继续尝试自己解决这个问题,但是如果有人提出建议,我将不胜感激。

Nic*_*Cox 5

让我们逐行看一下。

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此处的关键字很短,varlistvar您刚定义的本地宏名称完全没有任何关系。变量列表由单个变量名组成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被其内容(变量名)替换yearyear==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)

这更接近您想要的内容,但是使您的代码中的另一个错误更加清晰。这将创建变量d1996d2012但在指定的年份中每个变量将为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内有一个教程,该教程汇集了有关本地宏foreachforvalues循环的注释

 search foreach 
Run Code Online (Sandbox Code Playgroud)

Stata内部的读者会指出,这是您可以阅读的各种文章之一。