在标题中,我试图找到等同于R complete.cases
函数的Stata。
我到目前为止最接近的是使用
generate sample = e(sample)
运行回归并删除案例或在此newl生成的变量上使用if
子句(解决方案从here被盗)。
有没有更好的解决方案?
答案 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
只会给我们一个TRUE
和FALSE
的向量,告诉我们每行代表一个完整的案例。
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)