Stata 使用“与另一个变量匹配”填写一个变量缺少的值

Stata 使用“与另一个变量匹配”填写一个变量缺少的值,stata,missing-data,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 我的数据只是数字,变量x和y的唯一值的数量很大,因此我正在寻找一条适用于所有情况的通用规则 我正在考虑使用用户编写的命令carry

设想以下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

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

我正在考虑使用用户编写的命令
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)相关时,标签将仅出现在其中一个值中。因此,复制只发生一次。在上述示例中,Nick的代码和结果如下:

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

这有点笨重,但应该可以:

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

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

这有点笨拙,但它应该可以工作:

bysort x: egen temp=sd(x) if x!=.  
bysort x (y): replace y=y[1] if temp==0
drop temp
sort x, y
replace y = y[_n-1] if missing(y) & x[_n-1] == x[_n]
由于常数的标准偏差为零,如果未缺失的x都相同,则temp=0

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