Stata 使用“与另一个变量匹配”填写一个变量缺少的值
设想以下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
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]