查看原文
其他

Stata:产生数据唯一识别码的三种方式

Stata连享会 Stata连享会 2020-02-10

作者:胡雨霄 (伦敦政经)
Stata 连享会:知乎 | 简书 | 码云 | CSDN

2019暑期Stata现场班 (连玉君+刘瑞明主讲)

Source: Three Ways to Create Unique Identifiers (Francis, 2012)(http://www.econometricsbysimulation.com/2012/09/three-ways-to-create-unique-identifiers.html)

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

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

1. 数据生成

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

  1. clear

  2. set obs 25000

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

  1. *随机生成

  2. gen household_ID = ceil(runiform()*50)

  3. gen city_ID = ceil(runiform()*20)

  4. gen state_ID = ceil(runiform()*50)

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

  1. *随机生成

  2. gen x1 = rnormal()

  3. gen x2 = rnormal()

数据结构如下所示。

  1. . list household_ID city_ID state_ID x1 x2 in 1/10


  2. +-------------------------------------------------------+

  3. | househ~D city_ID state_ID x1 x2 |

  4. |-------------------------------------------------------|

  5. 1. | 18 10 28 2.025588 -.1922264 |

  6. 2. | 14 11 8 1.042631 -.0807038 |

  7. 3. | 7 17 21 .2977124 .6150526 |

  8. 4. | 2 4 28 -1.722132 -1.358765 |

  9. 5. | 44 8 36 -.7291995 .0929139 |

  10. |-------------------------------------------------------|

  11. 6. | 18 12 18 .8618261 .6687715 |

  12. 7. | 4 4 29 -.239354 .6361541 |

  13. 8. | 17 14 2 .516549 -.6399707 |

  14. 9. | 28 15 19 -1.812016 -1.628398 |

  15. 10. | 44 2 23 -1.015124 -.7855705 |

  16. +-------------------------------------------------------+

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

2.1 用 egen 命令创建 Unique ID

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

  1. . egen ID = group(household_ID city_ID state_ID)

  2. . list in 1/10


  3. +---------------------------------------+

  4. | househ~D state_ID city_ID ID |

  5. |---------------------------------------|

  6. 1. | 18 28 10 6890 |

  7. 2. | 14 8 11 5296 |

  8. 3. | 7 21 17 2724 |

  9. 4. | 2 28 4 469 |

  10. 5. | 44 36 8 17091 |

  11. |---------------------------------------|

  12. 6. | 18 18 12 6925 |

  13. 7. | 4 29 4 1253 |

  14. 8. | 17 2 14 6553 |

  15. 9. | 28 19 15 10945 |

  16. 10. | 44 23 2 16966 |

  17. +---------------------------------------+

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

  1. . sort household_ID city_ID state_ID \\排序

  2. . list household_ID city_ID state_ID ID in 1/10


  3. +------------------------------------+

  4. | househ~D city_ID state_ID ID |

  5. |------------------------------------|

  6. 1. | 1 1 2 1 |

  7. 2. | 1 1 5 2 |

  8. 3. | 1 1 7 3 |

  9. 4. | 1 1 10 4 |

  10. 5. | 1 1 10 4 |

  11. |------------------------------------|

  12. 6. | 1 1 11 5 |

  13. 7. | 1 1 15 6 |

  14. 8. | 1 1 15 6 |

  15. 9. | 1 1 20 7 |

  16. 10. | 1 1 21 8 |

  17. +------------------------------------+

2.2 创建字符型 Unique ID

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

具体命令如下。

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

  2. . list household_ID city_ID state_ID ID3 in 1/10


  3. +-------------------------------------------+

  4. | househ~D city_ID state_ID ID3 |

  5. |-------------------------------------------|

  6. 1. | 18 10 28 H18C10S28 |

  7. 2. | 14 11 8 H14C11S8 |

  8. 3. | 7 17 21 H7C17S21 |

  9. 4. | 2 4 28 H2C4S28 |

  10. 5. | 44 8 36 H44C8S36 |

  11. |-------------------------------------------|

  12. 6. | 18 12 18 H18C12S18 |

  13. 7. | 4 4 29 H4C4S29 |

  14. 8. | 17 14 2 H17C14S2 |

  15. 9. | 28 15 19 H28C15S19 |

  16. 10. | 44 2 23 H44C2S23 |

  17. +-------------------------------------------+

3. 处理重复观测

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

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

  1. . sum ID


  2. Variable | Obs Mean Std. Dev. Min Max

  3. -------------+---------------------------------------------------------

  4. ID | 25,000 9890.821 5709.989 1 19757


  5. . duplicates report ID


  6. Duplicates in terms of ID


  7. --------------------------------------

  8. copies | observations surplus

  9. ----------+---------------------------

  10. 1 | 15298 0

  11. 2 | 7528 3764

  12. 3 | 1836 1224

  13. 4 | 312 234

  14. 5 | 20 16

  15. 6 | 6 5

  16. --------------------------------------

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

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

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

  1. . list in 1/10


  2. +----------------------------------------------------+

  3. | ID mean_x1 mean_x2 med_x1 med_x2 |

  4. |----------------------------------------------------|

  5. 1. | 1 .1792767 .7344462 .1792767 .7344462 |

  6. 2. | 2 1.093224 -.1823799 1.093224 -.1823799 |

  7. 3. | 3 -.3094974 2.653506 -.3094974 2.653506 |

  8. 4. | 4 .4993488 .8985389 .4993488 .8985389 |

  9. 5. | 5 -.7429997 -.0464208 -.7429997 -.0464208 |

  10. |----------------------------------------------------|

  11. 6. | 6 .4437077 -.5161228 .4437077 -.5161228 |

  12. 7. | 7 -.7664803 1.15589 -.7664803 1.15589 |

  13. 8. | 8 .59837 .1051743 .59837 .1051743 |

  14. 9. | 9 .9568613 -.7659643 .9568613 -.7659643 |

  15. 10. | 10 -.8682789 -1.468759 -.8682789 -1.468759 |

  16. +----------------------------------------------------+

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

  1. . duplicates report ID


  2. Duplicates in terms of ID


  3. --------------------------------------

  4. copies | observations surplus

  5. ----------+---------------------------

  6. 1 | 19757 0

  7. --------------------------------------

关于我们

  • Stata 连享会(公众号:StataChina)】由中山大学连玉君老师团队创办,旨在定期与大家分享 Stata 应用的各种经验和技巧。

  • 公众号推文同步发布于 CSDN-Stata连享会 、简书-Stata连享会 和 知乎-连玉君Stata专栏。可以在上述网站中搜索关键词StataStata连享会后关注我们。

  • 点击推文底部【阅读原文】可以查看推文中的链接并下载相关资料。

  • Stata连享会 精彩推文1  || 精彩推文2

联系我们

  • 欢迎赐稿: 欢迎将您的文章或笔记投稿至Stata连享会(公众号: StataChina),我们会保留您的署名;录用稿件达五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。

  • 意见和资料: 欢迎您的宝贵意见,您也可以来信索取推文中提及的程序和数据。

  • 招募英才: 欢迎加入我们的团队,一起学习 Stata。合作编辑或撰写稿件五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。

  • 联系邮件: StataChina@163.com

往期精彩推文



欢迎加入Stata连享会(公众号: StataChina)

2019暑期“实证研究方法与经典论文”专题班

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存