1

将来のリグレッションに使用するために、データセットのサブセット用にローカル マクロを作成したいと考えています (「ループ外でのマクロの使用」セクションを参照)。

次の行に沿ったコードから始めました。

quietly reg y x1 x2 x3
local subset if e(sample)
list Unit `subset'
reg y x1 x2 if `subset'

x3には欠損値があるため、最初のコマンドで一部の観測が除外されregます。コマンドからの出力listは、マクロの内容が実際に必要なものであることを示しています (Unitは観測を識別する変数です)。

それにもかかわらず、最後のコマンドの後にエラー メッセージが表示されます。

if not found
r(111);

の情報からr(111)

__________ 見つかりません;
変数が定義されていません。
変数が存在しません。変数の名前を間違って入力した可能性があります。

構文の何が問題になっていますか? つまり、なぜ Stataifは変数として扱われるのでしょうか?

4

2 に答える 2

5

当面の問題は、 double があることですif。ローカル マクロ `subset' には文字列 "if e(sample)" が含まれているため、Stata が行を解釈しているとき:

reg y x1 x2 if `subset'

それは読みます:

reg y x1 x2 if if e(sample)

より重要な問題は、この方法は非常に壊れやすいということです。これは、 の内容がe(sample)すべての推定コマンドによって上書きされるためです。おそらく、次のようなことを行う方が安全です。

quietly reg y x1 x2 x3
gen byte touse = e(sample)
reg y x1 x2 if touse

これにより、将来の推定コマンドによって上書きされない変数が作成されます。この変数には、その観測を使用する場合は 1 (名前の由来) が含まれ、その観測を使用しない場合は 0 が含まれます。1 は「真」として扱われ、0 は「偽」として扱われるため、ステートメントif touseは使用する観測を選択します。

于 2014-04-17T15:56:04.410 に答える
5

定義を考えると、テキストifはマクロ コンテンツの一部です。

quietly reg y x1 x2 x3
local subset if e(sample)
list Unit `subset'
reg y x1 x2 if `subset'

したがって、listコマンドは次のように解釈されるため機能します

list Unit if e(sample) 

しかし、regressコマンドは次のように解釈されるため、機能していません

regress y x1 x2 if if e(sample) 

そしてStataは2番目に頭がおかしくなりましたif

それは比較的小さな取引です。より大きな問題は、テキストif e(sample)をローカル マクロに入れ、入力するsubset文字数を節約することだけです。次の推定コマンドが来て、推定サンプルが異なる可能性があるため、ローカルマクロは同じ意味を持たないため、これは脆弱です。推定サンプルを安全に追跡するためのより良い方法があります。これは、モデル推定の直後にインジケーターを作成することです。

gen byte regsample = e(sample) 

次に、if regsample正確に同じサブセットを選択することが保証されます (すべて使用された場合は常にすべての観測を含む)。

于 2014-04-17T15:59:10.913 に答える