2013-08-31 37 views
1

變化在我的數據每個觀測提出誰遵循一些隨機模式的玩家。變量move1向上代表每個玩家在哪些動作中處於活動狀態。我需要統計每位玩家的活躍次數:塔塔:使用EGEN,anycount()值時,每個觀測

數據如下(其中_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 rowwise(見下文),但它保持count缺失(如初始化)並且效率不高(我有50,000個觀測值)。 Stata有沒有辦法做到這一點?

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

回答

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審查工作rowwise。

P.S.您的代碼包含錯誤。

您在所有意見中最後一個值計算在最後觀察計數replace您的計數變量。

值與當地的宏playerlist比較。你大概沒有這個名字的本地宏,所以宏被評估爲空。結果是,您通過將您的move*變量的每個值與觀察值進行比較來結束。您的意思是使用變量名稱playerlist,但單引號強制宏解釋。

根據記錄,這兩種修復的bug:

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