如果满足条件则丢弃组中的所有 obs

Drop all obs of group if condition is met

假设我有以下面板数据(为简单起见未包括时间变量)

clear

input   id  var

        1   .      
        1   0      
        1   0      
        1   .     
        2   .     
        2   .     
        2   .     
        2   .     
        3   1    
        3   .     
        3   .
        3   0
end

我想删除所有组中所有缺失数据的组,也就是说,我希望我的数据是这样的:

        id  var

        1   .      
        1   0      
        1   0      
        1   .      
        3   1    
        3   .     
        3   .
        3   0

我试过 gen todrop = var[_N],但由于某些原因,它对某些团体不起作用。有什么想法吗?我考虑过 sorting id var,然后进行级联替换,但我确信有更好的方法来做到这一点。

一般来说,在适当 sorting 之后,您可以通过检查每个面板中的第一个和最后一个观察值来验证所有观察值是否具有相同的值。同样的原则也适用于此。我将使用 missing() 函数:

clear
set more off

input   id  myvar
        1   .      
        1   0      
        1   0      
        1   .     
        2   .     
        2   .     
        2   .     
        2   .     
        3   1    
        3   .     
        3   .
        3   0
end

bysort id (myvar) : gen todrop = missing(myvar[1]) & missing(myvar[_N])

list, sepby(id)

在这种情况下,只检查第一个也可以。如果它不见了,其他都是。

help by

罗伯托提供了一个解决方案,但该解决方案是针对具体情况的,可能会导致错误的结果。 事实上,假设您有如下观察:

id myvar
2 .
2 1
2 .

使用 Roberto 的代码,您将删除该组,而在问题中,仅当缺少 all 观察时才需要删除。

因此我建议您使用不同的方法,如下所示:

levels id, local(groups) // creates unique values for id (no need to egen if you don't really have to)

foreach iter of local groups {

    mdesc myvar if id == "`iter'" // use mdesc and put double quotes if id is a string
    drop if id == "`iter'" &  r(percent) == 100  // r(percent) is stored after mdesc


}

罗伯托的代码绝对有效。也做下面的代码。唯一的贡献是,如果您需要,可以保留观察的原始顺序(排序)。

egen todrop2 = min(missing(myvar)), by(id)