我想要运行一系列回归,在每个回归中,我决定是否需要协变。例如,假设我有一个具有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
提供了在本地宏的字上循环的直接路由。
一个简单而老套的评论是,为你想要的十个回归写下十个语句,会让代码更容易写,更容易读。。。。