【问题标题】:Drop all obs of group if condition is met如果满足条件,则删除组的所有 obs
【发布时间】:2016-03-27 20:38:07
【问题描述】:

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

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,然后进行级联替换,但我确信有更好的方法来做到这一点。

【问题讨论】:

    标签: panel subset stata


    【解决方案1】:

    一般来说,您可以通过检查每个面板中的第一个和最后一个观察值(在适当的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

    【讨论】:

    • 请注意,由于此代码使用missing(),因此它适用于任何数字变量,而不管缺失值编码如何,并且因为它还检查myvar[_N],所以它适用于字符串变量以及数字变量。优雅。
    • @WilliamLisowski 提出了很好的观点。未来的读者会注意到,与数字变量相比,字符串变量的排序方式相反:按升序排列,字符串缺失值 ("") 排在第一位。
    【解决方案2】:

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

    id myvar
    2 .
    2 1
    2 .
    

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

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

    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
    
    
    }
    

    【讨论】:

    • 老实说,我应该评论一下 Mino 的评论是不正确的,他的解决方案有点长,而对于大型数据集往往很慢。 Roberto 的代码与 bysort 命令的 myvar 类型(在括号内)一起正常工作。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 2023-02-15
      • 2017-09-27
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多