问题描述
我有一个这样的数据集:
ID dum1 dum2 dum3 var1
1 0 1 . hi
1 0 . 0 hi
2 1 . . bye
2 0 0 1 .
我尝试做的是,如果缺少观察结果,我希望根据相同的ID
填充信息。所以我的最终产品应该是这样的:
ID dum1 dum2 dum3 var1
1 0 1 0 hi
1 0 1 0 hi
2 1 0 1 bye
2 0 0 1 bye
有什么方法可以在R或Stata中完成此操作吗?
推荐答案
继续讨论STATA解决方案。由@Pear Spencer提供的解决方案从缺少值的观察中往后看和向前看,因此对于每组只有两个观察的示例来说很好,对于其他一些情况也可能很好。
另一种方法适当地使用来自SSC的社区贡献的命令mipolate
和stripolate
,也在https://www.statalist.org/forums/forum/general-stata-discussion/general/1308786-mipolate-now-available-from-ssc-new-program-for-interpolation
先举例,后评论:
clear
input ID dum1a dum2a dum3a str3 var1a
1 0 1 . "hi"
1 0 . 0 "hi"
2 1 . . "bye"
2 0 0 1 ""
2 0 1 . ""
end
gen long obsno = _n
foreach v of var dum*a {
quietly count if missing(`v')
if r(N) > 0 capture noisily mipolate `v' obsno, groupwise by(ID) generate(`v'_2)
}
foreach v of var var*a {
quietly count if missing(`v')
if r(N) > 0 capture noisily stripolate `v' obsno, groupwise by(ID) generate(`v'_2)
}
list
+----------------------------------------------------------------+
| ID dum1a dum2a dum3a var1a obsno dum3a_2 var1a_2 |
|----------------------------------------------------------------|
1. | 1 0 1 . hi 1 0 hi |
2. | 1 0 . 0 hi 2 0 hi |
3. | 2 1 . . bye 3 1 bye |
4. | 2 0 0 1 4 1 bye |
5. | 2 0 1 . 5 1 bye |
+----------------------------------------------------------------+
备注:
mipolate
和stripolate
的groupwise
选项使用规则:当且仅当该组中只有一个不同的非缺失值时,才用该组中的非缺失值替换该组中的缺失值。因此,如果一个组中的非缺失值都是1,或者都是42,或者是其他值,则插值使用1或42,或者是其他值。如果组中的非缺失值为0和1,则不进行。此处创建的变量
obsno
在该内插中不起作用,仅需要匹配mipolate
的常规语法。这里没有假设组只由两个观察组成或具有相同数量的观察。这些问题的一个共同领域是关于家庭的数据,只要某些变量只为某些家庭成员记录,但希望将记录的值传播给其他家庭成员。当然,在真实的数据中,家庭成员通常不止两个,家庭成员的数量会有所不同。
/li>这个问题暴露了
mipolate, groupwise
和stripolate, groupwise
中的一个小错误:如果没有要做的事情,它不会适当地退出,就像dum1a
中没有遗漏的值一样。在上面的代码中,当且仅当缺少的值被计入时,这是通过请求内插来捕获的。在未来的某个日期,错误将被修复,答案中的代码将相应简化,或者作为程序作者,我打算这样做。mipolate, groupwise
和stripolate, groupwise
如果组具有两个或多个不同的非缺失值,则mipolate, groupwise
和stripolate, groupwise
都会退出,并显示错误消息;然后不会对任何组执行内插,即使某些组没有问题。这就是代码capture noisily
的要点:上面没有回显dum2a
的错误消息。作为程序作者,我正在考虑增加一个选项,这样这样的组将被忽略,但插补将只针对具有一个不同的非缺失值的组进行。
这篇关于如何使用其他观测值R或STATA填写观测值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!