配套视频、笔记与代码

一、gen 和 replace 用法

1. 基础用法

1
2
3
4
5
6
7
8
9
** 变量生成、数值替换
gen jianyan=. //e.g. 生成一个所有数值都是空缺值“.”的变量
replace jianyan=1 //将 jianyan 变量的所有数值都替换为 1

** 或者可以写作:
gen jianyan=1
** 分组累计求和: 根据pcode分组,对CF_gini累计求和
sort pcode CF_gini
by pcode: gen CF_gini_sum=sum(CF_gini)

2. 常见运算函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
** 四则运算、对数、指数、幂运算
replace X=X+1 // 加法
replace X=X-1 // 减法
replace X=X*3 // 乘法
replace X=X/3 // 除法

replace X=ln(X) // 自然对数
replace X=log10(X) // 以10为底的对数
replace X=log(X) // 同上: 以10为底的对数

replace X=3^X // 指数运算
replace X=exp(X) // 自然指数
replace X=X^2 // 幂运算

** 取整函数
gen inc_ceil=ceil(income) // 大于或等于income取值的最小整数
gen inc_floor=floor(income) // 小于或等于income取值的最大整数
gen inc_int=int(income) // 取整函数: 个位、

gen inc_round=round(income) // 取整函数: 个位
gen inc_round=round(income,.01) // 取整函数: 百分位
gen inc_round=round(income,7) // 取整函数: income取值最接近的7的整数倍

** 余数函数
gen inc_mod=mod(income,2) // 余数函数: income除以2的余数

二、egen 和 ereplace 用法

2.1 基本语法

  egen 可以实现许多无法通过 gen 命令计算的内容,其基本语法如下:

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

  egen 命令中运算函数 fcn 运算对象 arguments 根据使用频率可以分为三类:1. 变量 (varlist);2. 表达式 (expression);3. 数列 (numlist)。

  其中,变量运算可以分为对多个样本进行运算的单变量运算函数 (varname)对多个变量运算的多变量运算函数 (varlist) 。表达式运算函数可以对单个变量进行运算,相当于 $1\times varname$ ,多变量运算函数也大多可以支持单变量运算。

  by(varlist) 选项可以根据 varlist 对样本进行分组,在 egen 命令中,部分运算函数可以使用 by(varlist) 选项对样本进行分组,在每组内进行运算。

2.1.1 表达式运算函数

  表达式运算是对不同样本的某个表达式计算值进行运算。所有表达式运算函数支持 by 选项。

  “count”“iqr”“kurt”“mad”“max”“min”“mean”“sd”“mdev”“median”“pctile”“pc”、rank、skew、std、“total”

2.1.2 单变量运算函数

  单变量运算是对不同样本进行运算,仅有 mode 支持 by 选项。

  “anyvalue”、cut、ends、mode

2.1.3 多变量运算函数

  多变量运算是对不同变量进行运算,都不支持 by 选项。

  “anycount”“anymatch”“concat”、diff、“group”、mtr、rowfirst、rowlast、“rowmax”“rowmin”“rowmean”“rowsd”“rowmiss”“rownonmiss”“rowmedian”“rowpctile”“rowtotal”、tag

2.1.4 数列运算函数

  fill 不支持 by 选项,seq 支持 by 选项。

  fill、“seq”

2.2 函数 function 和 选项 option

  egen 命令的运算函数很多,此处忽略了部分不常用的用法。完整使用方法请参考 egen 的 HELP 文档。

2.2.1 变量值匹配:anycount、anymatch 和 anyvalue

  这三个运算不能与 by 组合使用

  基本语法:

1
2
3
4
5
6
7
8
** anycount: 变量列表varlist取值与整数列numlist取值匹配的变量个数
egen newvar = anycount(varlist), values(integer numlist)

** anymatch: 变量列表varlist取值是否与整数列numlist取值匹配
egen newvar = anymatch(varlist), values(integer numlist)

** anyvalue: 变量varname的取值仅保留与整数列numlist匹配的取值,未匹配的改为缺失值
egen newvar = anyvalue(varname), values(integer numlist)

  示例:

