在 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 的值开始,并且对每个 ID 的每个后续观察计数一个单位,其中 var1 仍然等于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 得到您所需要的ask (b) 它的辅助变量(默认情况下为 _spell_end)在很多问题中都很有用。您必须先安装 tsspell,然后才能将其与 ssc install tsspell 一起使用。>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...