3

如标题所示,我试图找到与 Rcomplete.cases函数等效的 Stata。

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

generate sample = e(sample)

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

有没有更好的解决方案?

4

2 回答 2

3

我不确定您在 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
于 2012-10-31T18:59:27.693 回答
1

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

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)
于 2012-10-31T17:06:32.627 回答