插值缺失值的特定咒语

时间:2018-11-08 13:23:26

标签: stata

我的数据类似于以下内容:

 id   year     var
10052 1980 2264758272
10052 1981 2434758400
10052 1982 2474758400
10052 1983 2484758272
10052 1984 2404758272
10052 1985 2344758272
10052 1986          .
10052 1987          .
10052 1988          .
10052 1989          .
10052 1990 2264758272
10052 1991 2374758400
10052 1992 2364758272
10052 1993 2334758400
10052 1995 2234758400
10052 1996          .
10052 1997          .
10052 1998          .
10052 1999          .
10052 2000          .
10052 2001          .
10052 2002 2174758400
10052 2003 1994758400
10067 1980          .
10067 1981          .

我想识别出连续缺失值的法术并对其进行插值 4年或更短的时间。

下面的代码改为插值所有缺少的值:

ipolate var year if missing(var)<=4 , generate(var1)

我如何在Stata中做到这一点?

2 个答案:

答案 0 :(得分:1)

使用示例数据:

clear

input id year var
10052 1980 2264758272
10052 1981 2434758400
10052 1982 2474758400
10052 1983 2484758272
10052 1984 2404758272
10052 1985 2344758272
10052 1986          .
10052 1987          .
10052 1988          .
10052 1989          .
10052 1990 2264758272
10052 1991 2374758400
10052 1992 2364758272
10052 1993 2334758400
10052 1995 2234758400
10052 1996          .
10052 1997          .
10052 1998          .
10052 1999          .
10052 2000          .
10052 2001          .
10052 2002 2174758400
10052 2003 1994758400
10067 1980          .
10067 1981          .
end

以下对我有用:

bysort id (year): generate idspell = sum(missing(var) != missing(var[_n-1]))
bysort id idspell (year): generate lenspell = _N

ipolate var year if !missing(var) | lenspell <= 4, generate(var1)

以上代码段的作用是首先识别每个咒语,然后计算其长度,然后在interpolate中使用它。

结果:

format %10.0f var var1
list, sepby(id)

     +-------------------------------------------------------------+
     |    id   year          var   idspell   lenspell         var1 |
     |-------------------------------------------------------------|
  1. | 10052   1980   2264758272         1          6   2264758272 |
  2. | 10052   1981   2434758400         1          6   2434758400 |
  3. | 10052   1982   2474758400         1          6   2474758400 |
  4. | 10052   1983   2484758272         1          6   2484758272 |
  5. | 10052   1984   2404758272         1          6   2404758272 |
  6. | 10052   1985   2344758272         1          6   2344758272 |
  7. | 10052   1986            .         2          4   2328758272 |
  8. | 10052   1987            .         2          4   2312758272 |
  9. | 10052   1988            .         2          4   2296758272 |
 10. | 10052   1989            .         2          4   2280758272 |
 11. | 10052   1990   2264758272         3          5   2264758272 |
 12. | 10052   1991   2374758400         3          5   2374758400 |
 13. | 10052   1992   2364758272         3          5   2364758272 |
 14. | 10052   1993   2334758400         3          5   2334758400 |
 15. | 10052   1995   2234758400         3          5   2234758400 |
 16. | 10052   1996            .         4          6            . |
 17. | 10052   1997            .         4          6            . |
 18. | 10052   1998            .         4          6            . |
 19. | 10052   1999            .         4          6            . |
 20. | 10052   2000            .         4          6            . |
 21. | 10052   2001            .         4          6            . |
 22. | 10052   2002   2174758400         5          2   2174758400 |
 23. | 10052   2003   1994758400         5          2   1994758400 |
     |-------------------------------------------------------------|
 24. | 10067   1980            .         0          2   2264758272 |
 25. | 10067   1981            .         0          2   2434758400 |
     +-------------------------------------------------------------+

编辑:

正如@NickCox指出的那样,大概应由id单独进行插值。

如果这是您想要的,则需要在bysort命令中添加interpolate前缀:

bysort id: ipolate var year if !missing(var) | lenspell <= 4, generate(var1)

答案 1 :(得分:1)

@Pearly Spencer已经很好地直接回答了所提出的问题,但是需要更多的信息才能使问题变得更好。这个答案的目的是扩展问题代码中的错误,并做注释中不能很好完成的事情,以标记相关的图形技术。

missing()返回1或0,具体取决于每次观察中其参数的值。您希望它在一个咒语中本地计数,但是距离它还有很长的路要走。

由于missing()返回1或0,因此其结果始终小于4,因此如您所知,指定条件排除任何观察值。还请注意,if missing(var)仅会选择缺少的值,而ipolate则一无所有。

顺便说一句,数据看起来很奇怪:例如以1000为模,只有两个值分别为400和272。否则,它们是20亿数量级的精确整数。这里可能有一些故事使插值更可疑,或者其他类型的插值更合适。 (内插比最简单的线性内插更重要。)

对于您的示例数据,只有一个标识符具有可用数据。在这里,我只是对该面板进行插值,而对时间间隔的长度没有限制。 (拒绝自己在更长的失踪咒语中插入值似乎是武断的。 只需绘制结果:有时它们会在更长的时间间隔内变得有意义。)

bysort id: ipolate var year, generate(wanted)  

scatter var year, msymbol(Oh) || scatter wanted year if missing(var), msymbol(+) /// 
ylabel(2e9 "2" 2.2e9 "2.2" 2.4e9 "2.4", angle(horizontal)) ///
legend(ring(0) col(1) position(7)) ytitle(whatever (billions)) 

enter image description here

从图中,我注意到:

  1. 1994年没有价值。

  2. 行为似乎很固定,变化很小,变化很大。插值将在平滑的渐变响应中最有效。