如何回填数据

How to backfill data

我的数据类似于:

n   year    y
1   2000    
1   2000        
1   2001    
1   2002    6
1   2002    6
1   2003    9
2   2000    
2   2000    
2   2001        
2   2002    1
2   2002    9
2   2003    4
3   2000    
3   2001    
3   2002    3
3   2002    3
3   2003    5
3   2003    5
4   1999    
4   2000    
4   2001    
4   2002    
4   2002    4

如何用 2002 的 ~first~ 观察对应的 y 值填充 2002 之前所有 yeary 值=] - 并通过 n 完成此操作?

例如,对于n==2year==2002的第一个y值为1。因此,我想用 1 填写年份 2000 (2) 和 2001 (1) 的三个 y 值。新数据集将是:

n   year    y
1   2000    6
1   2000    6   
1   2001    6
1   2002    6
1   2002    6
1   2003    9
2   2000    1
2   2000    1
2   2001    1   
2   2002    1
2   2002    9
2   2003    4
3   2000    3
3   2001    3
3   2002    3
3   2002    3
3   2003    5
3   2003    5
4   1999    
4   2000    
4   2001    
4   2002    
4   2002    4

请注意,n==42002 之前的年份没有填写,因为 year==2002 的第一个观察结果为空白。

我认为解决方案可能是:

bysort n: gen temp = y[1] if year==2002
replace y = temp if year<2002
drop temp

但是我不确定第一行。

一个(可能不够优雅的)解决方案:

sort n year, stable // [1]
gen y2 = y
by n year: gen _y = y2[1] if year == 2002 // [2]
egen _y2 = max(_y), by(n) // [3]
replace y2 = _y2 if year < 2002 // [4]
drop _*

li, sepby(n) noobs

产量:

  +-------------------+
  | n   year   y   y2 |
  |-------------------|
  | 1   2000   .    6 |
  | 1   2000   .    6 |
  | 1   2001   .    6 |
  | 1   2002   6    6 |
  | 1   2002   6    6 |
  | 1   2003   9    9 |
  |-------------------|
  | 2   2000   .    1 |
  | 2   2000   .    1 |
  | 2   2001   .    1 |
  | 2   2002   1    1 |
  | 2   2002   9    9 |
  | 2   2003   4    4 |
  |-------------------|
  | 3   2000   .    3 |
  | 3   2001   .    3 |
  | 3   2002   3    3 |
  | 3   2002   3    3 |
  | 3   2003   5    5 |
  | 3   2003   5    5 |
  |-------------------|
  | 4   1999   .    . |
  | 4   2000   .    . |
  | 4   2001   .    . |
  | 4   2002   .    . |
  | 4   2002   4    4 |
  +-------------------+

备注:
[1] stable 选项保留 y.
的顺序 [2] 生成 _y 等于第一个观察值,其中仅 year == 2002。请注意,您需要 by n year 否则 y[1]n 组的第一个观察结果,即使 year != 2002 也是如此(但仅针对 year == 2002 的观察结果)。
[3] 在 n 组中填写 _y
[4] 替换 y2 早于 2002 年的年份。

mipolate来自SSC提供"backward"插值,如下:

. ssc inst mipolate 

. bysort n: mipolate y year, gen(y2) backward

. l

     +-------------------+
     | n   year   y   y2 |
     |-------------------|
  1. | 1   2000   .    6 |
  2. | 1   2000   .    6 |
  3. | 1   2001   .    6 |
  4. | 1   2002   6    6 |
  5. | 1   2002   6    6 |
     |-------------------|
  6. | 1   2003   9    9 |
  7. | 2   2000   .    5 |
  8. | 2   2000   .    5 |
  9. | 2   2001   .    5 |
 10. | 2   2002   1    5 |
     |-------------------|
 11. | 2   2002   9    5 |
 12. | 2   2003   4    4 |
 13. | 3   2000   .    3 |
 14. | 3   2001   .    3 |
 15. | 3   2002   3    3 |
     |-------------------|
 16. | 3   2002   3    3 |
 17. | 3   2003   5    5 |
 18. | 3   2003   5    5 |
 19. | 4   1999   .    4 |
 20. | 4   2000   .    4 |
     |-------------------|
 21. | 4   2001   .    4 |
 22. | 4   2002   .    4 |
 23. | 4   2002   4    4 |
     +-------------------+

我提到这个是因为对这个问题感兴趣的其他人可能会对它感兴趣。这里的一个关键是首先对同一标识符和年份的多个观测值进行平均,这不是您想要的。

您的问题的特定版本是 高度脆弱 因为不知何故您知道 several 的第一个值是要使用的值,但是您向我们展示的数据中没有任何内容标记哪个或者为什么。对 n year 上的数据进行排序,各种重复项中的哪一个排在第一位可能会发生变化!这对于数据管理来说是一种危险的情况。