Stata:轻量匹配命令-addinby

发布时间:2023-06-20 阅读 1685

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:王硕 (山东大学)
邮箱shweung@163.com

编者按:本文主要摘译自下文,特此致谢!
Source:Roger Newson (2022). Resultssets in resultsframes in Stata 16-plus. 2022 UK Stata Conference 8–9 September, London. -Link-, -PDF-


目录


1. 命令简介

addinbymerge 的一种 “轻量级” 替代命令,由帝国理工学院 (Imperial College London) 的 Roger Newson 教授编写,适用于 m:1 匹配合并形式 (m 可为 1),并简化 merge 命令的代码。

在 Stata16 发布以后,用户可以在 Stata 内存中同时使用多个数据框 (frame)。Roger Newson 教授进一步设计了 fraddinby 命令,允许 Stata 用户在多个 frame 中进行数据的匹配合并。由于 merge 命令是多数 Stata 用户较为熟悉的命令,为了更清楚的介绍 addinby 或者 fraddinby 命令,作者通过与 merge 命令进行对比的方式进行介绍。

2. 命令安装

由于 addinby 命令是外部命令,在使用前请运行如下代码,以同时安装 addinbyfraddinby

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

3. 如何进行匹配

3.1 如何进行 1:1 匹配

addinby 命令与 merge 命令一样,需要一个 master data 以及 using data。在 1:1 匹配时,本文使用仅保留 makefirmforeign 变量的 xauto 数据集作为 master data,系统自带的 auto 数据集作为 using data,并匹配 using data 中的 pricempg 变量。make 变量在 master datausing 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 |
     +-------------------------------------------------+

在上述对比中,可以发现 addinbymerge 命令在 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) 选项。

3.2 如何进行 m:1 匹配

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 命令匹配后相同的结果。

4. 如何处理匹配过程中的常见的问题

在匹配过程中常见的问题有不能完全匹配,匹配所用的关键变量存在缺失值,匹配变量在 master datausing data 存在冲突等,下文将详细介绍这些问题。

4.1 如何处理 unmatched 的问题

addinby 命令在设计时的思路与 merge 命令有所不同。首先,merge 命令力求将所有可能的匹配情况都考虑到,而 addinby 主要致力于解决用户最普遍的匹配需求,这也是称 addinby 命令为 merge 命令的一种 "cleaner" alternative version 的原因。这主要体现在二者对于 master datausing data 重要性的看法不同。

  • addinby 侧重于 master data,对于 master data 存在而 using data 不存在的观测值给出三个选项:一是 unmatched (keep),即保留 master data 未完成匹配的观测值,未匹配到的观测值用缺失值表示;二是unmatched (drop),即删除 master data 中未完成匹配的观测值;三是unmatched (fail)或者不填写unmatched命令时,提示错误。

  • merge 命令将 master datausing data 看作对等,在 keep (results) 选项中提供了masterusingmatchmatch_updatematch_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

4.2 如何处理 missing values 的问题

在很多情况下,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 匹配,此时程序会报错。

4.3. 如何处理 update & replace 的问题

addinbyupdatereplace 选项功能与 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

5. 如何在数据框 (frame) 中进行匹配

通过前述匹配,在工作路径下生成了 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 命令的一个不同。

6. 总结

通过上述对比分析,作者认为与 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 命令只能实现数据之间的匹配合并。

7. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh merge frame, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh