2014-04-17 17 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会选择要使用的观测值。