附件:

  • 【附件内容】do文件,PDF笔记,录屏
  • 【附件下载】链接:https://pan.baidu.com/s/1OX7X6gwd3E1ErQjvibrbUg?pwd=8zbi

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

视频合集

bilibili视频链接

配套代码链接


一、变量管理 (3) : 数值型与字符型变量转换

  使用 destring 命令可以将字符型变量转化为数值型变量,使用 tostring 命令可以将数值型变量转化为字符型变量。

1. tostring 命令:数值型 --> 字符型

  基础语法:

1
tostring varlist [, options]

  options:

1
2
3
4
/* 常用 Options: 
1) generate(newvarlist): 指定新的字符型变量列表名称,简写gen(newvarlist)或g(newvarlist)
2) replace: 将原变量替换字符型变量
3) force: 强制转换为字符型变量(忽略信息缺失) */

  示例:

1
2
tostring X, g(Y)    // X数值型 --> Y字符型
tostring *,replace // 将所有变量替换为字符型变量

2. destring 命令:字符型 --> 数值型

  基础语法:

1
2
字符型 --> 数值型
destring [varlist] [,options]

  options:

1
2
3
4
5
/* 常用 Options: 
1) generate(newvarlist): 指定新的字符型变量列表名称,简写 gen(newlist) 或g (newlist)
2) replace: 将原变量替换数值型变量
3) ignore("chars"): 指定忽略的文本内容,简写 i("chars")
4) force: 讲字符型变量强制转化为数值型变量 */

  示例:

1
2
3
4
destring X, g(Y)     // X字符型 --> Y数值型
destring X, replace // X字符型 --> X数值型

destring X, i("NA") replace // X字符型 --> X数值型: 忽略「NA」

二、统计分析

1. list 命令:列出变量的取值

  使用 list 命令可以按需求列出变量的取值。list 命令可以简写为 l

  基础语法:

1
list [varlist] [if] [in] [, options]

  image

  options:

1
2
3
4
/* 常用 Options: 
1) mean: 在列表最下方显示均值
2) sum: 在列表最下方显示加总值
3) N: 在列表最下方显示样本量 */

  示例:

1
2
list X if X2==1   // list 配合 IF 条件使用
list X in 1/50, sum mean N // 变量 X 的 1-50 行样本的均值、加总值与样本量

2. summarize 命令:汇报统计量

  使用 summarize 可以汇报变量的常见统计量,可简写作 summsu

  基础语法:

1
summarize [varlist] [if] [in] [weight] [, options]

  opitons:

1
2
/* 常用 Options: 
1) detail: 显示变量的详细统计量,简写为「d」 */

  示例:

1
2
summ X1 X2     // X1 与 X2 的样本数、均值、标准差、最大值、最小值
summ X1 X2, d // 显示详细信息

3. tabulatetabstat 命令

3.1 tabulate 命令

  使用 tabulate 可以查看==某一个数值型/字符型==变量的取值分布与累积百分比情况,简写做 tabta

  基础语法:

1
tabulate varname1 [varname2] [if] [in] [weight] [, options]

  options:

1
2
3
4
/* 常用 Options: 
1) missing: 显示缺失值数量,简写「m」
2) nofreq: 不显示取值分布频率,简写「nof」
3) nolabel: 不显示变量值标签,简写「nol」 */

  示例:

1
2
3
4
tab X      // 查看 X 取值分布
tab X, m // 查看 X 取值分布(包括缺失值)
tab X, nol // 不显示值标签
tab X if select==1 // 带条件

3.2 tabstat 命令

  与 tab 命令相比,使用 tabstat 命令:

  • 可以查看更多统计量
  • 可以查看分组统计量
  • 仅能查看数值型变量的统计量

  基础语法:

1
tabstat varlist [if] [in] [weight] [, options]

  options:

1
2
3
4
5
/* 常用 Options: 
1) by(variable): 通过变量 variable 分组
2) statistics(...): 注明要计算的统计量,简写「stat(...)」或「s(...)」
3) missing: 将 by(variable) 中的分组变量取值为缺失值的视为一组,简写「m」
4)format(%fmt): 设置显示格式,简写「f(%fmt)」 */

  示例:

