1

我有以下Stata代码。请注意,这是yvarxvarlowess上的局部加权回归,是内核平滑的一种形式。

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为什么返回该错误的任何其他想法?

4

3 回答 3

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 放在一个全局变量中,然后立即将它们取出。这没有什么害处,但可以通过直接使用 varlist 来避免。这是品味或风格的问题。

于 2013-10-21T07:33:46.743 回答
0

您错误地引用了您的宏。

...
foreach var of varlist $controls2 {
...

将宏指定为:

global controls2 "soiltype_* topo_* vy_*"
于 2013-10-20T23:06:28.663 回答
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'
}

注意:尝试使用 local ; 通常不推荐使用 global

于 2013-10-20T23:08:21.583 回答