Stata 观测子集的局部宏

Stata 观测子集的局部宏,stata,stata-macros,Stata,Stata Macros,我想为我的数据集的一个子集创建一个本地宏,用于将来的回归(参见第节) 我从以下代码开始: 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);

我想为我的数据集的一个子集创建一个本地宏,用于将来的回归(参见第节)

我从以下代码开始:

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
视为一个变量?

您当前的问题是您有一个双
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。由于1s被视为“真”,0s被视为“假”,因此if-tuse语句选择您想要使用的观察值。

您当前的问题是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。由于1s被视为“真”,0s被视为“假”,因此语句
if-tuse
选择您要使用的观察值。

根据您的定义,文本
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 y x1 x2 if if e(sample) 
但是
回归
命令不起作用,因为它被解释为

list Unit if e(sample) 
regress y x1 x2 if if e(sample) 
斯塔塔被第二个
if
弄糊涂了

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

gen byte regsample = e(sample) 

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

根据您的定义,如果
是宏内容的一部分,则文本为

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 y x1 x2 if if e(sample) 
但是
回归
命令不起作用,因为它被解释为

list Unit if e(sample) 
regress y x1 x2 if if e(sample) 
斯塔塔被第二个
if
弄糊涂了

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

gen byte regsample = e(sample) 
然后
如果regsample
保证选择完全相同的子集(包括所有使用的观察值)