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作为变量处理?
你当前的问题是你有一个双倍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选择您要使用的观察值.
根据您的定义,文本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保证精确选择相同的子集(包括所有观察时使用的所有观察结果).
| 归档时间: |
|
| 查看次数: |
639 次 |
| 最近记录: |