仅当"sandwiched"值相同时,填充缺失



我在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组,它们确实填充了,但不应该填充,因为三明治两端的非缺失值不相等。

这是一种方法。

  1. 插值或插补的一种方法是将最后一个已知值向前移动。Stata在https://www.stata.com/support/faqs/data-management/replacing-missing-values/

    中对此进行了讨论
  2. 另一种方法是线性插值。线性插值将产生与方法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只有一个观察值。

当存在其他结构(例如面板或纵向数据)时,您需要其他代码来匹配它。

相关内容

  • 没有找到相关文章

最新更新