STATA foreach循环奇怪的行为

时间:2009-10-24 00:16:19

标签: loops economics

我从以下循环得到奇怪的行为(它只生成缺失值) -

  

varach name的前身x {egen   totalcap x'=total(cap) if unit!=0 & name==" x'“,(年)}

但如果我只是做

  

egen totalcapSOMENAME =总(上限)if   unit!= 0& name ==“SOMENAME”,(年)

然后计算它应该计算的数字。

这是一个面板数据集,单位表示特定发电机组的动力装置内的数字(编号为0的单位是工厂级观测值)。 cap变量是已安装的容量。名称变量标识工厂。解释为什么我需要这个循环很复杂,但问题显然与STATA解释foreach的方式有关。

2 个答案:

答案 0 :(得分:1)

你在这里遇到了几个问题。最重要的是,您的第一个循环是在整个循环中评估单词“name”代替“x”。所以它运行你的-egen-命令:

foreach x of varlist name {
     egen totalcapname = total(cap) if unit!=0 and name=="name", by(year)
}

我怀疑这是你真正想要的 - 我想你希望它通过你的“name”变量中的每个项目(观察)进行评估,因为你使用了if语句name ==“x'". So, you need to either get rid of the double quotes around the " x'”在-if-语句中或设置一个本地宏并设置egen循环以评估“name”变量中的每个项目。

我在你的代码中看到的第二个错误是你错过了循环中“x”的前向或左引号 - 它应该是“`x”,而不是“x”。

以下是我想要运行的一个示例。为了便于说明,我使用Stata内置的“auto.dta”数据集来运行你的循环和放大器。 standalone -egen- statement ...请注意我将auto.dta中的变量重命名为变量名称:

***********
clear
sysuse auto


**
//this section renames the auto.dta variables to the name of your variables//

gen year = [_n]
rename mpg cap
rename price unit
rename make name
**NOTE:  your "SOMENAME" will be "Subaru" in this example!**
**

//here's the loop you should be running//

foreach x of varlist name {
 egen totalcap`x'=total(cap) if unit!=0 & name==`x', by(year) 
 }

//without the loop//

egen totalcapSOMENAME=total(cap) if unit!=0 & name=="Subaru", by(year)

//Display the results//

li name unit cap totalcap* if !missing(totalcapSOMENAME)
***********

尝试在Stata do-file中运行此示例。此外,当您遇到这些问题时(循环创建的结果与独立命令不同),请始终尝试键入-set trace-以便您可以看到Stata如何评估循环。

答案 1 :(得分:1)

尽管上面的答案已被接受(大约11年前),但这个问题存在一个误解,该误解比@ eric.a.booth的有用答案更常见,而且应该更加强调。

误解是

foreach x of varlist name 

某种程度上自动地在变量name的不同值(有人说“唯一”,但在我看来不是一个好术语)上循环。其他软件可能会为您做到这一点,但这绝对不是Stata对foreach的承诺。这是一个精确的循环,即提供的 varlist 中的单个变量名称。因此,您只需在循环中键入语句就太过分了,但是Stata自然不会禁止仅使用一个名称或在foreach中使用这样的 varlist

在这种情况下,

egen totalcap = total(cap) if unit!=0, by(name year) 

会将所有感兴趣的总数放在一个变量中,如果您希望将其放入多个变量中,则可以使用separate来实现,而无需循环(或更准确地说,separate使用一个循环,但它在代码内)。