Stata:通过数据框进行数据横向合并-framerge

文摘   2024-11-10 22:00   中国  

👇 连享会 · 推文导航 | www.lianxh.cn

🍓 课程推荐:2024 机器学习与因果推断专题
主讲老师:司继春 (上海对外经贸大学) ;张宏亮(浙江大学)
课程时间:2024 年 11 月 9-10 日 ;16-17日
课程咨询:王老师 18903405450(微信)

课程特色 · 2024机器学习与因果推断

  • 懂原理、会应用。本次课程邀请了两位老师合作讲授,目的在于最大限度地实现理论与应用的有机结合。为期四天的课程,分成两个部分:第一部分讲解常用的机器学习算法和适用条件,以及文本分析和大语言模型;第二部分通过精讲 4-6 篇发表于 Top 期刊的论文,帮助大家理解各类机器学习算法的应用场景,以及它们与传统因果推断方法的巧妙结合。
  • 以 Top 期刊论文为范例。目前多数人的困惑是不清楚如何将传统因果推断方法与机器学习结合起来。事实上,即便是 MIT 和 Harvard 的大牛们也都在「摸着石头过河」。为此,通过论文精讲和复现来学习这部分内容或许是目前最有效的方式了。张宏亮老师此前在浙江大学按照这一模式教授了「因果推断和机器学习」课程,效果甚佳:学生们能够逐渐建立起研究设计的理念,并在构造识别策略时适当地嵌入机器学习方法。

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

作者:陈巧雯 (厦门大学)
邮箱:chenqiaowen@stu.xmu.edu.cn

1. 简介

在数据处理和分析的过程中,通过标识变量将不同数据集进行链接和合并是一种常见的操作。尤其是对于 Stata 用户来说,如何高效地进行数据合并是一个关键问题。虽然 Stata 提供了多种数据合并命令,但在处理大型数据集或者复杂数据关系时,目前的命令存在一定的局限性。

Stata 官方命令 [D] merge 和 [D] joinby 提供了简便的方法进行 1:1、m:1、1:m 和 m:m 的数据横向合并。然而,这两个命令仅支持数据集之间的两两合并,并且要求合并前的数据必须预先保存在硬盘中。数据的保存不仅会增加时间成本,还可能会产生大量中间文件,从而影响工作效率。

Stata 的数据框 (frame) 功能允许用户在内存中同时操作多个数据集,无需将数据保存到硬盘,这极大地提高了工作效率。然而,目前基于 [D] frames 的数据合并命令 [D] frlink 和 [D] frget 只支持 1:1 和 m:1 类型的数据框链接,而无法处理 1:m 和 m:m 关系。通常的解决方法是将使用数据框的数据保存到本地,然后再借助 [D] merge 和 [D] joinby 命令将数据合并到主数据框中。但是,当需要合并的数据量较大时,这种方式的效率较低。

为了解决上述问题,我们引入了一个新的命令:framerge。这个命令不仅支持多种数据合并关系 (包括 1:1、m:1、1:m 和 m:m),而且可以直接在内存中操作数据,无需进行硬盘读写,从而提高了数据处理的效率。

2. framerge 命令

2.1 命令安装

