【问题标题】:Stata equivalent to R's complete.cases function?Stata 相当于 R 的 complete.cases 函数?
【发布时间】:2012-10-31 13:26:55
【问题描述】:

如标题所示,我正在尝试找到与 R 的 complete.cases 函数等效的 Stata。

到目前为止我最接近的是使用

generate sample = e(sample)

在运行回归并删除案例或对这个新生成的变量使用if 子句之后(从here 窃取的解决方案)。

有没有更好的解决方案?

【问题讨论】:

    标签: stata


    【解决方案1】:

    我不确定您是否习惯于在 R 中使用 complete.cases,但这里有一个示例,其中包含 R 中的应用程序和等效的 Stata (rmiss2):

    首先,让我们在 R 中编一些数据进行演示。我们会将其保存为dta 文件,以便稍后在 Stata 中使用。

    library(foreign)
    set.seed(1)
    dat <- data.frame(one = rnorm(15),
                      two = sample(LETTERS, 15),
                      three = rnorm(15),
                      four = runif(15))
    dat <- data.frame(lapply(dat, function(x) { x[sample(15, 5)] <- NA; x }))
    write.dta(dat, file="completeCases.dta")
    

    数据如下:

    dat
    #           one  two       three      four
    # 1          NA    M  0.80418951 0.8921983
    # 2   0.1836433    O -0.05710677        NA
    # 3  -0.8356286    L  0.50360797 0.3899895
    # 4          NA    E          NA        NA
    # 5   0.3295078    S          NA 0.9606180
    # 6  -0.8204684 <NA> -1.28459935 0.4346595
    # 7   0.4874291 <NA>          NA        NA
    # 8   0.7383247    C -0.23570656 0.3999944
    # 9          NA    N -0.54288826 0.3253522
    # 10 -0.3053884 <NA>          NA 0.7570871
    # 11         NA    R -0.64947165 0.2026923
    # 12  0.3898432 <NA>          NA        NA
    # 13         NA    K  1.15191175        NA
    # 14 -2.2146999 <NA>  0.99216037 0.2454885
    # 15  1.1249309    Q -0.42951311 0.1433044
    

    在数据上运行complete.cases 只会给我们一个TRUEs 和FALSEs 的向量,告诉我们每一行是否代表一个完整的案例。

    complete.cases(dat)
    #  [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE 
    #  [9] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
    

    更多时候,complete.cases 可用于对我们的数据进行子集化,如下所示:

    dat[complete.cases(dat), ]
    #           one two      three      four
    # 3  -0.8356286   L  0.5036080 0.3899895
    # 8   0.7383247   C -0.2357066 0.3999944
    # 15  1.1249309   Q -0.4295131 0.1433044
    

    或者,在这里,仅根据前三列是否完整进行子集。

    dat[complete.cases(dat[, 1:3]), ]
    #           one two       three      four
    # 2   0.1836433   O -0.05710677        NA
    # 3  -0.8356286   L  0.50360797 0.3899895
    # 8   0.7383247   C -0.23570656 0.3999944
    # 15  1.1249309   Q -0.42951311 0.1433044
    

    现在,让我们切换到 Stata。

    首先,如果您还没有rmiss2,请安装它。

    . findit rmiss2
    

    其次,加载我们在 R 中创建的 dta 文件。

    . use "path\to\completeCases.dta", clear
    

    第三,我们将使用rmiss2 生成一个名为“nmis”的新列,告诉我们每种情况下缺少多少变量。

    . egen nmis = rmiss2(one two three four)
    . list
    
         +-----------------------------------------------+
         |       one   two       three       four   nmis |
         |-----------------------------------------------|
      1. |         .     M    .8041895   .8921983      1 |
      2. |  .1836433     O   -.0571068          .      1 |
      3. | -.8356286     L     .503608   .3899895      0 |
      4. |         .     E           .          .      3 |
      5. |  .3295078     S           .    .960618      1 |
         |-----------------------------------------------|
      6. | -.8204684     .   -1.284599   .4346595      1 |
      7. |  .4874291     .           .          .      3 |
      8. |  .7383247     C   -.2357066   .3999944      0 |
      9. |         .     N   -.5428883   .3253522      1 |
     10. | -.3053884     .           .   .7570871      2 |
         |-----------------------------------------------|
     11. |         .     R   -.6494716   .2026923      1 |
     12. |  .3898432     .           .          .      3 |
     13. |         .     K    1.151912          .      2 |
     14. |   -2.2147     .    .9921604   .2454885      1 |
     15. |  1.124931     Q   -.4295131   .1433044      0 |
         +-----------------------------------------------+
    

    最后,我们可以使用keep if... 删除缺少数据的案例。

    . keep if (nmis == 0)
    (12 observations deleted)
    
    . list
    
         +-----------------------------------------------+
         |       one   two       three       four   nmis |
         |-----------------------------------------------|
      1. | -.8356286     L     .503608   .3899895      0 |
      2. |  .7383247     C   -.2357066   .3999944      0 |
      3. |  1.124931     Q   -.4295131   .1433044      0 |
         +-----------------------------------------------+
    

    complete.cases 一样,您还可以指定要检查哪些列的完整性。

    . use "path\to\completeCases.dta", clear
    (Written by R.              )
    
    . egen nmis = rmiss2(one two three)
    
    . keep if (nmis == 0)
    (11 observations deleted)
    
    . list
    
         +-----------------------------------------------+
         |       one   two       three       four   nmis |
         |-----------------------------------------------|
      1. |  .1836433     O   -.0571068          .      0 |
      2. | -.8356286     L     .503608   .3899895      0 |
      3. |  .7383247     C   -.2357066   .3999944      0 |
      4. |  1.124931     Q   -.4295131   .1433044      0 |
         +-----------------------------------------------+
    

    更新

    应该注意keep if... 是“破坏性的”——如果不重新加载 dat 文件,您将无法返回原始数据集。因此,使用if 更安全,如下所示:

    . summarize one two three four if  nmis == 0
    
        Variable |       Obs        Mean    Std. Dev.       Min        Max
    -------------+--------------------------------------------------------
             one |         3    .3425423    1.038475  -.8356286   1.124931
             two |         3    6.666667    5.507571          1         12
           three |         3   -.0538706    .4924195  -.4295131    .503608
            four |         3    .3110961     .145398   .1433044   .3999944
    

    【讨论】:

    • 非常感谢!有用的东西 - 不知道 rmiss2 但现在将其添加到我的工具箱 =)
    • rmiss2 可以追溯到 1995 年,当时它的独特之处在于它计算了字符串变量和数字中的缺失值。但这在当时和现在都是无关紧要的,因为字符串变量不能包含在回归中。 egen 函数 rowmiss() 将跨行计数(观察、案例、记录),它还将计算字符串变量中的缺失值。因此,Ananda 的建议像往常一样奏效,因为看不到字符串变量。但是您不需要安装rmiss2,因为现有的egen 功能也一样。
    【解决方案2】:

    我认为你说得对。我通常会看到这实现了以下两种方式之一。

    regress y x1 x2
    marksample touse
    summarize y x1 x2 if `touse'
    

    或者完全绕过 tempvar touse

    regress y x1 x2
    summarize y x1 x2 if e(sample)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多