我有以下Stata代码。请注意,lowess
是 xvar 上 yvar 的局部加权回归,是一种内核平滑形式。
qui tab vy, gen(vy_) // dummy for village-year (8 total)
qui tab soiltype, gen(soiltype_) //dummy for soil type (3 types)
qui tab topo, gen(topo_) //dummy for topological type (4 types)
global controls2 soiltype_* topo_* vy_*
foreach var of global controls2 {
lowess `var' lnha, nograph gen(yhat_`var')
gen res_`var'=`var'-yhat_`var'
drop yhat_`var'
}
在foreach
循环中,Stata返回错误:指定的变量太多。根据此主题发布的先前问题,我首先想到的是,我在lowess命令中使用var
(即controls2
的元素)中有一个带有空格的变量名称。但我没有(你可以在上面的代码中看到这个全局的所有元素)。为什么Stata会返回错误的其他想法?
答案 0 :(得分:2)
之前的两个答案都提供了很好的建议,但都没有完全解释问题的重点。
首先,我建议的代码(顺便说一句,“拓扑”可能是“地形”的一种选择):
qui tab vy, gen(vy_) // dummy for village-year (8 total)
qui tab soiltype, gen(soiltype_) // dummy for soil type (3 types)
qui tab topo, gen(topo_) // dummy for topological type (4 types)
foreach var of varlist soiltype_* topo_* vy_* {
lowess `var' lnha, nograph gen(yhat_`var')
gen res_`var' = `var' - yhat_`var'
drop yhat_`var'
}
现在解释一下:
将soiltype_* topo_* vy_*
置于全局宏中,然后将foreach
引用到该全局宏,foreach
列出恰好包含三个项目的列表,即soiltype_* topo_* vy_*
。 foreach
尝试依次将每个项目传递给lowess
,但由于lowess
不会接受lowess soiltype* lnha
作为语法,因此第一次失败,因此您的错误消息。 (另请注意,yhat_soiltype*
也不能作为gen()
的参数接受。)
使用本地宏而不是全局宏会产生完全相同的问题,这不是解决方案。使用本地宏而不是全局宏的参数与这一点无关。
您需要向foreach
说明需要扩展变量列表,这就是varlist
而不是global
所需语法的原因。
您只将varlists放在全局中,然后立即将其取出。这没有坏处,但可以通过直接使用varlists来避免。这是品味或风格的问题。
答案 1 :(得分:0)
您指的是您的宏不正确。
...
foreach var of varlist $controls2 {
...
将宏指定为:
可能会有所帮助global controls2 "soiltype_* topo_* vy_*"
答案 2 :(得分:0)
以下是有效的方法:
sysuse auto
qui tab rep78, gen(rep_) // dummy for rep78 (5 total)
qui tab foreign, gen(foreign_) //dummy for foreign (2 types)
local k rep_* foreign_*
foreach var of varlist `k'{
lowess `var' mpg, nograph gen(yhat_`var')
gen res_`var'=`var'-yhat_`var'
drop yhat_`var'
}
对于您的示例(未测试)
qui tab vy, gen(vy_) // dummy for village-year (8 total)
qui tab soiltype, gen(soiltype_) //dummy for soil type (3 types)
qui tab topo, gen(topo_) //dummy for topological type (4 types)
local k vy_* soiltype_* top_*
foreach var of `k'{
lowess `var' lnha, nograph gen(yhat_`var')
gen res_`var'=`var'-yhat_`var'
drop yhat_`var'
}
注意:尝试使用本地;通常不建议使用全球