我的数据集中的观察结果包含每个玩家的移动历史。我想计算游戏上半场和下半场中某些预定义长度(2、3 和超过 3 步)的连续系列动作的数量。序列不能重叠,即序列 1111 应被视为长度为 4 的序列,而不是 2 个长度为 2 的序列。也就是说,对于这样的观察:
+-------+-------+-------+-------+-------+-------+-------+-------+
| Move1 | Move2 | Move3 | Move4 | Move5 | Move6 | Move7 | Move8 |
+-------+-------+-------+-------+-------+-------+-------+-------+
| 1 | 1 | 1 | 1 | . | . | 1 | 1 |
+-------+-------+-------+-------+-------+-------+-------+-------+
…应生成以下变量:
Number of sequences of 2 in the first half =0
Number of sequences of 2 in the second half =1
Number of sequences of 3 in the first half =0
Number of sequences of 3 in the second half =0
Number of sequences of >3 in the first half =1
Number of sequences of >3 in the second half = 0
我有两种可能的选择来完成这项任务,但这些都没有导致最终的解决方案:
选项 1:详细说明 Nick 使用字符串的战术建议(Stata:变量中相同值的最大连续出现次数),我连接了所有“move*”变量并尝试识别子字符串的起始位置:
egen test1 = concat(move*) gen test2 = subinstr(test1,"11","X",.) // find all consecutive series of length 2
选项 1 有几个问题:(1)它没有考虑具有重叠序列的情况(“1111”被识别为 2 的 2 个序列)(2)它缩短了结果字符串 test2,因此 X 的位置不再对应如果我需要检查长度大于 3 的序列,test1 (3) 中的起始位置不考虑子字符串的可变长度。
选项 2:创建一个辅助变量集,以识别具有某些固定预定义长度的 1 的连续集(集)的起始位置。在前面的示例的基础上,为了计算长度为 2 的序列,我想要得到的是一组辅助变量,如果序列在给定移动开始时将等于 1,否则为零:
+-------+-------+-------+-------+-------+-------+-------+-------+
| Move1 | Move2 | Move3 | Move4 | Move5 | Move6 | Move7 | Move8 |
+-------+-------+-------+-------+-------+-------+-------+-------+
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
+-------+-------+-------+-------+-------+-------+-------+-------+
我的代码如下所示,但是当我尝试重新计算连续出现时它会中断:
quietly forval i = 1/42 {
gen temprow`i' =.
egen rowsum = rownonmiss(seq1-seq`i') //count number of occurrences
replace temprow`i'=rowsum
mvdecode seq1-seq`i',mv(1) if rowsum==2
drop rowsum
}
有谁知道解决任务的方法?