1
2
3
4
5
** 样本数、均值、最大值、最小值、标准差、极差:根据 Z 变量进行分组,保留两位小数(4f)
tabstat X1 X2, stat(count mean min max sd rang) f(%9.4f) by(Z)
tabstat X1 X2, stat(n mean min max sd r ) f(%9.4f) by(Z) // 同上一行
// 查看分位数:p表示百分位数,q表示四分位数(p25、p50、p75)
tabstat X1 X2, stat(p1 p5 p10 q p90 p95 p99)

三、关于数据结构

  链式数据:严格一对一的对应关系,更常见于多个统计数据库之间

  树形数据:存在一对多的对应关系,呈向下分散状,更常见于统计数据内部与抽样调查数据内部

  网状数据:可以存在多对多的对应关系,例如一个学生可以选择很多门课程,一个老师也可能教很多门课程

  22

四、数据管理 (1): 数据接驳-append

  数据接驳是数据集的纵向扩展,将不同的数据集纵向拼接在一起。

  • 数据匹配使用 append 命令。与 merge 不同,数据接驳 append 命令不需要指定识别变量;
  • 当前使用的数据是 master data,append 命令可以生成一个结果变量注明样本的来源;
  • 在接驳的数据集中,变量名相同的变量的值将保存在同一变量名下。

  基本语法:

1
2
3
append using filename [filename ...] [, options]
/* Note: filename 表示待接驳的外部数据,若不在当前工作路径下,可以使用cd命令变更工作路径,
或者在filename处填写完整的数据存放路径;append命令一次可以接驳多条命令。 */

  所有选项 options:

  append 的选项大多与 merge 命令相同。

1
2
3
4
5
/*Options: 
keep(varlist):仅从其他数据集中接驳varlist变量到master data,简写作"keep(varlist)";
generate(newvar):生成一个新变量标记样本的来源,简写作"gen(newvar)";
nolabel:在接驳完成后,去除using data匹配变量中的值标签,简写作"nol";
force:强制接驳配字符型与数值型变量。 */

  比较常用的 options 是 keepus(varlist)gen(newvar)

  示例:

