我从以下循环得到奇怪的行为(它只生成缺失值) -
varach name的前身x {egen totalcap
x'=total(cap) if unit!=0 & name=="
x'“,(年)}
但如果我只是做
egen totalcapSOMENAME =总(上限)if unit!= 0& name ==“SOMENAME”,(年)
然后计算它应该计算的数字。
这是一个面板数据集,单位表示特定发电机组的动力装置内的数字(编号为0的单位是工厂级观测值)。 cap变量是已安装的容量。名称变量标识工厂。解释为什么我需要这个循环很复杂,但问题显然与STATA解释foreach的方式有关。
答案 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
使用一个循环,但它在代码内)。