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

Stata中外部do文件中使用的宏,stata,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

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

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"
为了节省空间和避免重复,我创建了一个名为
savest.do
的外部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

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

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 

您还可以向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 

这更适合StackOverflow或Statalist,因为这里没有统计内容。这纯粹是编程(但有一个很好的可复制的例子)。谢谢。是的,我总是被这样一个问题困扰着:我应该把我的问题贴在哪里:-)!这更适合StackOverflow或Statalist,因为这里没有统计内容。这纯粹是编程(但有一个很好的可复制的例子)。谢谢。是的,我总是被这样一个问题困扰着:我应该把我的问题贴在哪里:-)!谢谢你,尼克。很高兴知道,但Dimitry的解决方案在使用更多估计数和保存更多估计数时更简单。事实上,但这不是你所要求的。我提到我的问题比插图更一般,但是的,我应该补充说我想使用更多估计数。不管怎么说,你的回答很有启发性,而且投票率很高。也谢谢你编辑我的问题。@emeryville很高兴这个问题解决得令你满意。谢谢Nick。很高兴知道,但Dimitry的解决方案在使用更多估计数和保存更多估计数时更简单。事实上,但这不是你所要求的。我提到我的问题比插图更一般,但是的,我应该补充说我想使用更多估计数。不管怎么说,你的回答很有启发性,而且投票率很高。还感谢您编辑我的问题。@emeryville很高兴线程得到了满意的解决。