質問

次のループから奇妙な動作が発生します(欠損値のみが生成されます)。

VARLIST名{Egen TotalCapのxx'=total(cap) if unit!=0 & name=="x'"、(年)まで }

でも、もし私がただそうするとしたら

EGEN TOTALCAPSOMENAME = TOTAL(CAP)if unit!= 0&name == "Somename"、by(year)

次に、計算すべき数値を計算します。

これはパネル データセットで、ユニットは特定の発電機ユニットの発電所内の番号を示します (番号 0 のユニットはプラント レベルの観測値です)。変数の上限は設置容量です。name 変数は植物を識別します。なぜこのループが必要なのかを説明するのは複雑ですが、問題は明らかに STATA が foreach を解釈する方法にあります。

役に立ちましたか?

解決

ここにはいくつかの問題があります。最も重要なのは、最初のループではループ全体で「x」の代わりに「name」という単語を評価していることです。したがって、 -egen- コマンドを次のように実行します。

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

これがあなたが本当に望んでいることであるとは思えませんが、if ステートメント name== を使用したため、「name」変数の各項目 (観察) によって評価したいと思います。x'". So, you need to either get rid of the double quotes around the "-if- ステートメントに x'" を追加するか、ローカル マクロを設定し、"name" 変数の各項目を評価するように egen ループを設定します。

コードに見られる 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 ファイルで実行してみてください。また、この種の問題 (ループがスタンドアロン コマンドとは異なる結果を生成する場合) が発生した場合は、Stata がループをどのように評価しているかを確認できるように、常に -set trace on- と入力してみてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top