偶然发现这个新包,想起以前都是自己撰写函数,进行缺失值分析
缺失值分析一般包括
通常情况下,我们使用summary函数或者is.na对缺失值进行查看,但是当数据量增大的时候,就显得有点费力了,在visdat
包中,有两个函数vis_dat和vis_miss用于可视化缺失查看
library(visdat)
vis_dat(airquality)
vis_dat提供整个数据框的缺失模式,但是如果当样本量几万的时候,这个图没啥意义
vis_miss(airquality)
vis_miss不仅提供缺失情况,还提供缺失的数量百分比,同样和上一个函数有同样的缺陷
##缺失变量关系
查看airquality中Solar.R和Ozone的缺失 通过ggplot对两个变量绘制散点图
library(ggplot2)
ggplot(airquality,
aes(x = Solar.R,
y = Ozone)) +
geom_point()
## Warning: Removed 42 rows containing missing values (geom_point)
.
对于ggplot它会warning缺失的变量的数量,并删除它们,我们虽然能够看到缺失的数量,但并不能具体看之间关系,因此需要使用其他的函数来完成这个探索geom_miss_point()
。原理是将缺失值替换为该变量最小值的10%
# 使用ggplot
ggplot(airquality,
aes(x = Solar.R,
y = Ozone)) +
geom_point()
# 使用geom_misss_point
library(naniar)
ggplot(airquality,
aes(x = Solar.R,
y = Ozone)) +
geom_miss_point()
gg_miss_var(airquality)
纵轴为变量,横轴为缺失比例
as_shadow函数能够从数据框中提取一个矩阵,用NA表示缺失!NA表示不缺失,这对于后续的分析有着重要的作用
as_shadow(airquality)
## # A tibble: 153 x 6
## Ozone_NA Solar.R_NA Wind_NA Temp_NA Month_NA Day_NA
## <fct> <fct> <fct> <fct> <fct> <fct>
## 1 !NA !NA !NA !NA !NA !NA
## 2 !NA !NA !NA !NA !NA !NA
## 3 !NA !NA !NA !NA !NA !NA
## 4 !NA !NA !NA !NA !NA !NA
## 5 NA NA !NA !NA !NA !NA
## 6 !NA NA !NA !NA !NA !NA
## 7 !NA !NA !NA !NA !NA !NA
## 8 !NA !NA !NA !NA !NA !NA
## 9 !NA !NA !NA !NA !NA !NA
## 10 NA !NA !NA !NA !NA !NA
## # ... with 143 more rows
bind_shadow和nabular可以将这个矩阵绑定在数据框中,称为nabular结构
# 这两种方式生成的内容是一样的
# 可以使用str()或者glimpse函数进行查看
aq_shadow <- bind_shadow(airquality)
aq_nab <- nabular(airquality)
有了上述的结构,可以分别对缺失和非缺失进行统计
library(tidyverse)
airquality %>%
bind_shadow() %>%
# 这里使用新生成的na变量进行分组统计
group_by(Ozone_NA) %>%
summarise_at(.vars = "Solar.R",
.funs = c("mean", "sd", "var", "min", "max"),
na.rm = TRUE)
## # A tibble: 2 x 6
## Ozone_NA mean sd var min max
## <fct> <dbl> <dbl> <dbl> <int> <int>
## 1 !NA 185. 91.2 8309. 7 334
## 2 NA 190. 87.7 7690. 31 332
# 同时可以使用这个矩阵绘制缺失
# 这里是指的随着温度的变化,臭氧缺失的变化
ggplot(aq_shadow,
aes(x = Temp,
colour = Ozone_NA)) +
geom_density()
# install.packages("simputation")
# 用于填补
library(simputation)
library(dplyr)
aq_shadow %>%
as.data.frame() %>%
# 使用线性填补
impute_lm(Ozone ~ Temp + Wind) %>%
ggplot(aes(x = Temp,
y = Ozone,
colour = Ozone_NA)) +
geom_point()
# 返回一个三列的tibble,分别为缺失行数、确实个数和确实比例
miss_case_summary(airquality)
## # A tibble: 153 x 3
## case n_miss pct_miss
## <int> <int> <dbl>
## 1 5 2 33.3
## 2 27 2 33.3
## 3 6 1 16.7
## 4 10 1 16.7
## 5 11 1 16.7
## 6 25 1 16.7
## 7 26 1 16.7
## 8 32 1 16.7
## 9 33 1 16.7
## 10 34 1 16.7
## # ... with 143 more rows
# 返回同样缺失模式的统计
miss_case_table(airquality)
## # A tibble: 3 x 3
## n_miss_in_case n_cases pct_cases
## <int> <int> <dbl>
## 1 0 111 72.5
## 2 1 40 26.1
## 3 2 2 1.31
# 查看变量缺失情况
prop_miss_var(airquality)
## [1] 0.3333333
# 对变量的统计
miss_var_summary(airquality)
## # A tibble: 6 x 3
## variable n_miss pct_miss
## <chr> <int> <dbl>
## 1 Ozone 37 24.2
## 2 Solar.R 7 4.58
## 3 Wind 0 0
## 4 Temp 0 0
## 5 Month 0 0
## 6 Day 0 0
# 同个案
miss_var_table(airquality)
## # A tibble: 3 x 3
## n_miss_in_var n_vars pct_vars
## <int> <int> <dbl>
## 1 0 4 66.7
## 2 7 1 16.7
## 3 37 1 16.7
使用group_by函数按照分组分别对一个变量进行缺失值分析
pedestrian %>%
group_by(month) %>%
miss_var_summary() %>%
filter(variable == "hourly_counts")
## # A tibble: 12 x 4
## # Groups: month [12]
## month variable n_miss pct_miss
## <ord> <chr> <int> <dbl>
## 1 January hourly_counts 0 0
## 2 February hourly_counts 0 0
## 3 March hourly_counts 0 0
## 4 April hourly_counts 552 19.2
## 5 May hourly_counts 72 2.42
## 6 June hourly_counts 0 0
## 7 July hourly_counts 0 0
## 8 August hourly_counts 408 13.7
## 9 September hourly_counts 0 0
## 10 October hourly_counts 412 7.44
## 11 November hourly_counts 888 30.8
## 12 December hourly_counts 216 7.26
airquality %>%
# 添加一列,用于描述这个行的缺失比例
add_prop_miss() %>%
head()
## Ozone Solar.R Wind Temp Month Day prop_miss_all
## 1 41 190 7.4 67 5 1 0.0000000
## 2 36 118 8.0 72 5 2 0.0000000
## 3 12 149 12.6 74 5 3 0.0000000
## 4 18 313 11.5 62 5 4 0.0000000
## 5 NA NA 14.3 56 5 5 0.3333333
## 6 28 NA 14.9 66 5 6 0.1666667
# 使用决策树查看哪个变量对缺失比例的影响大
library(rpart)
library(rpart.plot)
# 最终绘制一个决策树,发现月份对缺失的重要性较大
airquality %>%
add_prop_miss() %>%
rpart(prop_miss_all ~ ., data = .) %>%
prp(type = 4, extra = 101, prefix = "Prop. Miss = ")
naniar包是一个较新的包,记得去年我还是自己编码进行缺失值分析的,有些函数还是比较有用的,比如对变量和个案分别进行缺失值分析,这个包还在不断的完善中,未来会变得越来越好。
最后祝大家圣诞快乐,平平安安有人挂念。
love&peace