如何按群组填写缺失值?

时间:2015-12-02 20:53:03

标签: stata missing-data

我有以下数据结构。在每个组中,一些观察结果缺失value。我知道每个组只有一个非缺失值(组1的10和本例的组2的11)。缺失观察的位置在组内是随机的(即,不能用前一个/后一个值填充缺失值)。

如何使用组中的一个非缺失值填充缺失值?

group  value
1       .
1       10
1       .
2       11
2       .
2       11

我目前的解决方案是一个循环,但我怀疑我可以使用一些聪明的bysort

levelsof group, local(lm_group)
foreach group in `lm_group' {
    levelsof value if group == `group', local(lm_value)
    replace value = `lm_value' if group == `group'
}

3 个答案:

答案 0 :(得分:2)

如果您知道非缺失值在组内是不变的,那么您可以使用

来实现
 bysort group (value) : replace value = value[_n-1] if missing(value) 

因为缺失值首先被排序到最后,然后每个缺失值都是replace d之前的非缺失值。替换级联向下,但仅在每组内。

有关文档,请参阅this FAQ

要检查每个组中最多只有一个不同的非缺失值,您可以这样做:

bysort group (value) : assert (value == value[1]) | missing(value) 

更个人化的说明。很高兴看到levelsof正在使用中,正如我第一次写的那样,但上面的内容更好。

答案 1 :(得分:2)

我认为xfill命令就是你要找的。

要安装xfill,请将以下内容复制粘贴到Stata中,然后按照说明操作:

net from http://www.sealedenvelope.com/

之后,其余的很容易:

xfill value, i(group)

您可以阅读xfill here

答案 2 :(得分:0)

您正在寻找的聪明的bysort-answer是:

bysort group: egen new_value=max(cond(!missing(value), value, .)

cond函数检查第一个参数是否为true,如果为is和返回值。如果不是这样的话。