Stata 如何按组填写缺少的值?

Stata 如何按组填写缺少的值?,stata,missing-data,Stata,Missing Data,我有以下数据结构。在每组中,一些观察值缺少值。我知道每组只有一个非缺失值(在本例中,组1为10,组2为11)。缺失观测值的位置在组内是随机的(即不能用上一个/下一个值填充缺失值) 如何按组用一个非缺失值填充缺失值 group value 1 . 1 10 1 . 2 11 2 . 2 11 我目前的解决方案是循环,但我怀疑有一些聪明的bysort可以使用 levelsof group, local(lm_group) f

我有以下数据结构。在每组中,一些观察值缺少
。我知道每组只有一个非缺失值(在本例中,组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'
}

如果您知道组中的非缺失值是常量,那么您可以使用

 bysort group (value) : replace value = value[_n-1] if missing(value) 
因为缺少的值首先被排序到末尾,然后每个缺少的值被替换为以前的非缺少值。替换级联向下,但仅在每个组内

有关文档,请参阅

要检查每个组中最多有一个不同的非缺失值,可以执行以下操作:

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

更多个人信息。很高兴看到
levelsof
在使用,就像我第一次写的那样,但是上面的更好

我认为xfill命令正是您需要的

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

net from http://www.sealedenvelope.com/
在这之后,剩下的就很简单了:

xfill value, i(group)

您可以阅读有关xfill的信息,您要寻找的聪明的bysort答案是:

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

cond函数检查第一个参数是否为真,如果为和,则返回值。如果不是这样。

这会起作用,但编写
bysort group egen new_value=max(value)
会更简单,它在问题的条件下给出相同的结果(每组中最多有一个非缺失值)。如果您查看
egen
及其
max()
函数(在您的系统中将位于
\u gmax.ado
中)的代码内部,您将看到此解决方案要求用户键入一行代码(好),并使用Stata执行几十行代码(不太好)。我前面回答中的解决方案要求Stata执行一行代码。我前面的注释中缺少冒号。应该是排序组:等等。