Stata &引用;“指定的变量太多”;使用全局宏时出错
我有下面的Stata代码。请注意,Stata &引用;“指定的变量太多”;使用全局宏时出错,stata,Stata,我有下面的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 contr
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返回该错误的原因,还有其他想法吗?您错误地引用了宏
...
foreach var of varlist $controls2 {
...
将宏指定为:
global controls2 "soiltype_* topo_* vy_*"
以下是有效的方法:
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'
}
以您为例(未经测试)
注意:尝试使用本地语言;通常不推荐使用global前面的两个答案都给出了很好的建议,但都没有充分解释问题所在 首先,我建议的代码(顺便说一句,“拓扑学”在这里可能是“拓扑学”的同义词): 下面是一个解释:
- 将
放入全局宏中,然后将soiltype_*topo_*vy_*vy
引用到该全局宏中,即foreach
一个正好包含三项的列表soiltype_*topo_*vy
尝试将每个项依次传递给foreach
,但第一次传递失败,因为lowess
将不接受lowess
作为语法,因此会显示错误消息。(还要注意,lowess soiltype*lnha
也不能作为yhat_soiltype*
的参数)gen()
- 使用局部宏而不是全局宏会造成完全相同的问题,这不是解决方案。使用局部宏而不是全局宏的参数与这一点无关
- 您需要向
说明变量列表需要扩展,这就是为什么需要foreach
而不是varlist
语法的原因global
- 你把变量列表放在一个全局变量中,然后马上把它们取出来。这没有什么害处,但是可以通过直接使用varlist来避免。这是一个品味或风格的问题
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'
}
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'
}