2013-02-08 72 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