用于观察子集的本地宏

Tra*_*aci 1 stata stata-macros

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

我开始使用以下代码:

quietly reg y x1 x2 x3
local subset if e(sample)
list Unit `subset'
reg y x1 x2 if `subset'
Run Code Online (Sandbox Code Playgroud)

x3缺少值,因此在第一个reg命令中排除了一些观察值.list命令的输出确实表明宏的内容确实是我想要的(Unit是一个标识观察的变量).

不过,我在最后一个命令后收到一条错误消息:

if not found
r(111);
Run Code Online (Sandbox Code Playgroud)

从以下信息r(111):

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

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

Maa*_*uis 5

你当前的问题是你有一个双倍if.本地宏"子集"包含字符串"if e(sample)",因此当Stata解释该行时:

reg y x1 x2 if `subset'
Run Code Online (Sandbox Code Playgroud)

它写道:

reg y x1 x2 if if e(sample)
Run Code Online (Sandbox Code Playgroud)

更重要的问题是该方法非常脆弱,因为e(sample)每个估计命令都会覆盖内容.做这样的事情可能更安全:

quietly reg y x1 x2 x3
gen byte touse = e(sample)
reg y x1 x2 if touse
Run Code Online (Sandbox Code Playgroud)

这将创建一个变量,该变量不会被未来的估计命令覆盖,当您想要使用该观察值(因此名称)时,该变量包含1,而当您不想使用该观察值时,该变量包含0.由于1s被视为"true"而0被视为"false",因此该语句if touse选择您要使用的观察值.


Nic*_*Cox 5

根据您的定义,文本if是宏内容的一部分.

quietly reg y x1 x2 x3
local subset if e(sample)
list Unit `subset'
reg y x1 x2 if `subset'
Run Code Online (Sandbox Code Playgroud)

所以该list命令有效,因为它被解释为

list Unit if e(sample) 
Run Code Online (Sandbox Code Playgroud)

但该regress命令无效,因为它被解释为

regress y x1 x2 if if e(sample) 
Run Code Online (Sandbox Code Playgroud)

第二天,斯塔塔对它的想法感到困惑if.

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

gen byte regsample = e(sample) 
Run Code Online (Sandbox Code Playgroud)

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