これを行ごとに見ていきましょう。
local var year
var
contentでローカル マクロを定義しました"year"
。これは合法ですが、このコードではそのローカル マクロを参照していないため、定義は無意味です。
local j = 1996
j
contentでローカル マクロを定義しました"1996"
。これは合法です。
foreach j of var year {
ループを開き、ループ インデックスを に定義しますj
。つまり、ループ内では、ローカル マクロへの参照j
は、指定した引数のリストに基づいて解釈されます。(以前の の定義はj
ループ内では無関係であるため、コードの残りの部分には影響しません。)
... of var year
ここで、ループが変数リスト上にあることを指定します。ここでのキーワードvar
は の略であり、定義varlist
したローカル マクロ名とはまったく関係がないことに注意してください。var
変数リストは、単一の変数名で構成されますyear
。
gen d`j' = 1 if year==`j'
このステートメントは、ループが実行される 1 回だけ、次のように解釈されます。
gen dyear = 1 if year==year
ローカル マクロへの参照はj
、その内容である変数名に置き換えられるためですyear
。year==year
はすべての観測に対して真です。dyear
効果は、観測ごとに 1 である新しい変数です。これは、必要なインジケーターまたはダミー変数ではありません。データセットを注意深く見ると、これyear
が 1996 年のダミー変数ではないことがわかります。
local ++j
ローカル マクロを 1 ずつインクリメントしようとしていますが、変数名である文字列 を含むようにj
ローカル マクロを設定しただけです。ただし、文字列に 1 を追加することはできないため、エラー メッセージは になります。あなたはそのエラーを報告しません。これは驚くべきことです。前のコマンドのコンテキストでは、 への参照を変数 で計算する命令として解釈できるため、これは少し微妙です。変数は当然数値です。ただし、コマンドはすべて文字列操作に関するものであり、数値の解釈がある場合とない場合があります。コマンドは、まず第一に、Stata に追加するように指示することと同等です。j
"year"
type mismatch
generate
year
year
local
"year" + 1
これにより、型の不一致エラーが発生します。
コードから離れて: ループを検討してください
forval y = 1996/2012 {
gen d`y' = 1 if year == `y'
}
これはあなたが望むものに近いですが、コードの別のバグをより明確にします。これにより変数が作成d1996
さd2012
れますが、指定された年ではそれぞれが 1 になりますが、それ以外の場合は失われます。これは、必要なものではありません。ループにさらに行を追加することで修正できます
replace d`y' = 0 if year != `y'
しかし、それを行うためのよりクリーンな方法は、単一行です
gen d`y' = year == `y'
表現
year == `y'
true の場合は 1 として評価され、false の場合は 0 として評価されます。
これはすべて、[U] または [P] で文書化されている標準的な手法です。
ただし、@Roberto Ferrerが指摘したように、経験豊富なStataユーザーはtabulate
、ループなしでダミーを定義するオプションを提供するため、この方法でダミーを定義しません。
foreach
ローカル マクロとforvalues
ループに関するコメントをまとめたチュートリアルは、 http://www.stata-journal.com/sjpdf.html? articlenum=pr0005 にあります。
search foreach
Stata 内で、あなたが読むことができるさまざまな作品の 1 つとしてそれを指摘していたでしょう。