Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者:王硕 (山东大学)
邮箱:shweung@163.com
编者按:本文主要摘译自下文,特此致谢!
Source:Roger Newson (2022). Resultssets in resultsframes in Stata 16-plus. 2022 UK Stata Conference 8–9 September, London. -Link-, -PDF-
目录
addinby
是 merge
的一种 “轻量级” 替代命令,由帝国理工学院 (Imperial College London) 的 Roger Newson 教授编写,适用于 m:1 匹配合并形式 (m 可为 1),并简化 merge
命令的代码。
在 Stata16 发布以后,用户可以在 Stata 内存中同时使用多个数据框 (frame)。Roger Newson 教授进一步设计了 fraddinby
命令,允许 Stata 用户在多个 frame 中进行数据的匹配合并。由于 merge
命令是多数 Stata 用户较为熟悉的命令,为了更清楚的介绍 addinby
或者 fraddinby
命令,作者通过与 merge
命令进行对比的方式进行介绍。
由于 addinby
命令是外部命令,在使用前请运行如下代码,以同时安装 addinby
与 fraddinby
。
ssc install addinby, replace
本文使用的案例数据除了 Stata 自带的 auto 数据集外,还使用了 Roger Newson 教授构造的 xauto 数据集。xauto 数据集是对 auto 数据集的扩展,在 auto 数据集的基础上增添了汽车的制造商 (Firm)、汽车是否产于美国 (us) 等变量。在使用前可运行下述命令进行安装:
ssc install xauto, replace
ssc install keyby, replace
安装完成后,运行下述命令可以直接调用 xauto 数据:
xauto, clear
addinby
命令与 merge
命令一样,需要一个 master data 以及 using data。在 1:1 匹配时,本文使用仅保留 make、firm、foreign 变量的 xauto 数据集作为 master data,系统自带的 auto 数据集作为 using data,并匹配 using data 中的 price 和 mpg 变量。make 变量在 master data 和 using data 中都没有重复观测值,因此可以作为匹配的关键变量。命令运行如下:
. sysuse auto.dta, clear
. save auto.dta, replace // 生成用于匹配的 auto.dta 文件
. xauto, clear
. keep make firm foreign
. addinby make using auto.dta, keep(price mpg)
. list in 1/10
+-------------------------------------------------+
| foreign make firm price mpg |
|-------------------------------------------------|
1. | Domestic AMC Concord AMC 4,099 22 |
2. | Domestic AMC Pacer AMC 4,749 17 |
3. | Domestic AMC Spirit AMC 3,799 22 |
4. | Domestic Buick Century Buick 4,816 20 |
5. | Domestic Buick Electra Buick 7,827 15 |
|-------------------------------------------------|
6. | Domestic Buick LeSabre Buick 5,788 18 |
7. | Domestic Buick Opel Buick 4,453 26 |
8. | Domestic Buick Regal Buick 5,189 20 |
9. | Domestic Buick Riviera Buick 10,372 16 |
10. | Domestic Buick Skylark Buick 4,082 19 |
+-------------------------------------------------+
与此相对,使用 merge
命令运行程序如下:
. xauto, clear
. keep make firm foreign
. merge 1:1 make using auto.dta, nogen keepusing(price mpg)
. list in 1/10
+------------------------------------------------+
| foreign make firm price mpg |
|------------------------------------------------|
1. | Domestic AMC Concord AMC 4,099 22 |
2. | Domestic AMC Pacer AMC 4,749 17 |
3. | Domestic AMC Spirit AMC 3,799 22 |
4. | Foreign Audi 5000 Audi 9,690 17 |
5. | Foreign Audi Fox Audi 6,295 23 |
|------------------------------------------------|
6. | Foreign BMW 320i BMW 9,735 25 |
7. | Domestic Buick Century Buick 4,816 20 |
8. | Domestic Buick Electra Buick 7,827 15 |
9. | Domestic Buick LeSabre Buick 5,788 18 |
10. | Domestic Buick Opel Buick 4,453 26 |
+------------------------------------------------+
. sort foreign make
. list in 1/10
+-------------------------------------------------+
| foreign make firm price mpg |
|-------------------------------------------------|
1. | Domestic AMC Concord AMC 4,099 22 |
2. | Domestic AMC Pacer AMC 4,749 17 |
3. | Domestic AMC Spirit AMC 3,799 22 |
4. | Domestic Buick Century Buick 4,816 20 |
5. | Domestic Buick Electra Buick 7,827 15 |
|-------------------------------------------------|
6. | Domestic Buick LeSabre Buick 5,788 18 |
7. | Domestic Buick Opel Buick 4,453 26 |
8. | Domestic Buick Regal Buick 5,189 20 |
9. | Domestic Buick Riviera Buick 10,372 16 |
10. | Domestic Buick Skylark Buick 4,082 19 |
+-------------------------------------------------+
在上述对比中,可以发现 addinby
与 merge
命令在 1:1 匹配时有以下不同:
addinby
默认匹配方式为 m:1 匹配 (m 可以为 1),因此不再需要像 merge
一样指示匹配规则 (如 1:1,m:1,1:m,m:m),若出现 1:m 或者 m:m (m>1) 情形时,addinby
命令会报错;addinby
默认不生成匹配结果的标志变量 (即 merge
命令中的 _m),想要添加此变量需要增加 generate(newvar)
选项,而 merge
命令默认生成 _m 变量,不想生成需要增加 nogen
选项;addinby
命令在匹配完成后不改变原数据 (master data) 的排序,而 merge
命令通常会改变原数据的排序;addinby
使用的是 keep(varlist)
选项,而 merge
命令使用的是 keepusing(varlist)
选项。Roger Newson 教授在 xauto 数据集的基础上进一步增添了汽车交易地区的变量,根据汽车生产商分为美国、日本、欧洲经济共同体三个交易地区。其运行代码如下:
. xauto, clear
. gene tradebloc = "USA" if us
. replace tradebloc = "Japan" if inlist(firm, "Datsun", "Honda", "Mazda", "Subaru", "Toyota")
. replace tradebloc = "EEC" if missing(tradebloc)
. lab var tradebloc "Trading bloc of firm"
. keep firm tradebloc
. duplicates drop
. list, abbreviate(12) // 增添 abbreviate(12) 选项是为了让 tradebloc 变量名在表中能全部显示
+---------------------+
| firm tradebloc |
|---------------------|
1. | AMC USA |
2. | Buick USA |
3. | Cad. USA |
4. | Chev. USA |
5. | Dodge USA |
|---------------------|
6. | Ford USA |
7. | Linc. USA |
8. | Merc. USA |
9. | Olds USA |
10. | Plym. USA |
|---------------------|
11. | Pont. USA |
12. | Audi EEC |
13. | BMW EEC |
14. | Datsun Japan |
15. | Fiat EEC |
|---------------------|
16. | Honda Japan |
17. | Mazda Japan |
18. | Peugeot EEC |
19. | Renault EEC |
20. | Subaru Japan |
|---------------------|
21. | Toyota Japan |
22. | VW EEC |
23. | Volvo EEC |
+---------------------+
. save auto_block.dta, replace
上述 auto_block 数据集中有两个变量,共有 23 个生产商以及生产商对应的交易地区。为演示 addinby
在 m:1 匹配时的用法,我们将 auto_block 数据集 (using data) 再匹配到 xauto 数据集 (master data) 中,此时匹配的主要关键变量为 firm,其在 master data 中有重复观测值,在 using data 中没有重复观测值。运行代码如下:
. xauto, clear
. keep make firm foreign
. addinby firm using auto_block.dta
. list in 40/l, abbreviate(12)
+---------------------------------------------------+
| foreign make firm tradebloc |
|---------------------------------------------------|
40. | Domestic Olds Starfire Olds USA |
41. | Domestic Olds Toronado Olds USA |
42. | Domestic Plym. Arrow Plym. USA |
43. | Domestic Plym. Champ Plym. USA |
44. | Domestic Plym. Horizon Plym. USA |
|---------------------------------------------------|
45. | Domestic Plym. Sapporo Plym. USA |
46. | Domestic Plym. Volare Plym. USA |
47. | Domestic Pont. Catalina Pont. USA |
48. | Domestic Pont. Firebird Pont. USA |
49. | Domestic Pont. Grand Prix Pont. USA |
|---------------------------------------------------|
50. | Domestic Pont. Le Mans Pont. USA |
51. | Domestic Pont. Phoenix Pont. USA |
52. | Domestic Pont. Sunbird Pont. USA |
53. | Foreign Audi 5000 Audi EEC |
54. | Foreign Audi Fox Audi EEC |
|---------------------------------------------------|
55. | Foreign BMW 320i BMW EEC |
56. | Foreign Datsun 200 Datsun Japan |
57. | Foreign Datsun 210 Datsun Japan |
58. | Foreign Datsun 510 Datsun Japan |
59. | Foreign Datsun 810 Datsun Japan |
|---------------------------------------------------|
60. | Foreign Fiat Strada Fiat EEC |
61. | Foreign Honda Accord Honda Japan |
62. | Foreign Honda Civic Honda Japan |
63. | Foreign Mazda GLC Mazda Japan |
64. | Foreign Peugeot 604 Peugeot EEC |
|---------------------------------------------------|
65. | Foreign Renault Le Car Renault EEC |
66. | Foreign Subaru Subaru Japan |
67. | Foreign Toyota Celica Toyota Japan |
68. | Foreign Toyota Corolla Toyota Japan |
69. | Foreign Toyota Corona Toyota Japan |
|---------------------------------------------------|
70. | Foreign VW Dasher VW EEC |
71. | Foreign VW Diesel VW EEC |
72. | Foreign VW Rabbit VW EEC |
73. | Foreign VW Scirocco VW EEC |
74. | Foreign Volvo 260 Volvo EEC |
+---------------------------------------------------+
实现上述过程的 merge
命令如下:
. xauto, clear
. keep make firm foreign
. merge m:1 firm using auto_block.dta, nogen
. list in 40/l, abbreviate(12)
. sort foreign make
. list in 40/l, abbreviate(12)
与 1:1 情况类似,merge
命令需要指明匹配方式为 m:1 匹配,而 addinby
命令不需要指明匹配方式。另外,merge
命令通常会改变原数据的排序方式,对匹配后的数据进行重新排序后,能够得到与 addinby
命令匹配后相同的结果。
在匹配过程中常见的问题有不能完全匹配,匹配所用的关键变量存在缺失值,匹配变量在 master data 与 using data 存在冲突等,下文将详细介绍这些问题。
addinby
命令在设计时的思路与 merge
命令有所不同。首先,merge
命令力求将所有可能的匹配情况都考虑到,而 addinby
主要致力于解决用户最普遍的匹配需求,这也是称 addinby
命令为 merge
命令的一种 "cleaner" alternative version 的原因。这主要体现在二者对于 master data 和 using data 重要性的看法不同。
addinby
侧重于 master data,对于 master data 存在而 using data 不存在的观测值给出三个选项:一是 unmatched (keep)
,即保留 master data 未完成匹配的观测值,未匹配到的观测值用缺失值表示;二是unmatched (drop)
,即删除 master data 中未完成匹配的观测值;三是unmatched (fail)
或者不填写unmatched
命令时,提示错误。
merge
命令将 master data 与 using data 看作对等,在 keep (results)
选项中提供了master
、using
、match
、match_update
、match_conflict
五种选择,它们单独选择或者两两结合会形成多种选择方式。
但实际中常用的保留方式为 addinby
命令提供的方式。为直观地展示这一问题,作者将 auto 数据集的后 20 个观测值删除掉,生成 auto_drop 数据集作为 using data,将 xauto 数据集的前 20 个观测值删除掉,作为 master data,然后进行匹配。代码如下:
. sysuse auto.dta, clear
. drop in -20/l
. save auto_drop.dta, replace
. xauto, clear
. keep make firm foreign
. drop in 1/20
. addinby make using auto_drop.dta, keep(price mpg) unmatched(keep)
. list in 1/31
+-----------------------------------------------------+
| foreign make firm price mpg |
|-----------------------------------------------------|
1. | Domestic Dodge Diplomat Dodge 4,010 18 |
2. | Domestic Dodge Magnum Dodge 5,886 16 |
3. | Domestic Dodge St. Regis Dodge 6,342 17 |
4. | Domestic Ford Fiesta Ford 4,389 28 |
5. | Domestic Ford Mustang Ford 4,187 21 |
|-----------------------------------------------------|
6. | Domestic Linc. Continental Linc. 11,497 12 |
7. | Domestic Linc. Mark V Linc. 13,594 12 |
8. | Domestic Linc. Versailles Linc. 13,466 14 |
9. | Domestic Merc. Bobcat Merc. 3,829 22 |
10. | Domestic Merc. Cougar Merc. 5,379 14 |
|-----------------------------------------------------|
11. | Domestic Merc. Marquis Merc. 6,165 15 |
12. | Domestic Merc. Monarch Merc. 4,516 18 |
13. | Domestic Merc. XR-7 Merc. 6,303 14 |
14. | Domestic Merc. Zephyr Merc. 3,291 20 |
15. | Domestic Olds 98 Olds 8,814 21 |
|-----------------------------------------------------|
16. | Domestic Olds Cutl Supr Olds 5,172 19 |
17. | Domestic Olds Cutlass Olds 4,733 19 |
18. | Domestic Olds Delta 88 Olds 4,890 18 |
19. | Domestic Olds Omega Olds 4,181 19 |
20. | Domestic Olds Starfire Olds 4,195 24 |
|-----------------------------------------------------|
21. | Domestic Olds Toronado Olds 10,371 16 |
22. | Domestic Plym. Arrow Plym. 4,647 28 |
23. | Domestic Plym. Champ Plym. 4,425 34 |
24. | Domestic Plym. Horizon Plym. 4,482 25 |
25. | Domestic Plym. Sapporo Plym. 6,486 26 |
|-----------------------------------------------------|
26. | Domestic Plym. Volare Plym. 4,060 18 |
27. | Domestic Pont. Catalina Pont. 5,798 18 |
28. | Domestic Pont. Firebird Pont. 4,934 18 |
29. | Domestic Pont. Grand Prix Pont. 5,222 19 |
30. | Domestic Pont. Le Mans Pont. 4,723 19 |
|-----------------------------------------------------|
31. | Domestic Pont. Phoenix Pont. 4,424 19 |
+-----------------------------------------------------+
上述过程为保留 master data 中没有匹配成功的数据,与此对应的 merge
命令代码为:
. xauto, clear
. keep make firm foreign
. drop in 1/20
. merge 1:1 make using auto_drop.dta, keepusing(price mpg) nogen keep(master matched)
. sort foreign make
. list
如果要删除 master data 中没有匹配成功的数据,命令如下:
. xauto, clear
. keep make firm foreign
. drop in 1/20
. addinby make using auto_drop.dta, keep(price mpg) unmatched(drop)
. list
+-----------------------------------------------------+
| foreign make firm price mpg |
|-----------------------------------------------------|
1. | Domestic Dodge Diplomat Dodge 4,010 18 |
2. | Domestic Dodge Magnum Dodge 5,886 16 |
3. | Domestic Dodge St. Regis Dodge 6,342 17 |
4. | Domestic Ford Fiesta Ford 4,389 28 |
5. | Domestic Ford Mustang Ford 4,187 21 |
|-----------------------------------------------------|
6. | Domestic Linc. Continental Linc. 11,497 12 |
7. | Domestic Linc. Mark V Linc. 13,594 12 |
8. | Domestic Linc. Versailles Linc. 13,466 14 |
9. | Domestic Merc. Bobcat Merc. 3,829 22 |
10. | Domestic Merc. Cougar Merc. 5,379 14 |
|-----------------------------------------------------|
11. | Domestic Merc. Marquis Merc. 6,165 15 |
12. | Domestic Merc. Monarch Merc. 4,516 18 |
13. | Domestic Merc. XR-7 Merc. 6,303 14 |
14. | Domestic Merc. Zephyr Merc. 3,291 20 |
15. | Domestic Olds 98 Olds 8,814 21 |
|-----------------------------------------------------|
16. | Domestic Olds Cutl Supr Olds 5,172 19 |
17. | Domestic Olds Cutlass Olds 4,733 19 |
18. | Domestic Olds Delta 88 Olds 4,890 18 |
19. | Domestic Olds Omega Olds 4,181 19 |
20. | Domestic Olds Starfire Olds 4,195 24 |
|-----------------------------------------------------|
21. | Domestic Olds Toronado Olds 10,371 16 |
22. | Domestic Plym. Arrow Plym. 4,647 28 |
23. | Domestic Plym. Champ Plym. 4,425 34 |
24. | Domestic Plym. Horizon Plym. 4,482 25 |
25. | Domestic Plym. Sapporo Plym. 6,486 26 |
|-----------------------------------------------------|
26. | Domestic Plym. Volare Plym. 4,060 18 |
27. | Domestic Pont. Catalina Pont. 5,798 18 |
28. | Domestic Pont. Firebird Pont. 4,934 18 |
29. | Domestic Pont. Grand Prix Pont. 5,222 19 |
30. | Domestic Pont. Le Mans Pont. 4,723 19 |
|-----------------------------------------------------|
31. | Domestic Pont. Phoenix Pont. 4,424 19 |
32. | Domestic Pont. Sunbird Pont. 4,172 24 |
33. | Foreign Audi 5000 Audi 9,690 17 |
34. | Foreign Audi Fox Audi 6,295 23 |
+-----------------------------------------------------+
与此对应的 merge
命令为:
. xauto, clear
. keep make firm foreign
. drop in 1/20
. merge 1:1 make using auto_drop.dta, keepusing(price mpg) nogen keep(matched)
. sort foreign make
. list
从上述对比中可以看出,addinby
命令中选择 unmatched(keep)
,等同于 merge
命令中选择 keep (master matched)
,表明即保留匹配成功的观测值,又保留 master data 中未匹配成功的观测值。
而 addinby
命令中选择 unmatched (drop)
,等同于 merge
命令中选择 keep (matched)
,表明只保留匹配成功的观测值。因此,addinby
的选项相当于 merge
命令选项的一个子集,但也是最常用的子集。当然,如果在 addinby
命令中没有选择 unmatched
或者选择为 unmatched (fail)
,Stata 会报错提示,命令如下:
. xauto, clear
. keep make firm foreign
. drop in 1/20
. addinby make using auto_drop.dta, keep(price mpg) unmatched(fail)
No matching observations in **using data**set for 20 observations in **master data**set
在很多情况下,master data 中用于匹配的关键变量可能会存在缺失值,此时 addinby
命令如何处理?首先,addinby
命令要求用户添加 missing
选项。倘若用户未添加则会报错并告诉用户关键变量中包含缺失值,因此添加 missing
选项能够证明用户是在知道关键变量包含缺失值的情况下进行匹配的。
其次,根据 using data 的关键变量存在缺失值的情况,会有以下几种情形:
(1) 若 using data 中的关键变量不含缺失值。此时 master data 中的关键变量缺失的观测值可以看作上述的 unmatched 问题。为直观展示,本文将 xauto 数据集的 make 变量中的前四个观测值转为缺失值,再与 auto 数据集进行匹配。命令如下:
. xauto, clear
. keep make firm foreign
. replace make = "" in 1/4
. addinby make using auto.dta, keep(price mpg) missing unmatched(keep)
. list in 1/10
+-------------------------------------------------+
| foreign make firm price mpg |
|-------------------------------------------------|
1. | Domestic AMC . . |
2. | Domestic AMC . . |
3. | Domestic AMC . . |
4. | Domestic Buick . . |
5. | Domestic Buick Electra Buick 7,827 15 |
|-------------------------------------------------|
6. | Domestic Buick LeSabre Buick 5,788 18 |
7. | Domestic Buick Opel Buick 4,453 26 |
8. | Domestic Buick Regal Buick 5,189 20 |
9. | Domestic Buick Riviera Buick 10,372 16 |
1. | Domestic Buick Skylark Buick 4,082 19 |
+-------------------------------------------------+
这一命令为保存 master data 中关键变量的缺失值,与其相同效果的 merge
命令为:
. xauto, clear
. keep make firm foreign
. replace make = "" in 1/4
. merge m:1 make using auto.dta, keepusing(price mpg) nogen keep(master matched)
. sort foreign make firm
. list in 1/10
倘若想要删除 master data 中关键变量的缺失值,则 addinby
对应命令如下:
. xauto, clear
. keep make firm foreign
. replace make = "" in 1/4
. addinby make using auto.dta, keep(price mpg) missing unmatched(drop)
. list in 1/10
+--------------------------------------------------+
| foreign make firm price mpg |
|--------------------------------------------------|
1. | Domestic Buick Electra Buick 7,827 15 |
2. | Domestic Buick LeSabre Buick 5,788 18 |
3. | Domestic Buick Opel Buick 4,453 26 |
4. | Domestic Buick Regal Buick 5,189 20 |
5. | Domestic Buick Riviera Buick 10,372 16 |
|--------------------------------------------------|
6. | Domestic Buick Skylark Buick 4,082 19 |
7. | Domestic Cad. Deville Cad. 11,385 14 |
8. | Domestic Cad. Eldorado Cad. 14,500 14 |
9. | Domestic Cad. Seville Cad. 15,906 21 |
1. | Domestic Chev. Chevette Chev. 3,299 29 |
+--------------------------------------------------+
与其等价的 merge
命令为:
. xauto, clear
. keep make firm foreign
. replace make = "" in 1/4
. merge m:1 make using auto.dta, keepusing(price mpg) nogen keep(matched)
. sort foreign make firm
. list in 1/10
(2) 若 using data 中的的关键变量中只含有一个缺失值。此时可以看作 master data 中的缺失值和 using data 中的缺失值可以通过 m:1 配对形式进行匹配。addinby
命令如下:
. sysuse auto.dta, clear
. replace make = "" in 3
. save auto_missing.dta,replace
. xauto, clear
. keep make firm foreign
. replace make = "" in 1/4
. addinby make using auto_missing.dta, keep(price mpg) missing
. list in 1/10
+-------------------------------------------------+
| foreign make firm price mpg |
|-------------------------------------------------|
1. | Domestic AMC 3,799 22 |
2. | Domestic AMC 3,799 22 |
3. | Domestic AMC 3,799 22 |
4. | Domestic Buick 3,799 22 |
5. | Domestic Buick Electra Buick 7,827 15 |
|-------------------------------------------------|
6. | Domestic Buick LeSabre Buick 5,788 18 |
7. | Domestic Buick Opel Buick 4,453 26 |
8. | Domestic Buick Regal Buick 5,189 20 |
9. | Domestic Buick Riviera Buick 10,372 16 |
1. | Domestic Buick Skylark Buick 4,082 19 |
+-------------------------------------------------+
与其等价的 merge
命令为:
. xauto, clear
. keep make firm foreign
. replace make = "" in 1/4
. merge m:1 make using auto_missing.dta, keepusing(price mpg) nogen
. sort foreign make firm
. list in 1/10
(3) 若 using data 中的的关键变量中只含有多个缺失值。此时可以看作 master data 中的缺失值和 using data 中的缺失值可以通过 m:m 配对形式进行匹配,由于 addinby
不支持 m:m 匹配,此时程序会报错。
addinby
中 update
与 replace
选项功能与 merge
中的选项功能相同,此处作简要介绍。对于 master data 中某个被匹配变量含有缺失值,但 using data 中对应变量的观测值不为缺失值,可使用 update
命令将 master data 中缺失值进行替换。addinby
的命令如下:
. xauto, clear
. keep make firm foreign price
. replace price = . in 1/4
. addinby make using auto.dta, keep(price mpg) update
. list in 1/10
+-------------------------------------------------+
| foreign make price firm mpg |
|-------------------------------------------------|
1. | Domestic AMC Concord 4,099 AMC 22 |
2. | Domestic AMC Pacer 4,749 AMC 17 |
3. | Domestic AMC Spirit 3,799 AMC 22 |
4. | Domestic Buick Century 4,816 Buick 20 |
5. | Domestic Buick Electra 7,827 Buick 15 |
|-------------------------------------------------|
6. | Domestic Buick LeSabre 5,788 Buick 18 |
7. | Domestic Buick Opel 4,453 Buick 26 |
8. | Domestic Buick Regal 5,189 Buick 20 |
9. | Domestic Buick Riviera 10,372 Buick 16 |
1. | Domestic Buick Skylark 4,082 Buick 19 |
+-------------------------------------------------+
与其等价的 merge
命令为:
. xauto, clear
. keep make firm foreign price
. replace price = . in 1/4
. merge m:1 make using auto.dta, keepusing(price mpg) nogen update
. sort foreign make
. list in 1/10
若 master data 中某个变量的观测值不为缺失值,但与 using data 中的对应变量的观测值不相同,但想以 using data 对应变量的值替换 master data 对应变量的值,则可以使用 update replace
选项进行替换。addinby
的命令如下:
. xauto, clear
. keep make firm foreign price
. replace price = 1 in 1/4
. addinby make using auto.dta, keep(price mpg) update replace
. list in 1/10
对应的 merge
命令如下:
. xauto, clear
. keep make firm foreign price
. replace price = 1 in 1/4
. merge m:1 make using auto.dta, keepusing(price mpg) nogen update replace
. sort foreign make
. list in 1/10
通过前述匹配,在工作路径下生成了 auto.dta,auto_drop.dta,auto_missing.dta,auto_block.dta 数据集,有时这些数据集只供临时使用,且都与 xauto 数据集相关。那么,如何规整多个数据集?
在 Stata16 发布以后,用户可以在同一数据集内不同的数据框 (frame) 之间进行操作,实现上述需求。对于 frame,可以查看连享会的推文 Stata:如何同时对多个数据框操作-frame 进行了解,此处不再赘述。
在同一数据集下创造多个 frame 基础上,用户可以使用 fraddinby
命令在不同数据框之间进行匹配合并,合并语法与 addinby
类似。另外,merge
命令目前尚不能实现数据框之间匹配,因此这也是 fraddinby
命令的优势所在。下面,本文就前述匹配过程在 frame 之间再进行一遍操作。
创建 using data 数据框:
. clear all
. frame create auto
. frame create auto_drop
. frame create auto_missing
. frame create auto_block
. frame auto {
. sysuse auto.dta, clear
}
. frame auto_drop {
. sysuse auto.dta, clear
. drop in -20/l
}
. frame auto_missing {
. sysuse auto.dta, clear
. replace make = "" in 3
}
. frame auto_block {
. xauto, clear
. gene tradebloc = "USA" if us
. replace tradebloc = "Japan" if inlist(firm,"Datsun","Honda","Mazda","Subaru","Toyota")
. replace tradebloc = "EEC" if missing(tradebloc)
. lab var tradebloc "Trading bloc of firm"
. keep firm tradebloc
. duplicates drop
}
. frame dir
auto 74 x 12; 1978 automobile data
* auto_block 23 x 2; 1978 Automobile Data extended by Roger Newson
* auto_drop 54 x 12; 1978 automobile data
* auto_missing 74 x 12; 1978 automobile data
default 0 x 0
1:1 匹配
. xauto, clear
. keep make firm
. fraddinby make, frame(auto) keep(price mpg)
. describe
. list in 1/10
m:1 匹配
. xauto, clear
. keep make firm foreign
. fraddinby firm, frame(auto_block)
. list in 40/l, abbreviate(12)
处理 unmatched 的问题
. xauto, clear
. keep make firm foreign
. drop in 1/20
. fraddinby make, frame(auto_drop) keep(price mpg) unmatched(keep)
. list
. xauto, clear
. keep make firm foreign
. drop in 1/20
. fraddinby make, frame(auto_drop) keep(price mpg) unmatched(drop)
. list
处理 missing values 的问题
. xauto, clear
. keep make firm foreign
. replace make = "" in 1/4
. fraddinby make, frame(auto) keep(price mpg) missing unmatched(keep)
. list in 1/10
. xauto, clear
. keep make firm foreign
. replace make = "" in 1/4
. fraddinby make, frame(auto) keep(price mpg) missing unmatched(drop)
. list in 1/10
. xauto, clear
. keep make firm foreign
. replace make = "" in 1/4
. fraddinby make, frame(auto_missing) keep(price mpg) missing
. list in 1/10
通过运行上述命令,可以发现在数据框中进行匹配得到的结果与在独立数据集中进行匹配得到的结果完全相同,但 fraddinby
目前尚不能处理 update & replace 问题,这是其与 addinby
命令的一个不同。
通过上述对比分析,作者认为与 merge
命令相比,addinby
命令或者 fraddinby
主要有以下几方面的不同:
addinby
或者 fraddinby
命令适用于 m:1 匹配 (m 可以等于 1),而 merge
命令可以实现 1:m,m:1,m:m 匹配;addinby
或者 fraddinby
命令主要适用于 m:1 匹配,因此代码与 merge
命令相比更为简洁;addinby
或者 fraddinby
命令将 master data 看作主导数据库,对于 unmatched 情况下仅提供unmatched(keep)
与 unmatched(drop)
两种简洁的处理方式 (不考虑 unmatched(fail)
),而 merge
命令提供更为多元和复杂的处理方式;addinby
或者 fraddinby
命令在匹配完成后不改变原数据的排序,merge
命令通常会改变原数据的排序;addinby
用于不同数据之间的匹配合并,fraddinby
命令可以实现数据框 (frame) 之间的匹配,而 merge
命令只能实现数据之间的匹配合并。
Note:产生如下推文列表的 Stata 命令为:
lianxh merge frame, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
和songbl
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh