在stata中为面板数据中的剧集生成计数器变量

Generation of a counter variable for episodes in panel data in stata

我正在尝试生成一个计数器变量来描述面板数据中时间事件的持续时间。 我正在使用看起来像这样的长格式数据:

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 开始,并在 var1 仍然是每个 ID 的每个后续观察中计算一个单元等于 1。对于 var1!=1aim1 应包含缺失值的每个观察值。

我已经尝试使用 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 得到what you ask (b) 它的辅助变量(默认_spell_end)在很多问题中很有用,你必须先安装tsspell才能和ssc install tsspell一起使用。