D5. egen 系列函数

整理: 陈贤孟 (厦门大学)
邮箱:

1. egen 命令简介

egen(Extention to generate) 是 gen 的扩展,提供了大量生成新变量的函数,其中主要有生成变量的统计量(均值、标准差、中位数等)、对变量进行编码、对变量进行标准化等。在研究工作的开展过程中,灵活使用 egen 提供的函数有助于我们提高工作效率。

egen 的语法结构如下:

egen [type] newvar = fcn(arguments) [if] [in] [, options]

1.1 简单例子

下面我们通过调用 Stata 中的 “nlsw88.dta” 数据,演示如何使用 egen 命令生成行业工资水平中位数、行业工资水平标准差和根据行业类别与职业对数据进行重新编码。

sysuse "nlsw88.dta", clear //调用数据
sort industry wage //根据行业和工资水平进行排序

*-计算行业工资水平中位数   
bysort industry: egen wage_p50 = median(wage) //计算行业工资水平中位数
gen wage_diff = wage-wage_p50 //计算个体工资水平与其所在行业中位数的差异

*-计算行业工资水平标准差     
bysort industry: egen wage_sd = sd(wage) //运用 egen 命令的 sd 函数计算标准差

*-根据个体所属行业和职业类别,对样本进行重新编码
  
sort industry occupation //根据行业和职业类别进行排序
egen indocc123 = group(industry occupation) //运用 group 函数对样本进行重新编码

更多关于 egen 命令提供的函数,可以通过查看 Stata 提供的帮助文档进行了解

help egen // 查看官方命令提供的函数

2. egen 函数应用范例

在国际贸易领域的研究中,企业会将产品出口到不同的国家,在计算企业面临的实际汇率时,往往不是对各国汇率进行简单地算数平均,常见的计算方法为以企业的出口额为权重,计算企业几何加权实际汇率,具体公式如下所示:

\[EER=\prod_{i=1}^{n}(X_i^{W_i})\]

\[EER=X_1^{W_1} \times X_2^{W_2} ... \times X_n^{W_n}\]

其中, \(X=\text{exchange}\)\(W=\text{weight}\)\(\sum_{i=1}^{n}W_i=1\)

下面结合实际例子,说明如何运用 egen 命令完成企业几何加权实际汇率的计算。

clear //清空内存
* firm: 企业编号 country: 出口目的国
* exch: 汇率    export: 出口额

//输入数据
input firm   country  exch    export 
      1      1         8      60 
      1      2         0.03   50 
      1      3        10      80 
      2      2         0.03   68 
      2      4         3      80 
      3      2         0.03   200 
      3      3        10      90 
      3      4         3      250 
      3      5         1.1    120
end

*-计算权重
bysort firm: egen weight = pc(export), prop //计算每家公司出口到各个国家的权重
list, sepby(firm) //分公司列举计算结果
     +-------------------------------------------+
     | firm   country   exch   export     weight |
     |-------------------------------------------|
  1. |    1         1      8       60   .3157895 |
  2. |    1         2    .03       50   .2631579 |
  3. |    1         3     10       80   .4210526 |
     |-------------------------------------------|
  4. |    2         2    .03       68   .4594595 |
  5. |    2         4      3       80   .5405405 |
     |-------------------------------------------|
  6. |    3         2    .03      200   .3030303 |
  7. |    3         3     10       90   .1363636 |
  8. |    3         4      3      250   .3787879 |
  9. |    3         5    1.1      120   .1818182 |
     +-------------------------------------------+

*-计算 EER,由于几何加权实际汇率是连乘的形式,取对数可以方便计算
gen lnexch = ln(exch) //取对数处理
gen lnexch_x_weight = lnexch*weight 
bysort firm: egen sum_exch = total(lnexch_x_weight) //将连乘转为连加的形式
gen EER = exp(sum_exch) //将上述计算结果取指数,得到 EER

*-查验结果
list firm-weight EER, sepby(firm) //查验计算结果
     +------------------------------------------------------+
     | firm   country   exch   export     weight        EER |
     |------------------------------------------------------|
  1. |    1         1      8       60   .3157895   2.020605 |
  2. |    1         2    .03       50   .2631579   2.020605 |
  3. |    1         3     10       80   .4210526   2.020605 |
     |------------------------------------------------------|
  4. |    2         2    .03       68   .4594595   .3615783 |
  5. |    2         4      3       80   .5405405   .3615783 |
     |------------------------------------------------------|
  6. |    3         2    .03      200   .3030303   .7296909 |
  7. |    3         3     10       90   .1363636   .7296909 |
  8. |    3         4      3      250   .3787879   .7296909 |
  9. |    3         5    1.1      120   .1818182   .7296909 |
     +------------------------------------------------------+

3. egen 命令的扩展

为了满足研究工作的需要,Stata 用户对 egen 函数进行了一定的扩展,其中主要有 egen_inequal (生成不平等和贫困指数的函数)、 egenmmed (生成移动中位数) 、 egenmoreereplace 等,这里我们重点介绍一下 egenmoreereplace

3.1 egenmore 简介

egenmoreegen 一个十分重要的扩展,为我们在文字处理、时间序列数据的处理等方面提供了便利,此处主要对 egenmore 提供的部分文字处理函数进行介绍。

*-ntos() 函数: number to string
sysuse auto, clear
*将 rep78 中的 1 到 5 依次转换为"优秀""差",并将结果保存在变量 grade 中
egen grade = ntos(rep78), from(1/5) to ("优秀" "好" "较好" "较差" "差")
list rep78 grade in 1/5
     +---------------+
     | rep78   grade |
     |---------------|
  1. |     3    较好 |
  2. |     3    较好 |
  3. |     .         |
  4. |     3    较好 |
  5. |     4    较差 |
     +---------------+
*-ston() 函数的用法与之类似

*-incss() 函数:在查询一些重要的关键词时可以发挥一定作用

use bank_number.dta, clear //调用一份包含银行和非银行金融机构的数据

*运用 incss 函数对银行机构进行标记,若字符串中包含“银行”二字,标记为1

egen isbank = incss(objbank), substr("银行") 
drop if isbank==0 //删除非银行金融机构

3.2 ereplace 简介

ereplae 是在 egenegenmore 的基础上进行了扩展,ereplace 允许用户运用 egenegenmore 中的函数对已有变量进行替换,即将函数的运算结果存储在已有变量中。

ereplace 的语法结构如下:

ereplace [type] varname = fcn(arguments) [if exp] [in range] [, options]

简单示例

sysuse auto, clear
ereplace price=std(price) //将价格替换为标准化后的价格
ereplace make= sieve(make), omit(" ") //调用 egenmore 中的 sieve 函数,此处的作用为删去 make 变量中的空格

4. 总结

egen 命令的功能十分强大,提供了各类生成新变量的函数, egenmoreereplace 等的出现,进一步强化了egen 的功能,熟悉egen 提供的各种函数,将大大提升数据处理工作的效率。

5. 扩展阅读