1

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

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

但如果我只做

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

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

这是一个面板数据集,unit表示特定发电机单元的动力装置内的数字(编号为 0 的单元是工厂级观测值)。cap变量是装机容量。该name变量标识植物。解释为什么我需要这个循环很复杂,但问题显然在于 Stata 解释的方式foreach

4

2 回答 2

2

你这里有几个问题。name最重要的是,您的第一个循环是在x整个循环中评估单词。所以它正在运行你的egen命令:

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

我怀疑这是您真正想要的-我认为您希望它通过name变量中的每个项目(观察)来评估,因为您使用了if条件

name=="`x'"  

所以,你需要

  • if在您的条件下摆脱宏引用周围的双引号

或者

  • 设置一个本地宏并设置egen循环以评估name变量中的每个项目。

我在您的代码中看到的第二个错误是您缺少x循环中的前引号或左引号 - 它应该是

"`x'"`   

不是

"x'"

这是我认为您要运行的示例。出于说明目的,我使用 Stata 内置的“auto.dta”数据集来运行您的循环和独立egen语句...请注意,我将 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 文件中运行此示例。此外,当您遇到此类问题时(循环创建的结果与独立命令不同),请始终尝试输入set trace on ,以便您可以看到 Stata 如何评估您的循环。

于 2009-10-26T02:52:18.353 回答
1

尽管上述答案已被接受(大约 11 年前),但与@eric.a.booth 的有用答案相比,这个问题既常见又值得强调一点。

误解是这样的

foreach x of varlist name 

以某种方式自动循环遍历变量的不同(有人说“唯一”,但在我看来这不是一个好术语)值name。其他软件可能会为您做到这一点,但这绝不是 Stata 承诺的foreach. 那是对一个项目的循环,即提供的varlist中的单个变量名称。因此它是矫枉过正,因为你可以只在循环内键入语句,但 Stata 自然不会禁止只有一个名称的varlist或使用这样的 in foreach

在这种特殊情况下,

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

会将所有感兴趣的总数放在一个变量中,如果您更喜欢将其放入多个变量中,那么可以separate在没有循环的情况下使用(或更准确地说,separate使用循环,但它在代码中)。

于 2020-08-19T10:42:52.687 回答