私のデータセットの観察には、各プレーヤーの動きの履歴が含まれています。ゲームの前半と後半で、事前に定義された長さ (2、3、および 3 つ以上) の連続した一連の動きの数を数えたいと思います。シーケンスはオーバーラップできません。つまり、シーケンス 1111 は、長さ 2 の 2 つのシーケンスではなく、長さ 4 のシーケンスと見なされます。つまり、次のような観測の場合:
+-------+-------+-------+-------+-------+-------+-------+-------+
| 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
このタスクを進める方法について 2 つの選択肢がありますが、どちらも最終的な解決にはつながりません。
オプション 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 の位置がもはや対応しないようにします。 test1 の開始位置 (3) 3 を超える長さのシーケンスをチェックする必要がある場合、部分文字列の可変長は考慮されません。
オプション 2: 変数の補助セットを作成して、事前定義された固定長の 1 の連続セット (セット) の開始位置を識別します。前の例に基づいて、長さ 2 のシーケンスをカウントするために、取得しようとしているのは、一連のシーケンスが特定の動きで開始された場合は 1 になり、それ以外の場合は 0 になる変数の補助セットです。
+-------+-------+-------+-------+-------+-------+-------+-------+
| 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
}
誰かがタスクを解決する方法を知っていますか?