ここにはいくつかの問題があります。最も重要なことは、最初のループがループ全体の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 がループをどのように評価しているかを確認できるように、常に入力してみてください。