2014-04-17 16 views
1

我想爲我的數據集的一個子集創建一個本地宏,用於將來的迴歸(Some Uses for Macros Outside of Loops部分)。我已經開始了與代碼,沿線爲這樣:Stata:用於觀察子集的本地宏

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

有缺失值,所以一些意見被排除在第一reg命令。 list命令的輸出確實表明宏的內容確實是我想要的(Unit是標識觀察值的變量)。但是,我收到最後一條命令後的錯誤消息。

if not found 
r(111); 

從上r(111)的信息:

__________ not found; 
no variables defined; 
The variable does not exist. You may have mistyped the variable's name. 

什麼是錯我的語法(即,爲什麼它是治療if作爲一個變量)?

回答

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) 

和塔塔迷惑不解出其介意第二個if

這是一個相對較小的交易。更重要的是,您所做的絕對是將文本if e(sample)放入本地宏subset中,並在輸入時保存自己的幾個字符。這是脆弱的,因爲,來下一個估計命令,可能有一個不同的估計樣本,本地宏將不會有相同的含義。有一種更好的方法來安全地跟蹤估計樣本,該估計樣本是在模型估計之後立即產生一個指標。

gen byte regsample = e(sample) 

然後if regsample是保證精確地選擇同一子集(包括所有觀測時,他們都使用)。

+0

偉大的思想家一樣 –

+0

就像沒有版主看起來這些評論。 –

4

你的直接問題是你有一個雙重if。當地的宏`子集」包含字符串 「如果E(樣本)」,因此,當塔塔被解釋行:

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會選擇要使用的觀測值。