有条件地创建新观察

时间:2018-09-07 11:07:05

标签: stata

我具有以下格式的数据(还有很多变量):

year    ID Dummy
1495    65  1
1496    65  1
1501    65  1
1502    65  1
1520    65  0
1522    65  0

我要达到的目标是有条件地创建新的观察值,该观察值以假人为条件在两个时间点之间填充数据。如果哑元等于1,则应填写数据。如果变量等于0,则不得填写。

例如:

year    ID Dummy
1495    65  1
1496    65  1
1497    65  1
1498    65  1
.
.
1501    65  1
1502    65  1
1503    65  1
1504    65  1
.
.
.
1520    65  0
1522    65  0

1 个答案:

答案 0 :(得分:1)

这是执行此操作的一种方法:

clear

input year id dummy 
1495    65  1
1496    65  1
1501    65  1
1502    65  1
1520    65  0
1522    65  0
end

generate tag = year[_n] != year[_n+1] & dummy == 1
generate delta = year[_n] - year[_n+1] if tag
replace delta = .  if abs(delta) == 1
expand abs(delta) if tag & delta != .
sort year

bysort year: egen seq = seq() if delta != .
replace seq = seq - 1 
replace seq = 0 if seq == .
replace year = year + seq if year != .

drop tag delta seq

上面的代码片段将产生:

list

     +-------------------+
     | year   id   dummy |
     |-------------------|
  1. | 1495   65       1 |
  2. | 1496   65       1 |
  3. | 1497   65       1 |
  4. | 1498   65       1 |
  5. | 1499   65       1 |
     |-------------------|
  6. | 1500   65       1 |
  7. | 1501   65       1 |
  8. | 1502   65       1 |
  9. | 1503   65       1 |
 10. | 1504   65       1 |
     |-------------------|
 11. | 1505   65       1 |
 12. | 1506   65       1 |
 13. | 1507   65       1 |
 14. | 1508   65       1 |
 15. | 1509   65       1 |
     |-------------------|
 16. | 1510   65       1 |
 17. | 1511   65       1 |
 18. | 1512   65       1 |
 19. | 1513   65       1 |
 20. | 1514   65       1 |
     |-------------------|
 21. | 1515   65       1 |
 22. | 1516   65       1 |
 23. | 1517   65       1 |
 24. | 1518   65       1 |
 25. | 1519   65       1 |
     |-------------------|
 26. | 1520   65       0 |
 27. | 1522   65       0 |
     +-------------------+