【问题标题】:Local macros for subset of observations观察子集的局部宏
【发布时间】:2014-04-17 15:20:01
【问题描述】:

我想为我的数据集的一个子集创建一个本地宏以用于未来的回归(请参阅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当作一个变量?

【问题讨论】:

    标签: stata stata-macros


    【解决方案1】:

    根据您的定义,文本 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 保证选择完全相同的子集(包括所有使用时的所有观察)。

    【讨论】:

      【解决方案2】:

      你的直接问题是你有一个双重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 会选择您要使用的观察结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-23
        • 1970-01-01
        • 2020-11-07
        • 1970-01-01
        • 2012-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多