用于观察子集的本地宏

时间:2014-04-17 15:20:01

标签: stata stata-macros

我想为我的数据集子集创建一个本地宏,以用于将来的回归(请参阅Some Uses for Macros Outside of Loops部分)。

我开始使用以下几行代码:

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)的信息:

  

__________未找到;
  没有定义变量;
  该变量不存在。您可能输错了变量的名称。

我的语法有什么问题?也就是说,为什么Stata将if视为变量?

2 个答案:

答案 0 :(得分:5)

你当前的问题是你有一个双if。本地宏`子集'包含字符串"如果是e(样本)",那么当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。因为1s被视为" true"和0为" false",语句if touse选择你想要使用的观察结果。

答案 1 :(得分: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让Stata感到困惑。

这是一个相对较小的交易。更重要的是,你所做的绝对就是将文本if e(sample)放入本地宏subset并在键入时节省一些字符。这是脆弱的,因为下一个估计命令,可能有不同的估计样本,本地宏将不具有相同的含义。有一种更好的方法可以安全地跟踪估计样本,即在模型估计之后立即创建一个指标。

gen byte regsample = e(sample) 

然后if regsample保证精确选择相同的子集(包括所有观察时的所有观察)。