Stata 覆盖除最后 20 个非 NA 之外的横截面中的所有观察结果

Stata overwrite all observations in cross section except last 20 non NA

我在 Stata 中有一个很大的强不平衡面板,其中每个横截面只有几个观测值,其余为 NA (.)。

我想在每个横截面中覆盖不是最后 20 个非 NA 观察的所有非 NA 观察。我不确定如何正确指定范围,但您可以在下面看到我的想法。观察之间存在差距。

谢谢

*编辑

我删除了代码,因为它造成了不确定性。包含它是为了展示我的尝试。

我的横截面尺寸标识符是 xsection 我的时间维度标识符是id01

*编辑

我在下面创建了一个示例。代码需要提取变量 x 中每个横截面的最后 3 个非 NA (.) 值,并将这些值输入到新变量 z 中。或者,x 中的所有观测值都应设置为 。除了最后 3 个(允许间隙)。无论是创建新变量 z,还是替换 x 中的观察值使其看起来像 z.

id01    xsection      x             z
2005        1         20            .
2006        1         21            .
2007        1         22            . 
2008        1         23            23
2009        1         37            37
2010        1         38            38  
2011        1         .             .
2012        1         .             .
2005        2         24            .
2006        2         25            .
2007        2         21            .
2008        2         27            27
2009        2         33            33 
2010        2         .             .  
2011        2         37            37
2012        2         .             .

这个答案有点笨拙,但应该可以解决问题。如果 x 是您要将值替换为缺失值的变量,

by xsection: gen maxCount = _N
by xsection: gen counter = _n
gen dropVar = maxCount - counter
replace x = . if dropVar >= 20

我相当确定应该包括等号,但这很容易检查。

请注意,NA 是其他一些程序的行话,但不是 Stata 的本地行话。 Stata 称这些为 "missing values"。

如果您只是 (1) 将观察值与缺失值分开,然后立即 (2) 识别最后这么多具有​​非缺失值的观察值,然后在其他观察值(具有非缺失值的观察值)中进行排序。

. clear 

. input id01    xsection      x             z

          id01   xsection          x          z
  1. 2005        1         20            .
  2. 2006        1         21            .
  3. 2007        1         22            . 
  4. 2008        1         23            23
  5. 2009        1         37            37
  6. 2010        1         38            38  
  7. 2011        1         .             .
  8. 2012        1         .             .
  9. 2005        2         24            .
 10. 2006        2         25            .
 11. 2007        2         21            .
 12. 2008        2         27            27
 13. 2009        2         33            33 
 14. 2010        2         .             .  
 15. 2011        2         37            37
 16. 2012        2         .             .
 17. end 

. gen ismiss = missing(x) 

. bysort ismiss xsection (id01) : gen z_last = z if _N - _n < 3 
(10 missing values generated)

. sort id01 xsection 

. assert z_last == z 

这里 z 是按要求提供的, z_last 是计算出来的,是等价的。