1

我想为我的数据集的一个子集创建一个本地宏,以用于未来的回归(请参阅循环外宏的一些用途部分)。

我从以下几行代码开始:

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

x3reg有缺失值,因此在第一个命令中排除了一些观察结果。该list命令的输出确实表明宏的内容确实是我想要的(Unit是一个标识观察的变量)。

尽管如此,我在最后一个命令之后收到一条错误消息:

if not found
r(111);

从以下信息r(111)

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

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

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 对第二个感到困惑if

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

gen byte regsample = e(sample) 

然后if regsample保证选择完全相同的子集(包括所有使用时的所有观察)。

于 2014-04-17T15:59:10.913 回答