【问题标题】:foreach loop odd behaviorforeach 循环奇怪的行为
【发布时间】:2009-10-24 00:16:19
【问题描述】:

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

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 的方式。

【问题讨论】:

    标签: loops foreach stata


    【解决方案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'"  
    

    所以,你需要

    • 去掉 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 如何评估您的循环。

    【讨论】:

    • 我忘记强调的一件事(但包含在我提供的代码 sn-p 中)——你不需要循环中 x 周围的双引号,只需单引号......所以它应该是 ==`x' ,而不是 =="x"。
    【解决方案2】:

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

    误解是这样的

    foreach x of varlist name 
    

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

    在这种特殊情况下,

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 1970-01-01
      • 2012-07-11
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      相关资源
      最近更新 更多