Stata:当每个观察值变化时,使用egen,anycount()

时间:2013-08-31 02:34:45

标签: stata

我的数据中的每个观察都呈现出一个遵循一些随机模式的玩家。变量move1向上表示每个玩家处于活动状态的移动。我需要计算每个玩家活跃的次数:

数据看起来如下(_count表示我想要生成的变量)。根据模拟,移动的数量也可能不同。

+------------+------------+-------+-------+-------+-------+-------+-------+--------+
| simulation | playerlist | move1 | move2 | move3 | move4 | move5 | move6 | _count |
+------------+------------+-------+-------+-------+-------+-------+-------+--------+
|          1 |          1 |     1 |     1 |     1 |     2 | .     | .     |      3 |
|          1 |          2 |     2 |     2 |     4 |     4 | .     | .     |      2 |
|          2 |          3 |     1 |     2 |     3 |     3 | 3     | 3     |      4 |
|          2 |          4 |     4 |     1 |     2 |     3 | 3     | 3     |      1 |
+------------+------------+-------+-------+-------+-------+-------+-------+--------+

egenanycount()结合使用不适用于此情况,因为value()选项的参数不是常量整数。

我已尝试循环浏览每个观察并使用egen行(见下文),但它使count保持缺失(初始化)并且效率不高(我有50,000次观察) 。有没有办法在Stata中做到这一点?

gen _count =.  
quietly forval i = 1/`=_N' {  
    egen temp = anycount(move*), values( `=`playerlist'[`i']')
    replace _count = temp
    drop temp
}

1 个答案:

答案 0 :(得分:3)

您可以轻松地删除观察循环。此外,egen仅用于方便,而不是速度。

gen _count = 0 
quietly forval j = 1/6 {  
    replace _count = _count + (move`j' == playerlist)
} 

gen _count = move1 == playerlist 
quietly forval j = 2/6 {  
    replace _count = _count + (move`j' == playerlist)
} 

即使您已决定使用egen,循环也只需要超过playerlist的不同值,而不是所有观察值。假设最大值是42

gen _count = 0 
quietly forval k = 1/42 { 
    egen temp = anycount(move*), value(`k') 
    replace _count = _count + temp  
    drop temp 
} 

但对于你的问题,这仍然是一个糟糕的方法。 (我写了anycount()的原文,所以我可以说为什么写的。)

另请参阅http://www.stata-journal.com/sjpdf.html?articlenum=pr0046以查看按行工作的内容。

P.S。您的代码包含错误。

根据最后观察中的计数的最后一个值,您在所有观察中replace计数变量。

将值与本地宏playerlist进行比较。您可能没有该名称的本地宏,因此宏被评估为空。结果是,您通过将move*变量的每个值与观察数进行比较来结束。您打算使用变量名playerlist,但单引号会强制进行宏解释。

对于记录,这修复了两个错误:

  gen _count = .  
  quietly forval i = 1/`=_N' {  
      egen temp = anycount(move*), values(`= playerlist[`i']')
      replace _count = temp in `i' 
      drop temp
  }