P2. 暂元

整理人:秦利宾 (厦门大学)
邮箱:qlb150@163.com

1 引言

「暂元」顾名思义就是暂时性的存储单元。在 Stata 里面又分成「局域暂元」和「全局暂元」,并分别通过 localglobal 来定义。实际上,暂元是用来临时存储复杂计算的中间结果,一旦命令执行完,暂元中的数字或文字便会自动消失,故不占用硬盘空间。

关于暂元的详细介绍,可以通过 help localhelp macro 查看电子手册 [P] macro – Macro definition and manipulation

2 局域暂元 (local)

2.1 暂元的基本功能

存放数字

与定义单值 scalar a = 5 类似,暂元也是通过 local a = 5 这种方式定义。然后,需要通过 dis `a' 命令列示暂元 a 内容。暂元的引用格式为键盘 Tab 键上方「反引号」加键盘 Enter 键 左边「单引号」,即 `a' 格式。

若单独运行 local a = 5display `a', 则不会有结果输出。这是因为运行 local a = 5时,结果会存储在一个临时文件,而当文件关闭时,暂元被释放。因此,只有在一个临时文件中运行,即同时选中 local a = 5display `a' 两条命令并运行,才会输出暂元内容。

图1 利用暂元存放数字1

此时,若同时再运行 local b = `a' + 7dis `b',显示结果会为 7,而不是 12。这主要是因为存放暂元 a 的临时性文件已经关闭,一个新的临时性文件已经打开。若要输出结果 12,那么 local a = 5dis `a'local b = `a' + 7dis `b' 这四条命令需要同时运行。

图2 利用暂元存放数字2

当然,若要是在「命令窗口」输入 local a = 5,那么暂元 a 会一直存在,直到 Stata 关闭。

图3 利用暂元存放数字3

存放变量名称

接下来介绍一下暂元存放文字。首先调入一份汽车价格资料 sysuse auto, clear;然后定义暂元 xx 来存放汽车价格资料中四个变量名称 local xx "price weight mpg foreign";再定义同名暂元 xx,在存放原有变量基础上,增加「1978 年汽车维修次数」类别变量,即 local xx price weight mpg foreign i.rep78;最后进行 sum `xx'reg `xx' 操作。具体代码如下:

sysuse auto, clear
local xx "price weight mpg foreign"
local xx "price weight mpg foreign i.rep78"
sum `xx'
reg `xx'

若同时运行上述代码前四行,则会执行第二个 local 定义,第一个被自动覆盖。但是,修改「变量值」只能通过 repalce 命令,而不能两次使用 generate 命令。

图4 利用暂元存放变量

很显然,若同时运行前五行,则会输出第二个 local 定义的变量的描述性统计和回归结果。实际上,在初步的回归分析中,通过定义多个同名暂元,我们可以用命令前加「*」注释的方式筛选最后要分析的暂元对象。如下:

sysuse auto, clear
local xx "price weight mpg foreign"
*local xx "price weight mpg foreign i.rep78"
sum `xx'
reg `xx'

变量的系数估计值

变量系数的估计值也可以存储在暂元中。以「nlsw88」这份数据资料为例,进行简单回归 reg wage hours i.race。其中 i.race 为种族虚拟变量,1 为白人,2 为黑人,3为其他人种。

图5 利用暂元存放系数估计值1

然后,通过 _b[*] 形式引用系数值,如 local b0 = _b[_cons]local b1 = _b[hours],通过 _se[*] 的形式引用标准误,如 local se_b1 = _se[hours]。当然,我们也可以通过调用这些系数值去构造「估计的方程」和「生成拟合值」。具体代码如下:

sysuse nlsw88, clear
reg wage hours i.race
local b0 = _b[_cons]      //常数项估计值
local b1 = _b[hours]      //系数估计值
local b2 = _b[2.race]     //虚拟变量的估计值
local b3 = _b[3.race]
local se_b1 = _se[hours]  //标准误
dis "wage = `b0' + `b1'*hours + `b2'*2.race + `b3'*3.race"    //估计方程
gen wage_fit = `b0' + `b1'*hours + `b2'*2.race + `b3'*3.race  //拟合值
br wage*  //列出以 wage 开头变量  
dis "SE(b1) = " `se_b1'  //列出标注误

图6 利用暂元存放系数估计值2

2.2 暂元中的暂元

以上介绍都是单一的暂元,在实际分析中,我们有时还需在「暂元中再包括暂元」。我们以几个例子来说明,local a1 = 2local a2 "var"local a3 = 2*`a1'local a4 `a`a1'',暂元 a3 为「2 * 2 = 4」,暂元 a4 内容可以分解为 `a[`a1']' 这种形式,[ ] 里面`a1' 为 2,即暂元 a4 内容为暂元 a2 的值「var」。

local a1 = 2
local a2 "var"
local a3 = 2*`a1'
local a4 `a`a1''
    
dis  `a1'
dis "`a2'"  
dis  `a3' 
dis "`a4'"

3 全局暂元 (global)

从功能上来说,「全局暂元」和「局域暂元」类似,并且「局域暂元」使用居多。我们仍以「nlsw88」这份数据为例,以 global 命令定义全局暂元,如 global xx "hours ttl_exp married union",以美元符号 $ 来引用全局暂元,如 $xx。「全局暂元」和「局域暂元」最大的不同是,无论何时定义「全局暂元」,只要 Stata 不关闭,我们都可以调用。

sysuse nlsw88, clear
global xx "hours ttl_exp married union"

reg wage $xx
est store homo
reg wage $xx, robust
est store het
reg wage $xx i.occupation, robust
est store het_occu

local s "using mytable.csv"  //输出 Excel 文档
local m "homo het het_occu"
esttab `m' `s', mtitle(`m') nogap s(r2_a N) replace

我们可以点击下图「mytable.csv」方式打开存储的回归结果。

图7 暂元结果的输出1

当然,也可以通过在 esttab 命令中去掉文件路径暂元 s,将结果输出在屏幕上。

图8 暂元结果的输出2

4 相关阅读

进一步阅读

help extended_fcn  //暂元的扩展功能
help return        //返回值
help ereturn 
help creturn