1

我的数据集中的观察值是玩家,temp1如果玩家移动,二进制变量 up 等于 1,否则等于 0。我想计算每个玩家的最大连续移动次数。

+------------+------------+-------+--------+------- +-------+-------+--------+
| 模拟 | 播放列表 | 温度1 | 温度2 | 温度3 | 温度4 | 温度5 | 温度6 |
+------------+------------+-------+--------+------- +-------+-------+--------+
| 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 |
| 1 | 2 | 1 | 0 | 0 | 0 | 1 | 1 |
+------------+------------+-------+--------+------- +-------+-------+--------+

我的想法是在循环中生成辅助变量,这将计算连续重复,然后应用 egen,rowmax():

+------------+------------+------+------+------+-- -----+-----+------+------+
| 模拟 | 播放列表 | 辅助1 | 辅助2 | 辅助3 | 辅助4 | 辅助5 | 辅助6 | _最大 |
+------------+------------+------+------+------+-- -----+-----+------+------+
| 1 | 1 | 0 | 1 | 2 | 3 | 0 | 0 | 3 |
| 1 | 2 | 1 | 0 | 0 | 0 | 1 | 2 | 2 |
+------------+------------+------+------+------+-- -----+-----+------+------+

我正在努力引入一个局部计数器变量,如果连续移动,该变量将递增 1,否则将重置为零(下面的代码保持辅助变量固定..):

    quietly forval i = 1/42 { /*42 is max number of variables temp*/
    local j = 1 
    gen aux`i'=.    
    local j = `j'+1
    replace aux`i'= `j' if temp`i'!=0
} 
4

1 回答 1

5

战术答案

您可以将move*变量连接成一个字符串并查找最长的 1 子字符串。

egen history = concat(move*) 

gen max = 0 
quietly forval j = 1/6 { 
    replace max = `j' if strpos(history, substr("111111", 1, `j')) 
} 

如果数字远大于 6,请使用类似

 local lookfor : di _dup(42) "1" 
 quietly forval j = 1/42 { 
     replace max = `j' if strpos(history, substr("`lookfor'", 1, `j')) 
 } 

也比较http://www.stata-journal.com/article.html?article=dm0056

战略答案

就 Stata 而言,按行存储序列是违背粮食的。reshape long如果您和tsset您的数据作为面板数据,则可以使用更大的灵活性。请注意,此处使用的代码tsspell必须使用ssc inst tsspell.

tsspell专用于识别某些条件仍然成立的咒语或运行。这里的条件是变量为 1,并且由于唯一允许的其他值是 0,这相当于变量为正。tsspell创建三个变量,给出咒语标识符、咒语中的序列以及咒语是否结束。这里的最大拼写长度就是每局游戏的最大序列号。

. input simulation playerlist temp1 temp2 temp3 temp4 temp5 temp6 

 simulat~n  playerl~t      temp1      temp2      temp3      temp4      temp5      temp6
 1.   1   1  0  1  1  1  0  0 
 2.   1   2  1  0  0  0  1  1 
 3. end 

. reshape long temp , i(sim playerlist) j(seq) 
(note: j = 1 2 3 4 5 6)

 Data                               wide   ->   long
 -----------------------------------------------------------------------------
 Number of obs.                        2   ->      12
 Number of variables                   8   ->       4
 j variable (6 values)                     ->   seq
 xij variables:
                   temp1 temp2 ... temp6   ->   temp
 -----------------------------------------------------------------------------

. egen id = group(sim playerlist) 

. tsset id seq 
   panel variable:  id (strongly balanced)
    time variable:  seq, 1 to 6
            delta:  1 unit

. tsspell, p(temp) 

. egen max = max(_seq), by(id) 

. l

      +--------------------------------------------------------------------+
      | simula~n   player~t   seq   temp   id   _seq   _spell   _end   max |
      |--------------------------------------------------------------------|
   1. |        1          1     1      0    1      0        0      0     3 |
   2. |        1          1     2      1    1      1        1      0     3 |
   3. |        1          1     3      1    1      2        1      0     3 |
   4. |        1          1     4      1    1      3        1      1     3 |
   5. |        1          1     5      0    1      0        0      0     3 |
      |--------------------------------------------------------------------|
   6. |        1          1     6      0    1      0        0      0     3 |
   7. |        1          2     1      1    2      1        1      1     2 |
   8. |        1          2     2      0    2      0        0      0     2 |
   9. |        1          2     3      0    2      0        0      0     2 |
  10. |        1          2     4      0    2      0        0      0     2 |
      |--------------------------------------------------------------------|
  11. |        1          2     5      1    2      1        2      0     2 |
  12. |        1          2     6      1    2      2        2      1     2 |
      +--------------------------------------------------------------------+
于 2013-09-02T15:33:45.807 回答