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ます。

あなたのコードに表示される 2 番目のエラーは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 に答える