我在R和Python中看到过这样的问题(例如,NA只在"夹在中间"时填充)。通过使用dplyr相同的值),但无法找到如何在Stata中做到这一点的答案。
我想在面板数据集中填写缺失值,如果它是在2个相等的非缺失值之间。例如,如果我有
clear
input score group
2005 1
2006 .
2007 .
2008 .
2009 1
2010 8
2011 1
2012 .
2013 5
2014 3
2015 4
end
填入2006年、2007年、2008年的缺失观测值为1,不填入2012年的缺失观测值。缺失的值是分类的,而不是顺序的。
如果先验值和下一个值相等,我已经尝试用先验值填充,但这并不能解释在两个相等的非缺失值之间夹着超过1个缺失值的情况。
编辑:下面提供的解决方案在某些情况下有效,但在其他情况下却出乎意料地起作用(我改变了一些变量名称,使其更直观,并在一个块中包含两个示例)。假设我从
开始clear
input year group id
2005 1 1
2006 1 .
2007 1 .
2008 1 .
2009 1 .
2010 1 .
2011 1 1
2007 2 3
2008 2 .
2009 2 .
2010 2 2
2011 2 2
end
使用解决方案,有时我得到
clear
input year group id
2005 1 1
2006 1 .
2007 1 .
2008 1 .
2009 1 .
2010 1 .
2011 1 1
2007 2 3
2008 2 3
2009 2 3
2010 2 2
2011 2 2
end
对于第1组,非缺失部分在应该填充的时候没有填充。对于第2组,它们确实填充了,但不应该填充,因为三明治两端的非缺失值不相等。
这是一种方法。
-
插值或插补的一种方法是将最后一个已知值向前移动。Stata在https://www.stata.com/support/faqs/data-management/replacing-missing-values/
中对此进行了讨论 -
另一种方法是线性插值。线性插值将产生与方法1相同的答案,当且仅当插值是平坦的,使得插值值等于两端的已知值。
毫无疑问,你可以只是插入和检查常数,但我的猜测是,这将是尽可能多的代码在这里给出。
clear
input score group
2005 1
2006 .
2007 .
2008 .
2009 1
2010 8
2011 1
2012 .
2013 5
2014 3
2015 4
end
clonevar guess1 = group
replace guess1 = guess1[_n-1] if missing(guess1)
ipolate group score, gen(guess2)
gen goodguess = guess1 if guess1 == guess2
list, sepby(goodguess)
+--------------------------------------------+
| score group guess1 guess2 goodgu~s |
|--------------------------------------------|
1. | 2005 1 1 1 1 |
2. | 2006 . 1 1 1 |
3. | 2007 . 1 1 1 |
4. | 2008 . 1 1 1 |
5. | 2009 1 1 1 1 |
|--------------------------------------------|
6. | 2010 8 8 8 8 |
|--------------------------------------------|
7. | 2011 1 1 1 1 |
|--------------------------------------------|
8. | 2012 . 1 3 . |
|--------------------------------------------|
9. | 2013 5 5 5 5 |
|--------------------------------------------|
10. | 2014 3 3 3 3 |
|--------------------------------------------|
11. | 2015 4 4 4 4 |
+--------------------------------------------+
您暗示了面板数据而没有举例说明它,但是这个方法可以很容易地扩展到面板数据。根据需要使用by:
或by()
选项。
EDIT有关变量为绝对非序数的后期细节(意思是,名义非序数;即使不是大多数权威,也有很多人认为这是"普通的"。作为一种范畴;(参见Alan Agresti的文本)并不影响这里的解决方案。向下复制的方法永远不会暗示一个不同的类别。ipolate
处理数据,如果线性插值是有意义的;当它建议一个不可接受的替换值时,上述代码将不接受。
clear
input year group id
2005 1 1
2006 1 .
2007 1 .
2008 1 .
2009 1 .
2010 1 .
2011 1 1
2007 2 3
2008 2 .
2009 2 .
2010 2 2
2011 2 2
end
clonevar guess1 = id
bysort group (year) : replace guess1 = guess1[_n-1] if missing(guess1)
ipolate id year, gen(guess2) by(group)
gen goodguess = guess1 if guess1 == guess2
换句话说,最初的答案来自于所给出的观测值为year
顺序且不存在分组变量的例子;因此,每个不同的year
只有一个观察值。
当存在其他结构(例如面板或纵向数据)时,您需要其他代码来匹配它。