Stata 中外部 do 文件中使用的宏

Macro used in an external do-file in Stata

我的问题出现在更一般的设置中,但可以用这个例子来说明:下面几行创建了两个新变量,使用两个不同的估计器保存回归量的估计

sysuse auto, clear 
reg price mpg, r
local m "reg"
gen bmpg_`m' = _b[mpg]
label var bmpg_`m' "`m' estimate"

areg price mpg, absorb(foreign) r
local  m "areg"
gen bmpg_`m' = _b[mpg]
label var bmpg_`m' "`m' estimate"

为了保存 space 并避免重复,我创建了一个名为 savest.do 的外部执行文件,其中存储了以下重复的两行:

gen bmpg_`m' = _b[mpg]
label var bmpg_`m' "`m' estimate"

所以,我得到一个较短的程序:

sysuse auto, clear 
reg price mpg, r
local m "reg"
do savest

areg price mpg, absorb(foreign) r
local  m "areg"
do savest

但是,这个较短的程序失败了,因为它没有考虑在不同的外部 do 文件中定义的宏 m。我使用 global 而不是 local 但没有成功。

解决方案是编写一个将名称作为参数的小程序:

capture program drop savest
program define savest
syntax namelist(min=1 max=1)
    gen bmpg_`namelist' = _b[mpg]
    label var bmpg_`namelist' "`namelist' estimate"
end 

sysuse auto, clear 
reg price mpg, r
savest reg

areg price mpg, absorb(foreign) r
savest areg

您还可以将参数传递给 do 文件:

* savest_1.do 
args m 
gen bmpg_`m' = _b[mpg]
label var bmpg_`m' "`m' estimate"

* savest_2.do 
local m `1' 
gen bmpg_`m' = _b[mpg]
label var bmpg_`m' "`m' estimate"

reg price mpg, r
do savest_1 reg