Stata相当于R的complete.cases函数?

时间:2012-10-31 13:26:56

标签: stata

在标题中,我试图找到等同于R complete.cases函数的Stata。

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

generate sample = e(sample)

运行回归并删除案例或在此newl生成的变量上使用if子句(解决方案从here被盗)。

有没有更好的解决方案?

2 个答案:

答案 0 :(得分: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只会给我们一个TRUEFALSE的向量,告诉我们每行代表一个完整的案例。

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

答案 1 :(得分: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)