【发布时间】:2012-10-31 13:26:55
【问题描述】:
如标题所示,我正在尝试找到与 R 的 complete.cases 函数等效的 Stata。
到目前为止我最接近的是使用
generate sample = e(sample)
在运行回归并删除案例或对这个新生成的变量使用if 子句之后(从here 窃取的解决方案)。
有没有更好的解决方案?
【问题讨论】:
标签: stata
如标题所示,我正在尝试找到与 R 的 complete.cases 函数等效的 Stata。
到目前为止我最接近的是使用
generate sample = e(sample)
在运行回归并删除案例或对这个新生成的变量使用if 子句之后(从here 窃取的解决方案)。
有没有更好的解决方案?
【问题讨论】:
标签: stata
我不确定您是否习惯于在 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 功能也一样。
我认为你说得对。我通常会看到这实现了以下两种方式之一。
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)
【讨论】: