在 Stata 中创建 "placeholder" 个变量

Creating "placeholder" variables in Stata

我想要 运行 进行一系列回归,在每个回归中,我决定是否需要协变量。例如,假设我有一个包含 10 个协变量的本地宏:

local covariates "`N' age `N' sex `N' age2 `N' job job2 `N'"

我想要 10 个回归,每个回归都有一个协变量,并按所列顺序排列。但是,`N' 项是占位符,表示我不想在该回归中使用协变量。所以当 运行 回归时,它看起来像:

forval i=1/10 {
    local cov `: word `i' of `covariates''
    if "`cov'" != "N" {
        reg y x `cov'
    }
    else {
        reg y x
    }
}

其中 y 是结果,x 是每个回归中包含的另一个协变量。

我的问题是 Stata 无法识别 `N' 占位符。更具体地说,似乎 if "`cov'" != "N" 条件过滤掉了占位符变量,使其不进入 reg y x `cov' 步骤,但它们不会进入 else 条件 运行 reg y x。经过一些调试,似乎 Stata 根本没有意识到 covariates 的长度是 10:当我检查宏的长度时,它是 returns 5,当我在宏,它只有 returns 5 个值。由于 Stata 认为宏的长度为 5,因此一旦 forval 循环命中 i=6,它就会中断。因此我只得到 5 个 reg y x `cov' .

形式的回归

那么,是否有一种干净的方法来包含某种占位符,以便 Stata 能够识别宏的长度,从而 运行 所有 10 个回归?

这对我有用:

sysuse auto, clear 

local cov weight price N turn 

foreach v of local cov { 
    if "`v'" == "N" regress mpg i.foreign
    else regress mpg i.foreign `v' 
}

您没有提供完整的可重现示例。但是您的本地宏 cov 包含 10 个词,当且仅当它被定义时,有一个本地宏 N 被定义并且可见,并且包含一个词。

此外,只有当本地宏 N 包含单词 "N" 时,您的代码才能按预期工作。

确实,很难理解为什么要在那里使用局部宏引用。

引用不存在的本地宏并没有违法,但它会被评估为空字符串,其结果可能不是您想要的,就像这里一样。这里“不存在”是指先前在同一程序中定义,do-file 或 do-file 编辑器中的代码块。

请注意,foreach 提供了循环访问本地宏的直接途径。

一个简单但陈词滥调的评论是,为您确实想要的十个回归写下十个语句将使代码更容易编写和阅读....