附件:

  • 【附件内容】do文件,随手记PDF (笔记内容)、录屏
  • 【附件下载】链接: https://pan.baidu.com/s/1c-f1D5shjC4-oCy4sKBm8w?pwd=w3p5

本文是教对象Stata系列视频的笔记内容。对应视频与配套代码请见下方链接,笔记内容请见分割线下方。

视频合集

bilibili视频链接

配套代码链接


一、变量管理 (1)

1. 数值型变量——略

2. 字符型变量——略

3. gen 与 replace 的扩展: egen 与 ereplace

3.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) 选项对样本进行分组,在每组内进行运算。

3.1.1 表达式运算函数

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

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

3.1.2 单变量运算函数

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

  "anyvalue"、cut、ends、mode

3.1.3 多变量运算函数

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

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

3.1.4 数列运算函数

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

  fill、"seq"

3.2 函数 function 和 选项 option

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

3.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)
3.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(,)
3.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
3.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
3.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)
3.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 取值和均值偏差的绝对值的均值
3.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的最大值
3.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)
3.2.9 其他——kurt、

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

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

3.2 ereplace 使用

  ereplace 是一个外部命令,首次使用前需要安装,可使用的函数与 egen 相同。

1
ssc install ereplace, replace   // 仅首次使用需要安装

二、IF条件使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
** 大小关系比较
replace select=0 if e11==5 //等于号“==”
replace select=0 if e11!=5 //不等号“!=”,其中感叹号为英文符
replace select=0 if e11>=5 //大于等于号“>=”
replace select=0 if e11<=5 //小于等于号“<=”

** 集合关系运算
replace select=0 if e11==5 | e11==6 //【或】关系:条件为 e11=5 或者 e11=6,select变量取值是 0
replace select=0 if e11==5 & e11==6 //【且】关系:条件为 e11=5 并且 e11=6,jianyan 变量取值是 0
replace select=0 if (e11==5 & e11==6) | e12==5 //先且后或
replace select=0 if e11==5 & (e12==5 | e12==6) //先或后且

** inlist: 保留特定取值的样本
keep if inlist(x,"是","否")
keep if inlist(x,1,0)

** inrange: 保留 x∈[1,10] 的样本
keep if inrange(x,1,10)

** 字符型变量
replace select=0 if city=="上海"
replace select=0 if strmatch(address,"*上海*")

三、变量管理 (2)

1. 变量重命名

1
2
3
4
5
6
** 单个变量:A1 --> X1
rename A1 X1
** 组变量
rename (A1 A2 A3) (X1 X2 X3)
rename Var* V* // 任意字符通配符
rename Var# =new // 单个数字通配符: 0-9之间 --> Var#new

2. 标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
** 查看标签
d // describe 简写
label dir // 查看值标签列表
label list X // 值标签与变量取值对应关系

** 变量标签
label variable select "选择变量"
label var select "选择变量" //上一条命令的简写

** 值标签
// 移除值标签
label drop lblname // 数据层面: 删除 lblname 值标签
label values varlist // 变量层面: 删除 varlist 的值标签
// 添加值标签
label define lblname # "label" # "label" ..., add | modify | replace // 定义值标签
label values varlist lblname // 将 varlist 使用值标签 lblname 进行标记

3. 排序

3.1 样本排序

1
2
3
4
sort fid18           //根据 fid18 排列,默认升序排列
gsort + fid18 //根据 fid18 升序排列
gsort - fid18 //根据 fid18 降序排列
gsort - fid18 - pid //根据

3.2 变量排序

1
2
3
4
5
6
7
** 对Province、pcode、ID三个变量排序
order Province pcode ID //将三个变量按顺序放在数据最前面
order Province pcode ID, first //同上一条命令
order Province pcode ID, last //将三个变量按顺序放在数据最后面

order Province pcode ID, before(name) //将三个变量按顺序放在变量 name 之前
order Province pcode ID, after(name) //将三个变量按顺序放在变量 name 之后

4. 变量删除、保留

1
2
3
4
5
6
7
8
** 少数变量的删除、保留
drop _merge e11 e12 //删除三个变量
keep city ID GDP //保留三个变量

** 变量批量删除、保留
drop new_* NH4A_* //删除以"new_"和"NH4A_"开头的变量
keep new_* NH4A_* //保留以"new_"和"NH4A_"开头的变量
keep NH4A_1-NH4A_10 //按当前变量顺序,保留某一个范围内的变量

  ‍