Stata:当每个观测的值不同时,使用egen,anycount() [英] Stata: Using egen, anycount() when values vary for each observation
本文介绍了Stata:当每个观测的值不同时,使用egen,anycount()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的数据中的每一次观察都显示了一个遵循某种随机模式的玩家。变量move1
up表示每个玩家处于活动状态的动作。我需要计算每个玩家的活动次数:
_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 | +------------+------------+-------+-------+-------+-------+-------+-------+--------+
egen
与anycount()
组合不适用于此情况,因为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
}
推荐答案
您可以很容易地省去观测中的循环。此外,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()
的原件,这样我就可以说出为什么要写它了。)
附注:您的代码包含错误。
您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
}
这篇关于Stata:当每个观测的值不同时,使用egen,anycount()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文