Stata:产生唯一数据编码的三种方法

发布时间:2020-10-09 阅读 49

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

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

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

作者:胡雨霄 (伦敦政治经济学院)


目录


假设要处理的数据包含 3 个代码变量,household_ID, city_ID, 以及 state_ID。这 3 个变量分别表示不同个体所在的家庭、城市以及州的代码。若将这 3 个代码变量视为一个组合,那么组合内不同的数字排列,则分别代表了不同的个体。

本推文将介绍如何在这种情况下,生成不同个体的唯一代码 (unique ID)。

1. 数据生成

首先设置 25,000 个观测值。

clear 
set obs 25000

假设变量 household_ID 的取值范围为 [1, 50],变量 city_ID 的取值范围为 [1, 20],变量 state_ID 的取值范围为 [1, 50]。

*随机生成
gen household_ID = ceil(runiform()*50)
gen city_ID = ceil(runiform()*20)
gen state_ID = ceil(runiform()*50)

此外,生成变量 x1 x2 ,模拟在实际数据中我们感兴趣的变量 (variables of interest)。

*随机生成
gen x1 = rnormal()
gen x2 = rnormal()

数据结构如下所示:

. list household_ID city_ID state_ID x1 x2 in 1/10

     +-------------------------------------------------------+
     | househ~D   city_ID   state_ID          x1          x2 |
     |-------------------------------------------------------|
  1. |       18        10         28    2.025588   -.1922264 |
  2. |       14        11          8    1.042631   -.0807038 |
  3. |        7        17         21    .2977124    .6150526 |
  4. |        2         4         28   -1.722132   -1.358765 |
  5. |       44         8         36   -.7291995    .0929139 |
     |-------------------------------------------------------|
  6. |       18        12         18    .8618261    .6687715 |
  7. |        4         4         29    -.239354    .6361541 |
  8. |       17        14          2     .516549   -.6399707 |
  9. |       28        15         19   -1.812016   -1.628398 |
 10. |       44         2         23   -1.015124   -.7855705 |
     +-------------------------------------------------------+

2. 创建唯一代码 (Unique ID) 的两种方式

2.1 用 egen 命令创建 Unique ID

创建 Unique ID 最简单的方法就是使用 egen 命令。

. egen ID = group(household_ID city_ID state_ID)
. list in 1/10

     +---------------------------------------+
     | househ~D   state_ID   city_ID      ID |
     |---------------------------------------|
  1. |       18         28        10    6890 |
  2. |       14          8        11    5296 |
  3. |        7         21        17    2724 |
  4. |        2         28         4     469 |
  5. |       44         36         8   17091 |
     |---------------------------------------|
  6. |       18         18        12    6925 |
  7. |        4         29         4    1253 |
  8. |       17          2        14    6553 |
  9. |       28         19        15   10945 |
 10. |       44         23         2   16966 |
     +---------------------------------------+

通过 egen 命令创建的 Unique ID 变量 ID 的排序方式与 sort household_ID city_ID state_ID 命令的排序方式相同,如下所示:

. sort household_ID city_ID state_ID \\排序
. list household_ID city_ID state_ID ID in 1/10

     +------------------------------------+
     | househ~D   city_ID   state_ID   ID |
     |------------------------------------|
  1. |        1         1          2    1 |
  2. |        1         1          5    2 |
  3. |        1         1          7    3 |
  4. |        1         1         10    4 |
  5. |        1         1         10    4 |
     |------------------------------------|
  6. |        1         1         11    5 |
  7. |        1         1         15    6 |
  8. |        1         1         15    6 |
  9. |        1         1         20    7 |
 10. |        1         1         21    8 |
     +------------------------------------+

2.2 创建字符型 Unique ID

另一种创建 Unique ID 变量的方式是创建一个字符 (string) 变量。虽然这种方式相对复杂,但所产生的 Unique ID 变量也更直接,容易识别。

具体命令如下:

. gen ID3 = "H" + string(household_ID,"%2.0f" ) + "C" + string(city_ID) + "S" + string(state_ID)
. list household_ID city_ID state_ID ID3 in 1/10

     +-------------------------------------------+
     | househ~D   city_ID   state_ID         ID3 |
     |-------------------------------------------|
  1. |       18        10         28   H18C10S28 |
  2. |       14        11          8    H14C11S8 |
  3. |        7        17         21    H7C17S21 |
  4. |        2         4         28     H2C4S28 |
  5. |       44         8         36    H44C8S36 |
     |-------------------------------------------|
  6. |       18        12         18   H18C12S18 |
  7. |        4         4         29     H4C4S29 |
  8. |       17        14          2    H17C14S2 |
  9. |       28        15         19   H28C15S19 |
 10. |       44         2         23    H44C2S23 |
     +-------------------------------------------+

3. 处理重复观测

由于数据中存在重复观测值,创建的唯一代码 (Unique ID) 其实也并不唯一。

当运行 sum ID 命令后,可以发现变量 ID 的最大取值为 19,757。这说明该样本一共包括 19,757 个不同的个体。duplicates report ID 的结果表明,在该数据集中,有 4,459 (19,757 - 15,298 = 4,459)个个体被重复观测了。在实证研究中,出现这一结果的原因可能是,不同变量的数据来源不同,从而导致有些个体被重复观测。

