在 Stata 中创建"placeholder"变量



我想要运行一系列回归,在每个回归中,我决定是否需要协变。例如,假设我有一个具有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:当我检查宏的长度时,它返回5,当我打印宏中的每个项时,它只返回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文件编辑器中的同一程序、do文件或代码块中定义的。

注意,foreach提供了在本地宏的字上循环的直接路由。

一个简单而老套的评论是,为你想要的十个回归写下十个语句,会让代码更容易写,更容易读。。。。

最新更新