如标题所示,我试图找到与 Rcomplete.cases
函数等效的 Stata。
到目前为止我最接近的是使用
generate sample = e(sample)
在运行回归并删除案例或if
在这个新生成的变量上使用子句之后(从这里偷来的解决方案)。
有没有更好的解决方案?
我不确定您在 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
只是给我们一个TRUE
s 和FALSE
s 的向量,告诉我们每一行是否代表一个完整的案例。
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
我认为你说得对。我通常看到这实现了两种方式之一。
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)