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

我有下面的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返回该错误的原因,还有其他想法吗?

您错误地引用了宏

...
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来避免。这是一个品味或风格的问题


很好的解释。是的,我指的是地形(vbl标签实际上是“地形序列”,我没有清楚地思考“地形”是什么缩写)。
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'
}