2013-02-08 76 views
1

为什么此代码在Stata中不起作用?它给我的错误是:使用*指定Stata循环中的变量不起作用

* invalid name

然而,当我用,而不是

sexd1 sexd2 

sexd*   

它工作正常。当我在Stata的命令框中输入命令时,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' 
    } 
} 
+0

*被解析为一个穷人的逐项列表foreach相当详细的教程 – StasK 2013-02-08 15:12:47

回答

3

foreach ... inforeach ... of之间的一个重要区别。 foreach ... in指示Stata逐字地提取列表中的元素,因此没有解释。

所以Stata的解释

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

作为

(步骤1)

foreach j in sexd* { 

(步骤2)

generate `i'_sexd* = `i' * sexd* 

还将取代的当前值本地宏i,但代码失败,因为*不能成为变量名称的一部分。

相反,虽然您使用foreach ... in是完全合法的,但它可以被压缩。我会重写你的代码为

tabulate sex, gen(sexd) 
foreach i in weight midpoint_hhinc { 
    foreach j of var sexd* { 
     generate `i'_`j' = `i' * `j' 
    } 
} 

这部分是风格问题。您只有一个语法错误,但请注意,如果可以直接引用这些名称,将名称放入本地宏中没有任何好处。

说了这么多,这看起来像生成交互变量的代码,而大多数Stata建模命令允许您在运行中引用交互。

有一个在http://www.stata-journal.com/sjpdf.html?articlenum=pr0005