我想为我的数据集子集创建一个本地宏,以用于将来的回归(请参阅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
视为变量?
答案 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
保证精确选择相同的子集(包括所有观察时的所有观察)。