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

  

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

但如果我只是做

  

egen totalcapSOMENAME =总(上限)if   unit!= 0& name ==" SOMENAME",by(year)

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

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

有帮助吗?

解决方案

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

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

我怀疑这是你真正想要的 - 我想你希望它通过你的“名字”中的每个项目(观察)进行评估。变量,因为你使用了if语句name ==" x'"。所以,你需要摆脱“ x”"周围的双引号。在你的-if语句中或者设置一个本地宏并设置egen循环以评估你的“名称”中的每个项目。变量。

我在你的代码中看到的第二个错误是你错过了“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如何评估循环。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top