我的数据类似于以下内容:
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中做到这一点?
答案 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))
从图中,我注意到:
1994年没有价值。
行为似乎很固定,变化很小,变化很大。插值将在平滑的渐变响应中最有效。