2013-09-02 3 views
1

Наблюдения в моем наборе данных являются игроками, а двоичные переменные temp1 up равны 1, если игрок совершил движение и равен нулю в противном случае. Я хотел бы рассчитать максимальное количество последовательных ходов на игрока.Stata: Максимальное количество последовательных вхождений одного и того же значения по переменным

+------------+------------+-------+-------+-------+-------+-------+-------+ 
| simulation | playerlist | temp1 | temp2 | temp3 | temp4 | temp5 | temp6 | 
+------------+------------+-------+-------+-------+-------+-------+-------+ 
|   1 |   1 |  0 |  1 |  1 |  1 |  0 |  0 | 
|   1 |   2 |  1 |  0 |  0 |  0 |  1 |  1 | 
+------------+------------+-------+-------+-------+-------+-------+-------+

Моя идея состояла в том, чтобы генерировать вспомогательные переменные в цикле, который будет рассчитывать последовательные дубликаты, а затем применить Egen, rowmax():

+------------+------------+------+------+------+------+------+------+------+ 
| simulation | playerlist | aux1 | aux2 | aux3 | aux4 | aux5 | aux6 | _max | 
+------------+------------+------+------+------+------+------+------+------+ 
|   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 
} 

ответ

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 с использованием 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 | 
     +--------------------------------------------------------------------+ 
Смежные вопросы