使用全局宏时“指定了太多变量”错误

时间:2013-10-20 22:48:04

标签: 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 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会返回错误的其他想法?

3 个答案:

答案 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'
}

注意:尝试使用本地;通常不建议使用全球