Stata:数据合并与匹配-merge-reclink

发布时间:2020-11-12 阅读 440

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

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

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

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

作者: 刘欣妍 (香港中文大学)
E-Mail: liuxinyan@link.cuhk.edu.hk

[编者按]: 本文参考以下内容,介绍了 Stata 中用来合并数据的几种命令,特此致谢!

[Source]: COMBINING DATASETS USING STATA -Link-


目录


1. merge 命令:横向合并

在合并数据时,最常用的命令就是 merge,该命令会根据两个数据集中「至少一个共同变量」进行横向合并。具体示例如下:

*利用 auto 数据创建两份新的数据集
sysuse auto.dta,clear
keep if _n <=5 //取前5个样本

preserve
keep make price mpg
list, clean noobs
save d1.dta,replace //第一份数据,包括了车辆的品牌,价格以及公里数
restore

preserve
keep make weight length
list, clean noobs
save d2.dta,replace //第二份数据,包括了车辆的品牌,重量以及长度
restore

第一份数据:

make            price   mpg  
AMC Concord     4,099    22  
AMC Pacer       4,749    17  
AMC Spirit      3,799    22  
Buick Century   4,816    20  
Buick Electra   7,827    15  

第二份数据:

make            weight   length  
AMC Concord      2,930      186  
AMC Pacer        3,350      173  
AMC Spirit       2,640      168  
Buick Century    3,250      196  
Buick Electra    4,080      222 

对两份数据进行横向合并:

use d1.dta,clear
merge 1:1 make using d2.dta
keep if _merge==3 //保留匹配成功的数据
drop _merge //将创建的新变量_merge删除 
list, clean noobs

横向合并后结果:

make            price   mpg   weight   length  
AMC Concord     4,099    22    2,930      186  
AMC Pacer       4,749    17    3,350      173  
AMC Spirit      3,799    22    2,640      168  
Buick Century   4,816    20    3,250      196  
Buick Electra   7,827    15    4,080      222  

merge 命令注意事项:

  • 两个数据必须有至少一个共同变量;
  • merge 可以进行 1:1 (一对一匹配)、1:m (一对多匹配)、m:1 (多对一匹配)、以及 m:m (多对多) 匹配,但不建议使用 m:m (多对多) 匹配,因为这样容易造成数据的混乱;
  • using d2.dta 后,可以通过 keepusing() 指定合并变量。如,可以在后面加上 keepusing(weight) 来限定只合并变量 weight
  • 匹配后,需将新生成变量 _merge 删掉,避免再次匹配时,提示变量 _merge 已被定义。另外,_merge = 1 表示正在使用的数据、_merge = 2 表示合并的数据、_merge = 3 表示成功合并的数据。

2. append 命令:纵向合并

除上述横向合并外,我们还可以进行纵向合并。具体示例如下:

sysuse auto.dta,clear

preserve
keep if _n <=5 //取前5个样本
keep make price mpg
save d1.dta,replace //第一个数据,包括了车辆的品牌,价格以及公里数
restore

preserve
keep if _n >=5 & _n <=10 //取第5-10个样本
keep make price mpg
save d2.dta,replace //第二个数据,包括了车辆的品牌,重量以及长度
restore

use d1.dta,clear
append using d2.dta
list, clean noobs

纵向合并后结果:

make             price   mpg  
AMC Concord      4,099    22  
AMC Pacer        4,749    17  
AMC Spirit       3,799    22  
Buick Century    4,816    20  
Buick Electra    7,827    15  
Buick Electra    7,827    15  
Buick LeSabre    5,788    18  
Buick Opel       4,453    26  
Buick Regal      5,189    20  
Buick Riviera   10,372    16  
Buick Skylark    4,082    19 

需要注意,append 命令要求两份数据具有全部相同的变量,否则就会出现缺失值。

3. reclink 命令:字符串的模糊匹配

在横向合并时,若匹配变量在内容上有些差别,如在第一份数据中为「Princeton University」,而在第二份数据中为「Princeton U」,我们可以通过 reclink 命令快速模糊匹配,以避免繁琐的人工识别。具体示例如下:

*输入两份数据
clear
input str13 name str14 city 
	"Zhang ziye"  "Beijing"        
	"Liu biqian"  "Shanghai"        
	"Hu,yi"       "Guangzhou"         
	"Yang,Zhou"   "Hennan"       
end
gen id1=_n
save file1.dta, replace

clear
input str14 name str10 city  
	"Zhan, ziye"  "beijing"       
	"LIU Biqian"  "Shaanghai"        
	"huyi"        "guangdong"     
	"Zhou yang"   "henan"    
end
gen id2=_n
save file2.dta, replace 

*-模糊匹配
use file1.dta,clear
reclink name city using file2.dta, idmaster(id1) idusing(id2) gen(matchscore)
list, clean noobs

模糊匹配后结果:

       name        Uname        city     Ucity   id1   matchs~e   id2   _merge  
 Zhang ziye   Zhan, ziye     Beijing   beijing     1     0.9719     1        3  
  Yang,Zhou    Zhou yang      Hennan     henan     4     0.7797     4        3  
 Liu biqian                 Shanghai               2          .     .        1  
      Hu,yi                Guangzhou               3          .     .        1 