. sum ID

    Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
          ID |     25,000    9890.821    5709.989          1      19757

. duplicates report ID

Duplicates in terms of ID

--------------------------------------
   copies | observations       surplus
----------+---------------------------
        1 |        15298             0
        2 |         7528          3764
        3 |         1836          1224
        4 |          312           234
        5 |           20            16
        6 |            6             5
--------------------------------------

此时,应当确定一个处理 x1x2 的规则以确保每一个唯一代码 (Unique ID) 都唯一对应一个观测值。处理 x1x2 的命令如下。

collapse (mean) mean_x1=x1 mean_x2=x2 (median) ///
               med_x1=x1 med_x2=x2, by(ID)

对于重复观测值,该命令运行后会生成新变量,保留每个 ID 重复观测值的平均值以及中位数。数据结构如下

. list in 1/10

     +----------------------------------------------------+
     | ID     mean_x1     mean_x2      med_x1      med_x2 |
     |----------------------------------------------------|
  1. |  1    .1792767    .7344462    .1792767    .7344462 |
  2. |  2    1.093224   -.1823799    1.093224   -.1823799 |
  3. |  3   -.3094974    2.653506   -.3094974    2.653506 |
  4. |  4    .4993488    .8985389    .4993488    .8985389 |
  5. |  5   -.7429997   -.0464208   -.7429997   -.0464208 |
     |----------------------------------------------------|
  6. |  6    .4437077   -.5161228    .4437077   -.5161228 |
  7. |  7   -.7664803     1.15589   -.7664803     1.15589 |
  8. |  8      .59837    .1051743      .59837    .1051743 |
  9. |  9    .9568613   -.7659643    .9568613   -.7659643 |
 10. | 10   -.8682789   -1.468759   -.8682789   -1.468759 |
     +----------------------------------------------------+

此外,处理后,可以发现数据中已经不存在重复观测值了。

. duplicates report ID

Duplicates in terms of ID
--------------------------------------
   copies | observations       surplus
----------+---------------------------
        1 |        19757             0
--------------------------------------

连享会计量方法专题……

相关课程

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

免费公开课:


课程一览

支持回看,所有课程可以随时购买观看。

专题 嘉宾 直播/回看视频
最新专题 DSGE, 因果推断, 空间计量等
Stata数据清洗 游万海 直播, 2 小时,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,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


作者:胡雨霄 (伦敦政治经济学院)

Stata 连享会: 知乎 | 简书 | 码云 | CSDN

Source: Three Ways to Create Unique Identifiers (Francis, 2012)

2020寒假Stata现场班 (北京, 1月8-17日,连玉君-江艇主讲),「+助教招聘」

2020寒假Stata现场班
2020寒假Stata现场班

假设要处理的数据包含 3 个代码变量,household_ID, city_ID, 以及 state_ID。这 3 个变量分别表示不同个体所在的家庭、城市以及州的代码。若将这 3 个代码变量视为一个组合,那么组合内不同的数字排列,则分别代表了不同的个体。

本推文将介绍如何在这种情况下,生成不同个体的唯一代码 (unique ID)。

1. 数据生成

首先设置 25,000 个观测值。

clear 
set obs 25000

假设变量 household_ID 的取值范围为 [1, 50],变量 city_ID 的取值范围为 [1, 20],变量 state_ID 的取值范围为 [1, 50]。

*随机生成
gen household_ID = ceil(runiform()*50)
gen city_ID = ceil(runiform()*20)
gen state_ID = ceil(runiform()*50)

此外,生成变量 x1 x2 ,模拟在实际数据中我们感兴趣的变量 (variables of interest)。

*随机生成
gen x1 = rnormal()
gen x2 = rnormal()

数据结构如下所示:

. list household_ID city_ID state_ID x1 x2 in 1/10

     +-------------------------------------------------------+
     | househ~D   city_ID   state_ID          x1          x2 |
     |-------------------------------------------------------|
  1. |       18        10         28    2.025588   -.1922264 |
  2. |       14        11          8    1.042631   -.0807038 |
  3. |        7        17         21    .2977124    .6150526 |
  4. |        2         4         28   -1.722132   -1.358765 |
  5. |       44         8         36   -.7291995    .0929139 |
     |-------------------------------------------------------|
  6. |       18        12         18    .8618261    .6687715 |
  7. |        4         4         29    -.239354    .6361541 |
  8. |       17        14          2     .516549   -.6399707 |
  9. |       28        15         19   -1.812016   -1.628398 |
 10. |       44         2         23   -1.015124   -.7855705 |
     +-------------------------------------------------------+

2. 创建唯一代码 (Unique ID) 的两种方式

2.1 用 egen 命令创建 Unique ID

创建 Unique ID 最简单的方法就是使用 egen 命令。

