识别具有两个变量的组

Identify group with two variables

假设我在Stata中有如下数据:

clear 
input id tna ret str2 name
1 2 3 "X"
1 3 2 "X"
1 5 3 "X"
1 6 -1 "X"
2 4 2 "X"
2 6 -1 "X"
2 8 -2 "X"
2 9 3 "P"
2 11 -2 "P"
3 3 1 "Y"
3 4 0 "Y"
3 6 -1 "Y"
3 8 1 "Z"
3 6 1 "Z"
end

我想为新群组创建一个ID。这些新组应包含具有相同名称(例如 X)的观察结果,但如果名称以该 ID 开头,则还应包含相同 ID 的所有观察结果。例如:

  1. X 在两个 ID 下的数据集中:1 和 2。X 组应包含名称为 X 的所有观察值,还有名称 P 的两个观察值(因为 X 从 ID 2 开始,值 P 的两个观察值属于组 X

  2. Y 从 ID 3 开始,因此该小组应该合并 ID 3 的每个观察结果。

我不确定我是否理解这里的定义(例如 tnaret 没有解释;相反,如果它们不相关,请从问题中省略它们;"start"暗示一个时间过程?),但为什么不在每个 id 中复制 name 的第一个值,然后根据名字进行分类? (使用您的示例数据,结果是相同的。)

clear 
input id tna ret str2 name
1 2 3 "X"
1 3 2 "X"
1 5 3 "X"
1 6 -1 "X"
2 4 2 "X"
2 6 -1 "X"
2 8 -2 "X"
2 9 3 "P"
2 11 -2 "P"
3 3 1 "Y"
3 4 0 "Y"
3 6 -1 "Y"
3 8 1 "Z"
3 6 1 "Z"
end

sort id, stable 
by id: gen first = name[1] 
egen group = group(first), label 

list, sepby(group) 

     +---------------------------------------+
     | id   tna   ret   name   first   group |
     |---------------------------------------|
  1. |  1     2     3      X       X       X |
  2. |  1     3     2      X       X       X |
  3. |  1     5     3      X       X       X |
  4. |  1     6    -1      X       X       X |
  5. |  2     4     2      X       X       X |
  6. |  2     6    -1      X       X       X |
  7. |  2     8    -2      X       X       X |
  8. |  2     9     3      P       X       X |
  9. |  2    11    -2      P       X       X |
     |---------------------------------------|
 10. |  3     3     1      Y       Y       Y |
 11. |  3     4     0      Y       Y       Y |
 12. |  3     6    -1      Y       Y       Y |
 13. |  3     8     1      Z       Y       Y |
 14. |  3     6     1      Z       Y       Y |
     +---------------------------------------+

这是一个棘手的问题,因为它可能需要多次通过才能完全稳定标识符。幸运的是,您可以使用 group_id(来自 SSC)来解决这个问题。要安装 group_id,请输入 Stata 的命令 window:

ssc install group_id

这是一个更复杂的数据示例,其中 "P" 也出现在 ID == 4 中并且 ID 还包含 "A" 作为名称:

* Example generated by -dataex-. To install: ssc install dataex
clear
input float(id tna ret) str2 name
1  2  3 "X"
1  3  2 "X"
1  5  3 "X"
1  6 -1 "X"
2  4  2 "X"
2  6 -1 "X"
2  8 -2 "X"
2  9  3 "P"
2 11 -2 "P"
3  3  1 "Y"
3  4  0 "Y"
3  6 -1 "Y"
3  8  1 "Z"
3  6  1 "Z"
4  9  3 "P"
4 11 -2 "P"
4 12  0 "A"
end

clonevar newid = id
group_id newid, match(name)