在 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
提供了循环访问本地宏的直接途径。
一个简单但陈词滥调的评论是,为您确实想要的十个回归写下十个语句将使代码更容易编写和阅读....
我想要 运行 进行一系列回归,在每个回归中,我决定是否需要协变量。例如,假设我有一个包含 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
提供了循环访问本地宏的直接途径。
一个简单但陈词滥调的评论是,为您确实想要的十个回归写下十个语句将使代码更容易编写和阅读....