(⚠️注意:不同设备的显示字体不同,可能会出现字符错位的现象。将错位的文本复制到其他文本编辑器 / Stata do 文件编辑器中,可以解决此问题。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use "data1.dta"
append using "data2.dta"
save "new_data.dta"

/* 接驳数据图示:
new_data
data1 data2 +---------------------+
+---------------+ +----------------+ | id x1 x2 x3 |
| id x1 x3 | | id x1 x2 | |---------------------|
|---------------| |----------------| append | 101 3 . 2 |
| 101 3 2 | | 103 1 3.3 | ----------> | 102 5 . 1.1 |
| 102 5 1.1 | | 104 2 3.0 | | 103 1 3.3 . |
+---------------+ +----------------+ | 104 2 3.0 . |
+---------------------+ */

  ‍

五、数据管理 (2): 数据匹配-merge

  数据匹配是数据数据的横向合并,目的是添加其他数据库中的某几个变量。使用 merge 命令可以实现数据的精确匹配。

  数据匹配是数据集的横向扩展,通过识别某些变量在不同数据集中的对应关系,将其他数据集的一些变量匹配到当前数据中。

  • 数据匹配使用 merge 命令,当前打开的数据称为 master data,待匹配的数据称为 using data;
  • 数据匹配包含 1:1,1:m,m:1,m:m 四种类型;
  • 在匹配完成后,会生成一个显示匹配结果的变量,默认是“_merge”。

  基本语法:

1
2
3
4
merge X:X varlist using filename [, options]
/* Note: X:X 表示匹配类型,可以是1:1,1:m,m:1,m:m;
varlist 表示master data和using data之间匹配的识别变量,根据匹配的类型不同,varlist的要求也不同;
filename 表示using data的名称,若不在当前工作路径下,可以使用cd命令变更工作路径,或者在filename处填写完整的数据存放路径。*/

  所有选项 options:

1
2
3
4
5
6
7
8
9
/*Options: 
keepusing(varlist):仅从using data中匹配varlist变量到master data,简写作"keepus(varlist)";
generate(newvar):定义匹配结果变量名,默认是"_merge",简写作"gen(newvar)";
nogenerate:匹配完成后,不生成匹配结果变量"_merge",简写作"nogen",不能和gen(newvar)选项同时使用;
nolabel:在匹配完成后,去除using data匹配变量中的值标签,简写作"nol";
update:更新同名变量数据,即使用using data中的非缺失值替换master data中同名变量的缺失值;
replace:替换同名变量数据,即使用using data中的非缺失值替换master data中的所有同名变量的值;
noreport:不汇报匹配结果;
force:强制匹配字符型与数值型变量。 */

  merge 命令一般使用 options 较少,比较常用的 options 是 keepus(varlist)gen(newvar)

  匹配结果:

  不论哪种匹配方式,生成的匹配结果变量会有三个固定的取值:

  _merge=1:未匹配成功,该样本的数据仅来自 master data;

  _merge=2:未匹配成功,该样本的数据仅来自 using data;

  _merge=3:匹配成功,该样本的数据同时来自 master data 和 using data;

  因此,可以根据匹配结果变量的取值,筛选出需要的样本:

1
2
3
4
5
6
7
8
** 不删除任何样本,直接删除_merge变量
drop _merge
** 仅保留匹配成功的样本
keep if _merge==3
** 仅保留来自master data相关的样本
drop if _merge==2
** 删除master data中未匹配成功的样本
drop if _merge==1

1. one-to-one merge

  使用 1:1 匹配的条件:用于匹配的 varlist 在 master data 和 using data 中可以唯一识别每一个样本。若某一个变量不能唯一识别每个样本,则要求通过多个变量可以唯一识别两套数据中的每一个样本。

  示例:

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
26
use "master_data.dta"
merge 1:1 id using "using_data.dta"
drop _merge
save "new_data.dta"

** 匹配结果展示
Result Number of obs
-----------------------------------------
Not matched 2
from master 1 (_merge==1)
from using 1 (_merge==2)

Matched 3 (_merge==3)
-----------------------------------------

/* 匹配结果图示:
master_data using_data new_data
+--------------+ +------------+ +---------------------------------------+
| id x1 x2 | | id x3 | | id x1 x2 x3 _merge |
|--------------| |------------| |---------------------------------------|
| 101 1 4.1 | | 101 2 | merge | 101 1 4.1 2 Matched (3) |
| 102 2 4.5 | | 102 1.1 | ---------> | 102 2 4.5 1.1 Matched (3) |
| 103 3 3.3 | | 103 5 | | 103 3 3.3 5 Matched (3) |
| 104 4 3.0 | | 105 7 | | 104 4 3.0 . Master only (1) |
+--------------+ +------------+ | 105 . . 7 Using only (2) |
+---------------------------------------+ */

2. one-to-many merge

  使用 1:m 匹配的条件:用于匹配的 varlist 在 master data 中可以唯一识别每一个样本,且在 using data 中对应多个样本。

  常见使用场景:

  • master data 是家庭数据,using data 是个体数据,一个家庭对应多个个体,使用家庭的编码进行识别;
  • master data 是省级数据,using data 是地级市数据,一个省对应多个地级市,使用省份的编码进行识别。

  示例:

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
26
27
use "master_data.dta"
merge 1:m id using "using_data.dta"
drop _merge
save "new_data.dta"

** 匹配结果展示

Result Number of obs
-----------------------------------------
Not matched 1
from master 1 (_merge==1)
from using 0 (_merge==2)

Matched 4 (_merge==3)
-----------------------------------------

/* 匹配结果图示:
master_data using_data new_data
+--------------+ +------------+ +---------------------------------------+
| id x1 x2 | | id x3 | | id x1 x2 x3 _merge |
|--------------| |------------| |---------------------------------------|
| 101 1 4.1 | | 101 2 | merge | 101 1 4.1 2 Matched (3) |
| 102 2 4.5 | | 102 1.1 | ---------> | 102 2 4.5 1.1 Matched (3) |
| 103 3 3.3 | | 102 2.7 | | 102 2 4.5 2.7 Matched (3) |
| 104 4 3.0 | | 103 5 | | 103 3 3.3 5 Matched (3) |
+--------------+ +------------+ | 104 4 3.0 . Master only (1) |
+---------------------------------------+ */

3. many-to-one merge

  将 1:m 匹配中的 master data 和 using data 的数据特征互换时,就应该使用 m:1 匹配。

  使用 m:1 匹配的条件:用于匹配的 varlist 在 using data 中可以唯一识别每一个样本,且在 master data 中对应多个样本。

  常见使用场景:

  • master data 是个体数据,using data 是家庭数据,多个个体可以同时在一个家庭内,使用家庭的编码进行识别;
  • master data 是地级市数据,using data 是省级数据,多个地级市同属于一个省份,使用省份的编码进行识别。

  示例:

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
26
27
use "master_data.dta"
merge m:1 id using "using_data.dta"
drop _merge
save "new_data.dta"

** 匹配结果展示

Result Number of obs
-----------------------------------------
Not matched 1
from master 1 (_merge==1)
from using 0 (_merge==2)

Matched 4 (_merge==3)
-----------------------------------------

/* 匹配结果图示:
master_data using_data new_data
+--------------+ +------------+ +---------------------------------------+
| id x1 x2 | | id x3 | | id x1 x2 x3 _merge |
|--------------| |------------| |---------------------------------------|
| 101 1 4.1 | | 101 2 | merge | 101 1 4.1 2 Matched (3) |
| 102 2 4.5 | | 102 1.1 | ---------> | 102 2 4.5 1.1 Matched (3) |
| 103 3 3.3 | | 103 5 | | 103 3 3.3 5 Matched (3) |
| 103 9 5.5 | +------------+ | 103 9 5.5 5 Matched (3) |
| 104 4 3.0 | | 104 4 3.0 . Master only (1) |
+--------------+ +---------------------------------------+ */

4. many-to-many merge

  m:m 匹配不建议使用,因为其匹配结果是不确定的!

  在数据匹配时,多数情况使用 1:1、1:m、m:1 已经可以解决问题。此处不再展示 m:m 的用法。

5. 其他数据匹配命令

  joinby :解决 merge 的多对多精确匹配问题

  reclink :模糊匹配

  nearmrg :近似值匹配

  mergemanymergeall:多个文件 (数据库) 匹配

  资料来源:

  Stata:数据合并与匹配-merge-reclink| 连享会主页 (lianxh.cn)

  mergemany -- 一个灵活的命令来合并许多文件 - 简书 (jianshu.com)

  mergeall -- 合并多个文件的安全方法 - 简书 (jianshu.com)

6. 数据匹配中常见问题

  问 1:能否使用多个变量作为匹配的依据?

  答 1:可以,且匹配时应当尽量保证作为匹配依据的变量类型相同:文本对文本,数值对数值

  问 2:遇到多对多匹配怎么办?

  答 2:不建议使用多对多匹配,绝大多数的多对多精确匹配问题可以通过添加匹配变量解决。例如:在面板数据中加入年份,可以解决某一个体多年编码重复的问题。匹配前应当检查数据是否有误,并充分了解数据结构后再匹配,多数多对多匹配的问题往往来自数据的错误与对数据结构的不了解。

  问 3:数据匹配中常见有哪些错误?

  答 3:常见错误包括:

  • _merge 变量已存在:多个数据库连续匹配时易出现,删除已有_merge变量,或在匹配时自定义_merge变量的名称
  • 作为匹配依据的识别变量不能唯一识别所有样本:1) 跨类型数据库、面板数据库匹配时易出现,了解数据库结构后,添加匹配依据变量即可。2) 这类问题还会在数据存在错误时出现,例如作为匹配依据的 ID 生成过程有误,或数据导入数据出错(例如 Excel 导入易出现空白单元格)。
  • 变量名重复导致数据被覆盖:using data 仅保留待匹配变量,匹配前核对变量名,是否与master data 重复。

  问 4:未匹配成功的样本是否应当保留?

  答 4:在不了解数据匹配命令时,不应随意删除样本,大量数据未匹配成功极有可能是数据有误或匹配错了。确认数据无误后,根据研究需要筛选样本,一般仅保留匹配成功的样本,有时也会保留仅来自master data的样本。

  ‍