Stata:按组分别识别所有变量不同的独特观察结果

时间:2013-08-20 16:06:13

标签: stata

我的Stata数据集包含对模拟中不同玩家创建的产品的构成组件的观察。 我想只保留由不同且独特的组件组成的产品(由每个参与者创建),即 识别所有变量不同的观察结果(通过player_id)。

数据是:

  
    
 +---------+-----------+------------+------------+------------+
| Product | Player id | Component1 | Component2 | Component3 |
+---------+-----------+------------+------------+------------+
|       1 |         1 |          1 |          2 |          3 |
|       2 |         1 |          1 |          5 |          9 |
|       3 |         1 |          7 |          8 |          9 |
|       4 |         2 |          4 |          5 |          6 |
|       5 |         2 |          4 |          5 |          9 |
|       6 |         2 |          7 |          8 |          9 |
+---------+-----------+------------+------------+------------+ 
    
  

理想的结果应该让我有以下结果:

  
    
      
 +---------+-----------+------------+------------+------------+
| Product | Player id | Component1 | Component2 | Component3 |
+---------+-----------+------------+------------+------------+
|       1 |         1 |          1 |          2 |          3 |
|       3 |         1 |          7 |          8 |          9 |
|       4 |         2 |          4 |          5 |          6 |
|       6 |         2 |          7 |          8 |          9 |
+---------+-----------+------------+------------+------------+
      
    
  

可以看出,产品2应该被移除,因为它与产品1具有共同的组件1,与产品3具有共同的组件3;类似的产品5应该被除去,因为它与产品4共享组分1和2,与产品6共享组分3。

应保留剩余的产品(由玩家),因为它们使用不同的非重叠组件。

1 个答案:

答案 0 :(得分:2)

对于每个不同播放器的每个组件组合都是全新的,所有组件首次出现在该播放器上是必要且充分的。因此,我们会跟踪每个组件的第一次出现,并删除所有后续出现的组件的观察结果。

相同的玩具数据(但有一些较短的变量名称):

input Product Player_id C1 C2 C3 
   1          1           1           2           3 
   2          1           1           5           9 
   3          1           7           8           9 
   4          2           4           5           6 
   5          2           4           5           9 
   6          2           7           8           9 
end 

目前尚不清楚Product是否扮演与观察数相同的角色:无论如何,我们都可以创建一个持有观察数的变量。

gen long obs = _n 

现在我们将循环遍历组件,其中9个在此示例中。

qui forval i = 1/9 { 

对于每个组件:如果它是三个组件中的任何一个,则会发现它。这是一个指标变量,如果为真则为1,如果为假则为0:

    gen found = C1 == `i' | C2 == `i' | C3 == `i' 

有一个很好的选择:

    gen found = inlist(`i', C1, C2, C3) 

我们希望跟踪第一次出现,即found为真时的最小观察数,我们分别按Player_id进行。如果obs为1,则指示符变量在此处的除法产生found,否则将丢失。除非所有值都返回为缺失值,否则egen会忽略缺失。

    egen first = min(obs / found), by(Player_id) 

现在我们所做的是drop次出现,如果它们不是第一次出现,drop是我们的会计变量,所以下次循环时可以重新创建它们:

    drop if obs > first & found
    drop first found 
} 

结果如下:

      +-----------------------------------------+
      | Product   Player~d   C1   C2   C3   obs |
      |-----------------------------------------|
   1. |       1          1    1    2    3     1 |
   2. |       3          1    7    8    9     3 |
   3. |       4          2    4    5    6     4 |
   4. |       6          2    7    8    9     6 |
      +-----------------------------------------+

请注意,此算法对观察的顺序很敏感。如果您从1 5 9开始,那么1 2 37 8 9都不可接受。与4 5 9类似; 4 5 67 8 9不会削减。