net install kgitee, from(https://gitee.com/kerrydu/kgitee/raw/master) replace
kgitee framerge, replace

2.2 命令语法

framerge {1:1|m:1|1:m|m:m} varlist1, frame(frame2 [varlist2])
[linkvar(linkname)
get(varlist3)
prefix(string)
suffix(string)
exclude(string)]

主要选项的含义如下:

  • varlist1:指定主数据框中用于匹配的变量列表;
  • frame(frame2 [varlist2])frame2 指定使用数据框的名称,varlist2 指定在 frame2 中匹配的变量列表。如果未指定 varlist2,则假定匹配变量在两个数据框中的名称完全相同;
  • linkvar(linkname):指定一个新变量,用于标识链接信息,该变量将添加到主数据框;
  • prefix(string):指定一个字符串,作为合并到主数据框的变量名称前缀;
  • suffix(string):和 prefix(string) 类似,区别在于该选项作用于后缀;
  • exclude(string):指定不合并的变量;
  • 另外,framerge还支持 frlink 命令的子命令 dirdescriperebuild,语法与 frlink 命令一致,参见 [D] frlink。

2.3 命令注意事项

  • framerge 1:mframerge m:m 将创建一个变量 rownum_usingdta,如果主数据框或使用数据框中已存在该变量会报错,需要将该变量先删除或重命名。
  • 如果 get() 选项没有指定变量,需要使用 linkvar() 指定链接名称。

3. Stata 实操

3.1 使用 framerge 实现 1:m 合并

3.1.1 使用数据框准备

首先,我们扩展使用数据框 discharge2,并在使用数据框中创建要合并到主数据框的变量 date。为了直观展示扩展后的使用数据框,我们在列出了 patientid (初始标识变量)、age (discharge2 已有的一个变量) 和 date 的前 15 行数据。

. clear
. frame reset
. cap frame create discharge2
. frame discharge2{
. webuse discharge2,clear
. expand 5
. bys patientid: gen date =_n
. }

. frame change discharge2
. sort patientid date
. list patientid age date in 1/15

+-----------------------+
| patien~d age date |
|-----------------------|
1. | 1 77 1 |
2. | 1 77 2 |
3. | 1 77 3 |
4. | 1 77 4 |
5. | 1 77 5 |
|-----------------------|
6. | 2 81 1 |
7. | 2 81 2 |
8. | 2 81 3 |
9. | 2 81 4 |
10. | 2 81 5 |
|-----------------------|
11. | 3 37 1 |
12. | 3 37 2 |
13. | 3 37 3 |
14. | 3 37 4 |
15. | 3 37 5 |
+-----------------------+

3.1.2 主数据框准备

为了说明主数据框的标识变量在使用数据框中没有匹配的情况,我们将主数据框中第一条观测值的 patientid 替换为 100001,并展示替换后主数据框前 3 行数据。

. frame change default
. webuse discharge1, clear
. replace patientid=patientid+100000 in 1
. list patientid in 1/3

+----------+
| patien~d |
|----------|
1. | 100001 |
2. | 2 |
3. | 3 |
+----------+

3.1.3 数据合并

我们执行 framerge 1:m 从使用数据框中合并 date 到主数据框,运行代码后的主数据框如下:

. framerge 1:m patientid, frame(discharge2) get(date)
. sort patientid date
. list patientid date in 1/10

+-----------------+
| patien~d date |
|-----------------|
1. | 2 1 |
2. | 2 2 |
3. | 2 3 |
4. | 2 4 |
5. | 2 5 |
|-----------------|
6. | 3 1 |
7. | 3 2 |
8. | 3 3 |
9. | 3 4 |
10. | 3 5 |
+-----------------+

. list patientid date in 9896

+-----------------+
| patien~d date |
|-----------------|
9896. | 100001 . |
+-----------------+

我们可以看到,在主数据框中除了 patientid 为 100001 的观察值因与使用数据框中的 patientid 没有匹配项而未合并外,其他 patientid 的对应 date 值均已成功合并。并且,由于在使用数据框中,每个 patientid 对应 5 条观测记录,而我们采用的是一个 1:m 的合并规则,这意味着主数据框中每个成功匹配的 patientid 需要与使用数据框中对应 5 条记录进行合并。所以如果合并成功,在主数据框中,对于能够匹配的 patientid 而言,每个原本只有 1 条记录的 patientid,其对应的观测记录也都增加到了原来的 5 倍。

3.2 使用 framerge 实现 m:m 合并

3.2.1 使用数据框及主数据框准备

我们将使用与上一部分相同的数据集来演示如何使用 framerge 实现 m:m 合并。使用数据框的处理方法与 framerge 1:m 的例子相同,而主数据框需要扩展 3 倍以满足 m:m 合并要求。在这个例子中,我们将扩展后主数据框中第一条观测值的 patientid 替换为 100001 (也就是说主数据框中还剩余 2 条观测记录的 patientid 为 1),以说明主数据框标识变量与使用数据框中的标识变量不匹配的情况。

. clear
. frame reset
. cap frame create discharge2
. frame discharge2{
. webuse discharge2,clear
. expand 5
. bys patientid: gen date =_n
. }
. webuse discharge1, clear
. expand 3
. replace patientid=patientid+100000 in 1
. sort patientid
. list patientid in 1/5

+----------+
| patien~d |
|----------|
1. | 1 |
2. | 1 |
3. | 2 |
4. | 2 |
5. | 2 |
+----------+

. list patientid in 5940

+----------+
| patien~d |
|----------|
5940. | 100001 |
+----------+

3.2.2 数据合并

可以看出,除了 patientid 为 1 的观察记录外,每个 patientid 在主数据框和使用数据框中分别对应 3 条和 5 条观测记录。这意味着每一条主数据框中的观测记录都会与使用数据框中的 5 条观测记录进行合并,导致主数据框中每个 patientid 对应 15 条观测记录。然而,由于 patientid 为 1 的观测记录在主数据框中只有 2 条,因此合并后主数据框中 patientid 为 1 的观测记录只有 10 条。

. framerge m:m patientid, frame(discharge2) get(date)
. sort patientid date
. list patientid date in 1/25

+-----------------+
| patien~d date |
|-----------------|
1. | 1 1 |
2. | 1 1 |
3. | 1 2 |
4. | 1 2 |
5. | 1 3 |
|-----------------|
6. | 1 3 |
7. | 1 4 |
8. | 1 4 |
9. | 1 5 |
10. | 1 5 |
|-----------------|
11. | 2 1 |
12. | 2 1 |
13. | 2 1 |
14. | 2 2 |
15. | 2 2 |
|-----------------|
16. | 2 2 |
17. | 2 3 |
18. | 2 3 |
19. | 2 3 |
20. | 2 4 |
|-----------------|
21. | 2 4 |
22. | 2 4 |
23. | 2 5 |
24. | 2 5 |
25. | 2 5 |
+-----------------+

. list patientid date in 29696

+-----------------+
| patien~d date |
|-----------------|
29696. | 100001 . |
+-----------------+

4. 结语

framerge 命令不仅支持多种数据合并关系,还能在内存中操作,避免了频繁地读写硬盘,大大提高了数据处理的效率。对于需要处理大量数据的用户来说,framerge 无疑是一个强大的助手。

5. 参考资料

  • Ho, A.T.Y., Huynh, K.P., Jacho-Chávez, D.T., Rojas-Baez, D., 2021. Data Science in Stata 16: Frames, Lasso, and Python Integration. J. Stat. Soft. 98. -Link- -PDF- -Google-
  • Mazrekaj, D., Wursten, J., 2021. Stata tip 142: joinby is the real merge m:m. The Stata Journal 21, 1065–1068. -Link- -PDF- -Google-

6. 相关推文

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

  • 专题:数据处理
    • 刘欣妍, 2020, Stata:数据合并与匹配-merge-reclink, 连享会 No.461.
    • 左祥太, 2021, Stata 数据标签和合并, 连享会 No.756.
    • 左祥太, 2021, Stata数据处理:快速合并与编码-encodefrom, 连享会 No.767.
  • 专题:Stata命令
    • 张弛, 2024, Stata:numdate-超好用的日期转换函数, 连享会 No.1345.
    • 李原, 2024, Stata:合并具有不同国家代码的数据集, 连享会 No.1360.
  • 专题:Stata程序
    • 祖丽胡玛尔·热合曼, 2023, Stata:排序、种子值和随机数——为何每次的结果都不同?, 连享会 No.1314.
  • 专题:Stata教程
    • 谢作翰, 2021, Stata小白系列之二:数据拆分与合并, 连享会 No.719.
  • 专题:Stata入门
    • 谢作翰, 连玉君, 2020, Stata小白系列之二:数据拆分与合并, 连享会 No.312.
    • 连享会, 2020, multimport : 一次性导入并合并多个文件, 连享会 No.228.
    • 连玉君, 2020, Stata: 如何快速合并 3500 个无规则命名的数据文件?, 连享会 No.227.
    • 郭思媛, 2024, Stata数据处理:rangejoin-范围数据合并, 连享会 No.1474.
    • 鞠瑶蕾, 2023, Stata:多对多合并-merge-joinby, 连享会 No.1255.

🍓 课程推荐:2024 机器学习与因果推断专题
主讲老师:司继春 (上海对外经贸大学) ;张宏亮(浙江大学)
课程时间:2024 年 11 月 9-10 日 ;16-17日
课程咨询:王老师 18903405450(微信)

尊敬的老师 / 亲爱的同学们:

连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


连享会
连玉君老师团队分享,主页:lianxh.cn。白话计量,代码实操;学术路上,与君同行。
 最新文章