1

1996 年から 2012 年までの各年 (包括的) のダミー変数を生成しようとしています。1996 年のダミーは 1996 年の場合は 1 になり、それ以外の場合は 0 になりforeach、時間を短縮するために Stata のコマンドを使用します (少なくとも将来のプロジェクトでは)。 )。現在起こっていることは、1996 年のダミーが生成されているということですが、それ以外は生成されていません。を定義する方法に関係していると思いますが、j必要な結果を達成するためのフォーマットを完全に理解できません。オンラインおよび Stata ヘルプ ファイルを調べましたが、この特定のトピックに関する情報は見つかりませんでした。

これが私がこれまでに持っているものです:

local var year
local j = 1996
foreach j of var year {
    gen d`j' = 1 if year==`j'
    local ++j
}

私は自分でこれを理解しようとし続けますが、誰かが提案を持っているなら、私は大いに感謝します.

4

3 に答える 3

5

これを行ごとに見ていきましょう。

local var year

varcontentでローカル マクロを定義しました"year"。これは合法ですが、このコードではそのローカル マクロを参照していないため、定義は無意味です。

local j = 1996

jcontentでローカル マクロを定義しました"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、その内容である変数名に置き換えられるためですyearyear==yearはすべての観測に対して真です。dyear効果は、観測ごとに 1 である新しい変数です。これは、必要なインジケーターまたはダミー変数ではありません。データセットを注意深く見ると、これyearが 1996 年のダミー変数ではないことがわかります。

local ++j

ローカル マクロを 1 ずつインクリメントしようとしていますが、変数名である文字列 を含むようにjローカル マクロを設定しただけです。ただし、文字列に 1 を追加することはできないため、エラー メッセージは になります。あなたはそのエラーを報告しません。これは驚くべきことです。前のコマンドのコンテキストでは、 への参照を変数 で計算する命令として解釈できるため、これは少し微妙です。変数は当然数値です。ただし、コマンドはすべて文字列操作に関するものであり、数値の解釈がある場合とない場合があります。コマンドは、まず第一に、Stata に追加するように指示することと同等です。j"year"type mismatchgenerateyearyearlocal

"year" + 1 

これにより、型の不一致エラーが発生します。

コードから離れて: ループを検討してください

forval y = 1996/2012 { 
    gen d`y' = 1 if year == `y'
} 

これはあなたが望むものに近いですが、コードの別のバグをより明確にします。これにより変数が作成d1996d2012れますが、指定された年ではそれぞれが 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 つとしてそれを指摘していたでしょう。

于 2014-05-03T00:35:23.250 に答える