P2. 暂元
整理人:秦利宾 (厦门大学)
邮箱:qlb150@163.com
1 引言
「暂元」顾名思义就是暂时性的存储单元。在 Stata 里面又分成「局域暂元」和「全局暂元」,并分别通过 local
和 global
来定义。实际上,暂元是用来临时存储复杂计算的中间结果,一旦命令执行完,暂元中的数字或文字便会自动消失,故不占用硬盘空间。
关于暂元的详细介绍,可以通过 help local
或 help 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 = 5
和 display `a'
, 则不会有结果输出。这是因为运行 local a = 5
时,结果会存储在一个临时文件,而当文件关闭时,暂元被释放。因此,只有在一个临时文件中运行,即同时选中 local a = 5
和 display `a'
两条命令并运行,才会输出暂元内容。
此时,若同时再运行 local b = `a' + 7
和 dis `b'
,显示结果会为 7,而不是 12。这主要是因为存放暂元 a 的临时性文件已经关闭,一个新的临时性文件已经打开。若要输出结果 12,那么 local a = 5
、dis `a'
、local b = `a' + 7
和 dis `b'
这四条命令需要同时运行。
当然,若要是在「命令窗口」输入 local a = 5
,那么暂元 a 会一直存在,直到 Stata 关闭。
存放变量名称
接下来介绍一下暂元存放文字。首先调入一份汽车价格资料 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
命令。
很显然,若同时运行前五行,则会输出第二个 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为其他人种。
然后,通过 _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] //标准误
"wage = `b0' + `b1'*hours + `b2'*2.race + `b3'*3.race" //估计方程
dis gen wage_fit = `b0' + `b1'*hours + `b2'*2.race + `b3'*3.race //拟合值
//列出以 wage 开头变量
br wage* "SE(b1) = " `se_b1' //列出标注误 dis
2.2 暂元中的暂元
以上介绍都是单一的暂元,在实际分析中,我们有时还需在「暂元中再包括暂元」。我们以几个例子来说明,local a1 = 2
、local 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''
`a1'
dis "`a2'"
dis `a3'
dis "`a4'" dis
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"
`m' `s', mtitle(`m') nogap s(r2_a N) replace esttab
我们可以点击下图「mytable.csv」方式打开存储的回归结果。
当然,也可以通过在 esttab
命令中去掉文件路径暂元 s,将结果输出在屏幕上。
4 相关阅读
进一步阅读
help extended_fcn //暂元的扩展功能
help return //返回值
help ereturn
help creturn