Stata:日期之间的差距

时间:2015-07-07 18:20:26

标签: stata

我有一种情况需要订购几个日期,看看是否存在差距。我的数据集如下所示,id是面板ID,startend是日期。

id start     end
a  01.01.15 02.01.15
a  02.01.15 03.01.15
b  05.01.15 06.01.15
b  07.01.15 08.01.15
b  06.01.15 07.01.15

我需要确定覆盖范围存在差距的任何情况,这意味着当start的第二个id日期大于相同ID的first结束日期时。还应该注意的是,相同的id可能具有未确定的观察数量,并且它们可能不是特定的顺序。我编写了下面的代码,用于每id只有两个观察的情况。

bys id: gen y=1 if end < start[_n+1]

但是,此代码不会产生预期的结果。我认为应该有另一种方法来解决这个问题。

1 个答案:

答案 0 :(得分:1)

假设您的日期变量确实是适当格式化的Stata每日日期变量,那么您的方法在本质上似乎是合理的。你根本不解释“不能产生预期结果”对你意味着什么。

下面的代码会创建一个类似于您的示例的沙箱,但字符串变量会转换为每日日期。

主要细节包括:

必须在面板内按日期对观察进行排序。

每个面板中最后一个观察结束后的观察结束日期将始终返回为缺失,并且大于任何已知日期。此处的代码将相应的指示符返回为缺失。

clear 
input str1 id str8 (s_start s_end) 
a  "01.01.15" "02.01.15"
a  "02.01.15" "03.01.15"
b  "05.01.15" "06.01.15"
b  "07.01.15" "08.01.15"
b  "06.01.15" "07.01.15"
b  "10.01.15" "12.01.15" 
end 

foreach v in start end { 
    gen `v' = daily(s_`v', "DMY", 2050) 
    format `v' %td 
}

// the important line here 
bysort id (start) : gen first = end < start[_n+1] if _n < _N 

list , sepby(id) 

     +----------------------------------------------------------+
     | id    s_start      s_end       start         end   first |
     |----------------------------------------------------------|
  1. |  a   01.01.15   02.01.15   01jan2015   02jan2015       0 |
  2. |  a   02.01.15   03.01.15   02jan2015   03jan2015       . |
     |----------------------------------------------------------|
  3. |  b   05.01.15   06.01.15   05jan2015   06jan2015       0 |
  4. |  b   06.01.15   07.01.15   06jan2015   07jan2015       0 |
  5. |  b   07.01.15   08.01.15   07jan2015   08jan2015       1 |
  6. |  b   10.01.15   12.01.15   10jan2015   12jan2015       . |
     +----------------------------------------------------------+