1
2
3
4
5
6
7
8
9
10
** anycount
egen check = anycount(x1 x2 x3 x4), values(1 2 5 8) //固定取值的整数
egen check = anycount(x1 x2 x3 x4), values(1/10) //连续整数
egen check = anycount(x1 x2 x3 x4), values(0(2)10) //固定间隔整数(间隔为2)

** anymatch
egen check = anymatch(x1 x2 x3 x4), values(1/10)

** anymatch
egen check = anymatch(x1), values(1/10)

2.2.2 连接 / 合并变量:concat

  该命令不能与 by 组合使用。按照 varlist 的顺序连接各变量,可以生成以下变量:

  • 按照原样字符型变量;
  • format(%fmt) 选项下使用数字格式转换;
  • decode 选项下解码。

  基本语法:

1
egen strvar = concat(varlist) [, format(%fmt) decode maxlength(#) punct(pchars)]

  maxlength(#) 表示控制最大标签长度

  punct(pchars) 表示变量之间的分隔符号

  示例:

1
2
3
4
5
6
** 按照x1、x3、x2的顺序连接变量
egen strvar = concat(x1 x3 x2)
** 使用空格作为分隔符
egen strvar = concat(x1 x3 x2),punct(" ")
** 使用逗号作为分隔符
egen strvar = concat(x1 x3 x2),punct(,)

2.2.3 记数:count、rownonmiss 和 rowmiss

  count 可以与 by 组合使用,rownonmissrowmiss 不能与 by 组合使用。

  基本语法:

1
2
3
4
5
6
7
8
** count: 表达式exp计算结果不是缺失值的样本数
egen newvar = count(exp)

** rownonmiss: 每个样本的变量列表varlist中非缺失值的变量数
egen newvar = rownonmiss(varlist) [, strok] //varlist中包含字符型变量,则需要使用strok选项

** rowmiss: 每个样本的变量列表varlist中缺失值的变量数
egen newvar = rowmiss(varlist) //rowmiss不能使用strok选项

  示例:

1
2
3
4
5
6
7
8
9
10
** count: 按照diqu分组,计算x1和x2乘积不是缺失值的样本数
egen x3 = count(x1*x2),by(diqu)

** rownonmiss和rowmiss
egen checkmiss = rownonmiss(x1 x2 x3) //非缺失值数量,无字符型变量
egen checkmiss = rowmiss(x1 x2 x3) //缺失值数量
** 简写
egen checkmiss = rowmiss(x*) //所有以"x"开头的变量的缺失情况
** rownonmiss有字符型变量情况
egen checkmiss = rownonmiss(x*), strok

2.2.4 分组 & 求和 & 占比:group、total、rowtotal、pc

  total 可以与 by 组合使用,grouprowtotal 不能与 by 组合使用。

  基础语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
** group: 依据字符型/数值型取值分组,可以是字符型、数值型的组合
egen newvar = group(varlist) [, missing label[(lblname[, replace truncate(#)])]]
/* Note: option用法:
missing: 将缺失值当作一个取值进行分类。若不使用missing选项,变量列表varlist中任意变量的取值是缺失值,生成的newvar就是缺失值。
label[(lblname[, replace truncate(#)])]: 创建值标签。 */

** total: 对多个样本取值进行加总
egen newvar = total(exp) [, missing]
/* missing:
若使用missing选项,当exp(某一组)全部都是缺失值时,该组加总值设置为缺失值;
若不使用missing选项,当exp(某一组)全部都是缺失值时,该组加总值设置为0。 */

** rowtotal: 对多个变量取值进行加总
egen newvar = rowtotal(exp)

** pc: 每个样本的exp取值占exp加总值的比例
egen newvar = pc(exp) [, prop] //prop选项:设置prop,取值范围在0~1之间;不设置prop,取值范围在0~100之间

  示例:

1
2
3
4
5
6
7
8
** group: 根据 county 生成分组变量 CID
egen CID = group(county)

** 以CID为分组依据,对每一组内的样本的收入进行加总
//缺失值设为0: 一组样本 x1 所有取值都是缺失值,则该组的加总值为0
egen x1_total = total(x1), by(diqu)
//忽略缺失值: 一组样本 x1 所有取值都是缺失值,则该组的加总值也是缺失值
egen x1_total = total(x1), by(diqu) missing

2.2.5 中位数 & 分位数与相关运算——median、pctile、mad、iqr、rowmedian、rowpctile

  medianpctilemadiqr 可以与 by 组合使用,rowmedianrowpctile 不能与 by 组合使用。

  基本语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
** median: 中位数
egen newvar = median(exp)

** pctile: 百分位数
egen newvar = pctile(exp) [, p(#)] //p(#)表示百分位数

** mad: exp 取值和中位数偏差的绝对值的中位数
egen newvar = mad(exp)

** iqr: 四分位数差距 —— 75%分位数和25%分位数的差值
egen newvar = iqr(exp)

** rowmedian: 每个样本的变量列表取值的中位数(忽略缺失值)
egen newvar = rowmedian(varlist)

** rowpctile: 每个样本的变量列表取值的百分位数(忽略缺失值)
egen newvar = rowpctile(varlist) [, p(#)] //p(#)表示百分位数

  示例:

1
2
3
4
5
6
7
8
** pctile: 按省分组统计x1的20%分位数
egen x1_p20 = pctile(x1), p(20) by(province)
egen x1_p20 = pctile(x1), p(.2) by(province)

** rowpctile: 20%分位数
egen p20 = pctile(x1 x2 x3 x4 x5 x6 x7 x8 x9 x10), p(20)
egen p20 = pctile(x1 x2 x3 x4 x5 x6 x7 x8 x9 x10), p(.2)
egen p20 = pctile(x1-x10), p(.2)

2.2.6 样本均值、标准差、最值:sd、mean、min、max、mdev

  该 5 个函数都可以与 by 组合使用。

1
2
3
4
5
egen x1_sd = sd(x1)           //x1 的标准差
egen x1_mean = mean(x1) //x1 的有效均值(缺失值不进入平均运算)
egen x1_min = min(x1) //x1 的最小值
egen x1_max = max(x1) //x1 的最大值
egen x1_mdev = mdev(x1) //x1 取值和均值偏差的绝对值的均值

2.2.7 多变量均值、标准差、最值:rowsd、rowmean、rowmin、rowmax

  该 4 个函数都不能与 by 组合使用。

1
2
3
4
egen xx_total = rowtotal(x1 x2 x3)   //x1、x2、x3的加总值
egen xx_mean = rowmean(x1 x2 x3) //x1、x2、x3的有效均值(缺失值不进入平均运算)
egen xx_min = rowmin(x1 x2 x3) //x1、x2、x3的最小值
egen xx_max = rowmax(x1 x2 x3) //x1、x2、x3的最大值

2.2.8 数列——seq

  该运算函数可以与 by 组合使用。

  基础语法:

1
2
3
4
egen newvar = seq() [, from(#) to(#) block(#)]
/* Note: from(#) 表示从 # 开始计数,默认为 1;
to(#) 表示计数到 # 为止;
block(#) 表示每个数字计数的次数。 */

  示例:

1
2
3
4
5
6
7
** 每个数字计数一次,范围1~4,重复计数: 1,2,3,4, | 1,2,3,4, | 1,……
egen list=seq(), to(4)
egen list=seq(), to(4) block(1)
** 每个数字计数两次,范围1~4,重复计数: 1,1,2,2,3,3,4,4, | 1,1,2,2,3,3,4,4, | 1,……
egen list=seq(), to(4) block(2)
** 每个数字计数两次,范围3~4,重复计数: 3,3,4,4, | 3,3,4,4, | 3,……
egen list=seq(), from(3) to(4) block(2)

2.2.9 其他——kurt、

  kurt 命令可以与 by 组合使用。

1
2
** kurt: 表达式exp的峰度
egen x1_kurt = kurt(x1), by(PID) //根据PID分组计算变量x1的峰度

  ‍