我有一个小组。每个ID都是一个人。
如果一个人的A状态从1变为0,则lose_A为1.
我只有ID,年,A,lost_A和A_upgrade。
我想制作长度和长度。
长度只是A的连续1的数量。
length2类似但只有一个区别:它在A_upgrade为1的年份之后回到1。
ID year A lose_A A_upgrade length length2
1 3 1 1 0 1 1
1 4 0 0 0 0 0
1 5 1 0 0 1 1
1 6 1 0 1 2 2
1 7 1 0 0 3 1
2 4 0 0 0 0 0
2 5 1 0 0 1 1
2 6 1 0 0 2 2
2 7 0 1 0 0 0
我做了
bysort ID (year): gen sumA=sum(A)
作为长度和长度的垫脚2。但我不知道下一步该做什么。
答案 0 :(得分:1)
感谢明确的问题和数据示例。
这里的主要想法是认为你的主变量的法术或运行为1.所以你将问题分为(1)为每种法术的开始创建标记和(2)在每个法术的内部向上计数拼写。
http://www.stata-journal.com/sjpdf.html?articlenum=dm0029
中有更多讨论 dm0029
和tsspell
(关于SSC的计划)是其他不可预测的搜索字词,可以在Statalist上找到许多相关的帖子。
clear
input ID year A lose_A A_upgrade length length2
1 3 1 1 0 1 1
1 4 0 0 0 0 0
1 5 1 0 0 1 1
1 6 1 0 1 2 2
1 7 1 0 0 3 1
2 4 0 0 0 0 0
2 5 1 0 0 1 1
2 6 1 0 0 2 2
2 7 0 1 0 0 0
end
* start of each spell is 1, others 0
bysort ID (year) : gen Length = A == 1 & (_n == 1 | A[_n-1] == 0)
* count 2, 3, ... within spells
by ID : replace Length = Length[_n-1] + 1 if A == 1 & Length == 0
* second variable is a twist on the first
bysort ID (year) : gen Length2 = A == 1 & (_n == 1 | A[_n-1] == 0 | A_upgrade[_n-1] == 1)
by ID : replace Length2 = Length2[_n-1] + 1 if A == 1 & Length2 == 0
list, sepby(ID)
+-------------------------------------------------------------------------+
| ID year A lose_A A_upgr~e length length2 Length Length2 |
|-------------------------------------------------------------------------|
1. | 1 3 1 1 0 1 1 1 1 |
2. | 1 4 0 0 0 0 0 0 0 |
3. | 1 5 1 0 0 1 1 1 1 |
4. | 1 6 1 0 1 2 2 2 2 |
5. | 1 7 1 0 0 3 1 3 1 |
|-------------------------------------------------------------------------|
6. | 2 4 0 0 0 0 0 0 0 |
7. | 2 5 1 0 0 1 1 1 1 |
8. | 2 6 1 0 0 2 2 2 2 |
9. | 2 7 0 1 0 0 0 0 0 |
+-------------------------------------------------------------------------+