我有一种情况需要订购几个日期,看看是否存在差距。我的数据集如下所示,id
是面板ID,start
和end
是日期。
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]
但是,此代码不会产生预期的结果。我认为应该有另一种方法来解决这个问题。
答案 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 . |
+----------------------------------------------------------+