在 r 中使用回归时如何计算使用和删除的观察值
how to count observations used and deleted when using a regression in r
我有一个正在使用的数据集,它有多个变量。其中一些变量的观测值是 NA。在 运行 回归之后,由于 NA,删除了一些观察结果。我使用以下代码对数据进行子集化:
jsubset= jtrain %>% select(2,11,23,24,28)
返回以下输出:
j子集
A tibble: 471 x 5
fcode d89 cgrant clemploy cgrant_1
<dbl> <dbl> <dbl> <dbl> <dbl>
1 410032 0 0 NA NA
2 410032 0 0 0.270 0
3 410032 1 0 -0.0630 0
4 410440 0 0 NA NA
5 410440 0 0 0.0800 0
6 410440 1 0 0.0741 0
7 410495 0 0 NA NA
8 410495 0 0 0.223 0
9 410495 1 0 -0.0408 0
10 410500 0 0 NA NA
... with 461 more rows
我如何区分对剩余列有值的 FCODES 和对某些列有值但没有 NA 的 FCODES?或者更容易计算回归中使用和删除的观察值?我知道 STATA 中的命令是 e(sample) ,它更容易做到这一点,但试图在 R 中复制。
按 NA 值排列
如果你有合适的数据框,应该是直截了当的。首先,我只是把你的数据复制到一个文本文件中,命名它,然后把它变成一个数据框:
slack <- read.table("slack.txt")
colnames(slack) <- c("fcode",
"d89",
"cgrant",
"clemploy",
"cgrant_1")
slack <- data.frame(slack)
然后只需排列值,这自然会重新排列您提到的 NA 值:
slack %>%
arrange(cgrant_1)
给你这个:
fcode d89 cgrant clemploy cgrant_1
1 3 410032 1 0 -0.0630
2 9 410495 1 0 -0.0408
3 6 410440 1 0 0.0741
4 5 410440 0 0 0.0800
5 8 410495 0 0 0.2230
6 2 410032 0 0 0.2700
7 1 410032 0 0 NA
8 4 410440 0 0 NA
9 7 410495 0 0 NA
10 10 410500 0 0 NA
删除 NA 值
如果您只想去掉 NA 值:
slack %>%
na.omit()
这给你:
fcode d89 cgrant cemploy cgrant_1
2 2 410032 0 0 0.2700
3 3 410032 1 0 -0.0630
5 5 410440 0 0 0.0800
6 6 410440 1 0 0.0741
8 8 410495 0 0 0.2230
9 9 410495 1 0 -0.0408
删除了 NA 值的子集数据
您还可以使用以下代码将该数据子集化为一个新的数据帧:
# NA Removed Dataframe:
no_na_slack <- slack %>%
na.omit()
# Is NA Dataframe:
is_na_slack <- slack %>%
filter_all(any_vars(is.na(.)))
对于这两种情况,您都可以使用 filter
和 if_any()
。抽样:
library(dplyr)
df <- read.csv(text="
fcode d89 cgrant clemploy cgrant_1
410032 0 0 NA NA
410032 0 0 0.270 0
410032 1 0 -0.0630 0
410440 0 0 NA NA
410440 0 0 0.0800 0
410440 1 0 0.0741 0
410495 0 0 NA NA
410495 0 0 0.223 0
410495 1 0 -0.0408 0
410500 0 0 NA NA", sep="")
df_no_na <- df %>%
filter(!if_any(everything(), is.na))
df_na <- df %>%
filter(if_any(everything(), is.na))
df_no_na:
fcode d89 cgrant clemploy cgrant_1
1 410032 0 0 0.2700 0
2 410032 1 0 -0.0630 0
3 410440 0 0 0.0800 0
4 410440 1 0 0.0741 0
5 410495 0 0 0.2230 0
6 410495 1 0 -0.0408 0
df_na:
fcode d89 cgrant clemploy cgrant_1
1 410032 0 0 NA NA
2 410440 0 0 NA NA
3 410495 0 0 NA NA
4 410500 0 0 NA NA
我有一个正在使用的数据集,它有多个变量。其中一些变量的观测值是 NA。在 运行 回归之后,由于 NA,删除了一些观察结果。我使用以下代码对数据进行子集化:
jsubset= jtrain %>% select(2,11,23,24,28)
返回以下输出: j子集
A tibble: 471 x 5
fcode d89 cgrant clemploy cgrant_1
<dbl> <dbl> <dbl> <dbl> <dbl>
1 410032 0 0 NA NA
2 410032 0 0 0.270 0
3 410032 1 0 -0.0630 0
4 410440 0 0 NA NA
5 410440 0 0 0.0800 0
6 410440 1 0 0.0741 0
7 410495 0 0 NA NA
8 410495 0 0 0.223 0
9 410495 1 0 -0.0408 0
10 410500 0 0 NA NA
... with 461 more rows
我如何区分对剩余列有值的 FCODES 和对某些列有值但没有 NA 的 FCODES?或者更容易计算回归中使用和删除的观察值?我知道 STATA 中的命令是 e(sample) ,它更容易做到这一点,但试图在 R 中复制。
按 NA 值排列
如果你有合适的数据框,应该是直截了当的。首先,我只是把你的数据复制到一个文本文件中,命名它,然后把它变成一个数据框:
slack <- read.table("slack.txt")
colnames(slack) <- c("fcode",
"d89",
"cgrant",
"clemploy",
"cgrant_1")
slack <- data.frame(slack)
然后只需排列值,这自然会重新排列您提到的 NA 值:
slack %>%
arrange(cgrant_1)
给你这个:
fcode d89 cgrant clemploy cgrant_1
1 3 410032 1 0 -0.0630
2 9 410495 1 0 -0.0408
3 6 410440 1 0 0.0741
4 5 410440 0 0 0.0800
5 8 410495 0 0 0.2230
6 2 410032 0 0 0.2700
7 1 410032 0 0 NA
8 4 410440 0 0 NA
9 7 410495 0 0 NA
10 10 410500 0 0 NA
删除 NA 值
如果您只想去掉 NA 值:
slack %>%
na.omit()
这给你:
fcode d89 cgrant cemploy cgrant_1
2 2 410032 0 0 0.2700
3 3 410032 1 0 -0.0630
5 5 410440 0 0 0.0800
6 6 410440 1 0 0.0741
8 8 410495 0 0 0.2230
9 9 410495 1 0 -0.0408
删除了 NA 值的子集数据
您还可以使用以下代码将该数据子集化为一个新的数据帧:
# NA Removed Dataframe:
no_na_slack <- slack %>%
na.omit()
# Is NA Dataframe:
is_na_slack <- slack %>%
filter_all(any_vars(is.na(.)))
对于这两种情况,您都可以使用 filter
和 if_any()
。抽样:
library(dplyr)
df <- read.csv(text="
fcode d89 cgrant clemploy cgrant_1
410032 0 0 NA NA
410032 0 0 0.270 0
410032 1 0 -0.0630 0
410440 0 0 NA NA
410440 0 0 0.0800 0
410440 1 0 0.0741 0
410495 0 0 NA NA
410495 0 0 0.223 0
410495 1 0 -0.0408 0
410500 0 0 NA NA", sep="")
df_no_na <- df %>%
filter(!if_any(everything(), is.na))
df_na <- df %>%
filter(if_any(everything(), is.na))
df_no_na:
fcode d89 cgrant clemploy cgrant_1
1 410032 0 0 0.2700 0
2 410032 1 0 -0.0630 0
3 410440 0 0 0.0800 0
4 410440 1 0 0.0741 0
5 410495 0 0 0.2230 0
6 410495 1 0 -0.0408 0
df_na:
fcode d89 cgrant clemploy cgrant_1
1 410032 0 0 NA NA
2 410440 0 0 NA NA
3 410495 0 0 NA NA
4 410500 0 0 NA NA