. egen ID = group(household_ID city_ID state_ID)
. list in 1/10

     +---------------------------------------+
     | househ~D   state_ID   city_ID      ID |
     |---------------------------------------|
  1. |       18         28        10    6890 |
  2. |       14          8        11    5296 |
  3. |        7         21        17    2724 |
  4. |        2         28         4     469 |
  5. |       44         36         8   17091 |
     |---------------------------------------|
  6. |       18         18        12    6925 |
  7. |        4         29         4    1253 |
  8. |       17          2        14    6553 |
  9. |       28         19        15   10945 |
 10. |       44         23         2   16966 |
     +---------------------------------------+

通过 egen 命令创建的 Unique ID 变量 ID 的排序方式与 sort household_ID city_ID state_ID 命令的排序方式相同,如下所示:

. sort household_ID city_ID state_ID \\排序
. list household_ID city_ID state_ID ID in 1/10

     +------------------------------------+
     | househ~D   city_ID   state_ID   ID |
     |------------------------------------|
  1. |        1         1          2    1 |
  2. |        1         1          5    2 |
  3. |        1         1          7    3 |
  4. |        1         1         10    4 |
  5. |        1         1         10    4 |
     |------------------------------------|
  6. |        1         1         11    5 |
  7. |        1         1         15    6 |
  8. |        1         1         15    6 |
  9. |        1         1         20    7 |
 10. |        1         1         21    8 |
     +------------------------------------+

2.2 创建字符型 Unique ID

另一种创建 Unique ID 变量的方式是创建一个字符 (string) 变量。虽然这种方式相对复杂,但所产生的 Unique ID 变量也更直接,容易识别。

具体命令如下:

. gen ID3 = "H" + string(household_ID,"%2.0f" ) + "C" + string(city_ID) + "S" + string(state_ID)
. list household_ID city_ID state_ID ID3 in 1/10

     +-------------------------------------------+
     | househ~D   city_ID   state_ID         ID3 |
     |-------------------------------------------|
  1. |       18        10         28   H18C10S28 |
  2. |       14        11          8    H14C11S8 |
  3. |        7        17         21    H7C17S21 |
  4. |        2         4         28     H2C4S28 |
  5. |       44         8         36    H44C8S36 |
     |-------------------------------------------|
  6. |       18        12         18   H18C12S18 |
  7. |        4         4         29     H4C4S29 |
  8. |       17        14          2    H17C14S2 |
  9. |       28        15         19   H28C15S19 |
 10. |       44         2         23    H44C2S23 |
     +-------------------------------------------+

3. 处理重复观测

由于数据中存在重复观测值,创建的唯一代码 (Unique ID) 其实也并不唯一。

当运行 sum ID 命令后,可以发现变量 ID 的最大取值为 19,757。这说明该样本一共包括 19,757 个不同的个体。duplicates report ID 的结果表明,在该数据集中,有 4,459 (19,757 - 15,298 = 4,459)个个体被重复观测了。在实证研究中,出现这一结果的原因可能是,不同变量的数据来源不同,从而导致有些个体被重复观测。

. sum ID

    Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
          ID |     25,000    9890.821    5709.989          1      19757

. duplicates report ID

Duplicates in terms of ID

--------------------------------------
   copies | observations       surplus
----------+---------------------------
        1 |        15298             0
        2 |         7528          3764
        3 |         1836          1224
        4 |          312           234
        5 |           20            16
        6 |            6             5
--------------------------------------

此时,应当确定一个处理 x1x2 的规则以确保每一个唯一代码 (Unique ID) 都唯一对应一个观测值。处理 x1x2 的命令如下。

collapse (mean) mean_x1=x1 mean_x2=x2 (median) ///
               med_x1=x1 med_x2=x2, by(ID)

对于重复观测值,该命令运行后会生成新变量,保留每个 ID 重复观测值的平均值以及中位数。数据结构如下

. list in 1/10

     +----------------------------------------------------+
     | ID     mean_x1     mean_x2      med_x1      med_x2 |
     |----------------------------------------------------|
  1. |  1    .1792767    .7344462    .1792767    .7344462 |
  2. |  2    1.093224   -.1823799    1.093224   -.1823799 |
  3. |  3   -.3094974    2.653506   -.3094974    2.653506 |
  4. |  4    .4993488    .8985389    .4993488    .8985389 |
  5. |  5   -.7429997   -.0464208   -.7429997   -.0464208 |
     |----------------------------------------------------|
  6. |  6    .4437077   -.5161228    .4437077   -.5161228 |
  7. |  7   -.7664803     1.15589   -.7664803     1.15589 |
  8. |  8      .59837    .1051743      .59837    .1051743 |
  9. |  9    .9568613   -.7659643    .9568613   -.7659643 |
 10. | 10   -.8682789   -1.468759   -.8682789   -1.468759 |
     +----------------------------------------------------+

此外,处理后,可以发现数据中已经不存在重复观测值了。

. duplicates report ID

Duplicates in terms of ID
--------------------------------------
   copies | observations       surplus
----------+---------------------------
        1 |        19757             0
--------------------------------------

连享会计量方法专题……

相关课程

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

免费公开课:


课程一览

支持回看,所有课程可以随时购买观看。

专题 嘉宾 直播/回看视频
最新专题 DSGE, 因果推断, 空间计量等
Stata数据清洗 游万海 直播, 2 小时,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,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