使用与另一个变量的匹配来填充一个变量的缺失值

时间:2016-04-28 09:37:38

标签: stata missing-data

想象一下以下的Stata数据结构:

input x y
1 3
1 .
1 .
2 3
2 .
2 .
. 3
end

我想使用对应的其他观察匹配来填充缺失的值。但是,如果存在歧义(在示例中,3对应于1和2),则代码不应复制。在我的示例中,最终的数据结构应如下所示:

1 3
1 3
1 3
2 3
2 3
2 3
. 3

请注意,1和2都被填充,因为它们是明确的3.

我的数据只是数字,变量xy的唯一值的数量很大,因此我正在寻找适用于所有情况的一般规则。

我正在考虑使用用户编写的命令carryforward,运行类似

的命令
bysort x: carryforward y if x != . , replace dynamic_condition(x[_n-1] == x[_n]) strict
bysort y: carryforward x if y != . , replace dynamic_condition(y[_n-1] == y[_n]) strict

然而,当有双重匹配时,这不起作用。

更新:Nick提出的解决方案并不适用于所有示例。我更新了示例以反映这一点。提议的解决方案不起作用的原因是因为函数tag仅在每个值的一个实例处放置1。因此,当值(3)与两个值(1,2)相关时,标签将仅出现在其中一个值中。因此,复制发生在一个。在上面的例子中,尼克的代码和结果是:

egen tagy = tag(y) if !missing(y) 
egen tagx = tag(x) if !missing(x) 
egen ny = total(tagy), by(x)
egen nx = total(tagx), by(y) 

bysort x (y) : replace y = y[1] if ny == 1 
bysort y (x) : replace x = x[1] if nx == 1 

list, sep(0)  

     +-------------------------------+
     | x   y   tagy   tagx   ny   nx |
     |-------------------------------|
  1. | 1   3      0      0    1    0 |
  2. | 1   3      0      0    1    0 |
  3. | 1   3      1      1    1    2 |
  4. | 2   3      0      1    0    2 |
  5. | .   3      0      0    0    2 |
  6. | 2   .      0      0    0    0 |
  7. | 2   .      0      0    0    0 |
     +-------------------------------+

如图所示,该代码适用于填充x=1而不填充y=3(第5行)。然而,它没有填充第6行和第7行,因为tagy=1只出现一次(x=1)。

2 个答案:

答案 0 :(得分:0)

这有点笨拙,但应该有效:

bysort x: egen temp=sd(x) if x!=.  
bysort x (y): replace y=y[1] if temp==0
drop temp

由于常数的标准偏差为零,如果非缺失的x都是相同的,则temp = 0。

答案 1 :(得分:0)

sort x, y
replace y = y[_n-1] if missing(y) & x[_n-1] == x[_n]