reclink 命令注意事项

  • 两份数据中 id 名必须不同。如,在上述命令中 idmaster(id1)idusing(id2) 分别代表 master data 中的 id 和 using data 中的 id,结果第五列和第七列解读为 master data中的id1 = 1 和 using data 中的 id2 = 1 匹配成功;
  • _merge 变量含义与前文类似;
  • reclink 命令可解决的匹配问题:大小写不同、部分字母缺漏或增加、以及顺序颠倒;
  • matchscore 变量为匹配分数,分数越高代表匹配效果越好。

另外,reclink 命令还允许对匹配变量设定不同权重。比如,在这个例子中,我们认为 city 是最重要的,则仅需增加 vmatch() 选项设定权重。具体示例如下:

use file1.dta,clear
reclink name city using file2.dta, idmaster(id1) idusing(id2) gen(matchscore) wmatch(1 15)
list, clean noobs

模糊匹配后结果:

       name        Uname        city       Ucity   id1   matchs~e   id2   _merge  
 Zhang ziye   Zhan, ziye     Beijing     beijing     1     0.9659     1        3  
 Liu biqian   LIU Biqian    Shanghai   Shaanghai     2     0.9475     2        3  
  Yang,Zhou    Zhou yang      Hennan       henan     4     0.8129     4        3  
      Hu,yi                Guangzhou                 3          .     .        1  

可以看出,该结果与前文结果具有一定差异。

当然,模糊匹配也可以使用 matchit 命令。更多有关 reclinkmatchit 的介绍请参考「Stata:模糊匹配之matchit」

4. joinby 命令:多对多的匹配

在进行多对多匹配时,我们可以使用 mergejoinby 命令,但二者又具有哪些差别?具体示例如下:

*输入数据
clear
input group str3 x1
      1  "A"
      1  "B"
      1  "C"
      1  "D"
end
save file1.dta,replace

clear
input group str3 x2
      1  "M"
      1  "N"
end
save file2.dta,replace

*merge 多对多匹配
use file1.dta,clear
merge m:m group using file2.dta
list, clean noobs

*joinby 多对多匹配
use file1.dta,clear
joinby group using file2.dta
list, clean noobs

merge 命令多对多匹配结果:

    group   x1   x2        _merge  
        1    A    M   matched (3)  
        1    B    N   matched (3)  
        1    C    N   matched (3)  
        1    D    N   matched (3)  

可以看出,merge 命令的多对多合并是有问题的,其会以较少数据文件的最后一行值 (比如这里的 file2.dta 的最后一行数据「group1,x2=N」) 进行重复合并。

joinby 命令多对多匹配结果:

    group   x1   x2  
        1    A    N  
        1    A    M  
        1    B    M  
        1    B    N  
        1    C    N  
        1    C    M  
        1    D    N  
        1    D    M  

可以看出,joinby 命令显然更符合我们的要求。关于 joinby 命令更多详细介绍,请查看帮助文件 help joinby

5. nearmrg 命令:相似值的匹配

上文已经介绍了字符串模糊匹配命令 reclink,这里再介绍一下数值模糊匹配命令 nearmrg。关于该命令更多介绍,请查看帮助文件 help nearmrg

*生成一份数据
sysuse auto.dta, clear 
keep make price mpg
keep if make == "Toyota Celica" |    ///
        make == "BMW 320i" |         ///
		make == "Cad. Seville"  |    ///
		make == "Pont. Grand Prix" | ///
		make == "Datsun 210" 
rename make make2
save "using.dta", replace
list, clean noobs

列出数据:

make2               price   mpg  
Cad. Seville       15,906    21  
Pont. Grand Prix    5,222    19  
BMW 320i            9,735    25  
Datsun 210          4,589    35  
Toyota Celica       5,899    18  

然后,我们将该数据与 auto.dta 进行合并,并找出 using.dta 数据中价格浮动在 $50 上下的数据。

sysuse auto.dta, clear
nearmrg  using "using.dta", upper nearvar(price) genmatch(usingmatch) limit(50)
keep make price mpg make2 _merge usingmatch
list, clean noobs
make                price   mpg   make2                   _merge   usingm~h  
Datsun 210          4,589    35   Datsun 210         matched (3)      4,589  
Buick Regal         5,189    20   Pont. Grand Prix   matched (3)      5,222  
Pont. Grand Prix    5,222    19   Pont. Grand Prix   matched (3)      5,222  
Olds Cutl Supr      5,172    19   Pont. Grand Prix   matched (3)      5,222  
Dodge Magnum        5,886    16   Toyota Celica      matched (3)      5,899  
Toyota Celica       5,899    18   Toyota Celica      matched (3)      5,899  
BMW 320i            9,735    25   BMW 320i           matched (3)      9,735  
Audi 5000           9,690    17   BMW 320i           matched (3)      9,735  
Cad. Seville       15,906    21   Cad. Seville       matched (3)     15,906  

可以看出,using data 中原有 5 行数据,合并后变成了 9 行数据。之所以如此,是因为 auto.dta 中价格浮动在 50 之内的数据都被保留了下来。

相关链接

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看

专题 嘉宾 直播/回看视频
最新专题 因果推断, 空间计量,寒暑假班等
数据清洗系列 游万海 直播, 88 元,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

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

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

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD