Loops 使用*在Stata循环中指定变量无效

Loops 使用*在Stata循环中指定变量无效,loops,stata,Loops,Stata,为什么该代码在Stata中不起作用?它给我的错误是: *无效名称 然而,当我使用 sexd1 sexd2 而不是 sexd* 它很好用sexd*作为本地命令运行良好 代码如下: local list_of_variables weight midpoint_hhinc tabulate sex, gen(sexd) local sexd sexd* foreach i in `list_of_variables'{ foreach j in `sexd'{

为什么该代码在Stata中不起作用?它给我的错误是:

*无效名称

然而,当我使用

sexd1 sexd2 
而不是

sexd*        
它很好用<当我在Stata的命令框中键入命令时,code>sexd*作为本地命令运行良好

代码如下:

local list_of_variables weight midpoint_hhinc
tabulate sex, gen(sexd)
local sexd sexd*

foreach i in `list_of_variables'{
    foreach j in `sexd'{
        generate `i'_`j' = `i' * `j'
    }
}

foreach和foreach之间有一个重要的区别<代码>在和foreach中<代码>的<代码>foreach<中的code>in指示Stata按字面意思获取列表中的元素,因此没有解释

所以斯塔塔解释

 foreach j in `sexd' {
     generate `i'_`j' = `i' * `j'
 }
作为

(步骤1)

(步骤2)

它还将替换本地宏
i
的当前值,但代码失败,因为
*
不能是变量名的一部分

相反,虽然您在使用
foreach
时<代码>在中是完全合法的,可以压缩。我会把你的代码重写为

 tabulate sex, gen(sexd)
 foreach i in weight midpoint_hhinc {
     foreach j of var sexd* {
         generate `i'_`j' = `i' * `j'
     }
 }
这在一定程度上是风格问题。您只有一个语法错误,但请注意,当您可以直接引用本地宏中的名称时,将这些名称放入本地宏中并没有任何好处

总而言之,这看起来像是生成交互变量的代码,而大多数Stata建模命令允许您动态引用交互


关于
foreach
at

*有一个相当详细的教程,它被解析为一个穷人的逐项列表
 generate `i'_sexd* = `i' * sexd*
 tabulate sex, gen(sexd)
 foreach i in weight midpoint_hhinc {
     foreach j of var sexd* {
         generate `i'_`j' = `i' * `j'
     }
 }