问题描述
我正在尝试生成一个计数器变量,用于描述面板数据中时间事件的持续时间。 我使用的长格式数据如下所示:
clear
input byte id int time byte var1 int aim1
1 1 0 .
1 2 0 .
1 3 1 1
1 4 1 2
1 5 0 .
1 6 0 .
1 7 0 .
2 1 0 .
2 2 1 1
2 3 1 2
2 4 1 3
2 5 0 .
2 6 1 1
2 7 1 2
end
我想生成一个像 aim1
这样的变量,它在 var1==1
时以 1 的值开始,并且对每个 ID 的每个后续观察计数一个单位,其中 var1
仍然等于1. 对于每个观察,其中 var1!=1
、aim1
应包含缺失值。
我已经尝试使用 rangestat (count)
来解决问题,但是创建的变量不会在每集重新开始计数:
ssc install rangestat
gen var2=1 if var1==1
rangestat (count) aim2=var2,interval(time -7 0) by (id)
解决方法
这里有两种方法:(1) 从基本原理开始,但请参阅 this paper for more 和 (2) 使用来自 SSC 的 tsspell
。
clear
input byte id int time byte var1 int aim1
1 1 0 .
1 2 0 .
1 3 1 1
1 4 1 2
1 5 0 .
1 6 0 .
1 7 0 .
2 1 0 .
2 2 1 1
2 3 1 2
2 4 1 3
2 5 0 .
2 6 1 1
2 7 1 2
end
bysort id (time) : gen wanted = 1 if var1 == 1 & var1[_n-1] != 1
by id: replace wanted = wanted[_n-1] + 1 if var1 == 1 & missing(wanted)
tsset id time
ssc inst tsspell
tsspell,cond(var1 == 1)
list,sepby(id _spell)
+---------------------------------------------------------+
| id time var1 aim1 wanted _seq _spell _end |
|---------------------------------------------------------|
1. | 1 1 0 . . 0 0 0 |
2. | 1 2 0 . . 0 0 0 |
|---------------------------------------------------------|
3. | 1 3 1 1 1 1 1 0 |
4. | 1 4 1 2 2 2 1 1 |
|---------------------------------------------------------|
5. | 1 5 0 . . 0 0 0 |
6. | 1 6 0 . . 0 0 0 |
7. | 1 7 0 . . 0 0 0 |
|---------------------------------------------------------|
8. | 2 1 0 . . 0 0 0 |
|---------------------------------------------------------|
9. | 2 2 1 1 1 1 1 0 |
10. | 2 3 1 2 2 2 1 0 |
11. | 2 4 1 3 3 3 1 1 |
|---------------------------------------------------------|
12. | 2 5 0 . . 0 0 0 |
|---------------------------------------------------------|
13. | 2 6 1 1 1 1 2 0 |
14. | 2 7 1 2 2 2 2 1 |
+---------------------------------------------------------+
tsspell
的方法与您所要求的非常接近,除了 (a) 它的计数器(默认情况下 _seq
在失灵时为 0,但 replace _seq = . if _seq == 0
得到您所需要的ask (b) 它的辅助变量(默认情况下为 _spell
和 _end
)在很多问题中都很有用。您必须先安装 tsspell
,然后才能将其与 ssc install tsspell
一起使用。>