前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R海拾遗_naniar

R海拾遗_naniar

作者头像
火星娃统计
发布2021-01-12 10:29:02
8770
发布2021-01-12 10:29:02
举报
文章被收录于专栏:火星娃统计火星娃统计

缺失值处理包_naniar

sunqi
2020/12/25

概述

偶然发现这个新包,想起以前都是自己撰写函数,进行缺失值分析

缺失值分析一般包括

  • 缺失值查看
  • 缺失变量间关系
  • 缺失模式

查看缺失值

通常情况下,我们使用summary函数或者is.na对缺失值进行查看,但是当数据量增大的时候,就显得有点费力了,在visdat包中,有两个函数vis_dat和vis_miss用于可视化缺失查看

vis_dat

代码语言:javascript
复制
代码语言:javascript
复制
library(visdat)
vis_dat(airquality)
代码语言:javascript
复制

vis_dat提供整个数据框的缺失模式,但是如果当样本量几万的时候,这个图没啥意义

vis_miss

代码语言:javascript
复制
vis_miss(airquality)
代码语言:javascript
复制

vis_miss不仅提供缺失情况,还提供缺失的数量百分比,同样和上一个函数有同样的缺陷

##缺失变量关系

查看airquality中Solar.R和Ozone的缺失 通过ggplot对两个变量绘制散点图

代码语言:javascript
复制
代码语言:javascript
复制
library(ggplot2)
ggplot(airquality, 
       aes(x = Solar.R, 
           y = Ozone)) + 
  geom_point()
代码语言:javascript
复制

代码语言:javascript
复制
## Warning: Removed 42 rows containing missing values (geom_point)
代码语言:javascript
复制
.

对于ggplot它会warning缺失的变量的数量,并删除它们,我们虽然能够看到缺失的数量,但并不能具体看之间关系,因此需要使用其他的函数来完成这个探索geom_miss_point()。原理是将缺失值替换为该变量最小值的10%

geom_miss_point

代码语言:javascript
复制
# 使用ggplot
代码语言:javascript
复制
ggplot(airquality, 
       aes(x = Solar.R, 
           y = Ozone)) + 
  geom_point()
代码语言:javascript
复制

代码语言:javascript
复制
# 使用geom_misss_point
代码语言:javascript
复制
library(naniar)

ggplot(airquality, 
       aes(x = Solar.R, 
           y = Ozone)) + 
  geom_miss_point()
代码语言:javascript
复制

可视化缺失变量

代码语言:javascript
复制
gg_miss_var(airquality)
代码语言:javascript
复制

纵轴为变量,横轴为缺失比例

Tidy Missing Data: The Shadow Matrix

as_shadow函数能够从数据框中提取一个矩阵,用NA表示缺失!NA表示不缺失,这对于后续的分析有着重要的作用

代码语言:javascript
复制
代码语言:javascript
复制
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
代码语言:javascript
复制

bind_shadow和nabular可以将这个矩阵绑定在数据框中,称为nabular结构

代码语言:javascript
复制
代码语言:javascript
复制
# 这两种方式生成的内容是一样的
# 可以使用str()或者glimpse函数进行查看
aq_shadow <- bind_shadow(airquality)
aq_nab <- nabular(airquality)
代码语言:javascript
复制

有了上述的结构,可以分别对缺失和非缺失进行统计

代码语言:javascript
复制
代码语言:javascript
复制
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)
代码语言:javascript
复制

代码语言:javascript
复制
## # 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
代码语言:javascript
复制

代码语言:javascript
复制
# 同时可以使用这个矩阵绘制缺失
# 这里是指的随着温度的变化,臭氧缺失的变化
代码语言:javascript
复制
ggplot(aq_shadow,
       aes(x = Temp,
           colour = Ozone_NA)) + 
  geom_density()
代码语言:javascript
复制

可视化填补数据

代码语言:javascript
复制
代码语言:javascript
复制
# install.packages("simputation")
# 用于填补
library(simputation)
library(dplyr)
代码语言:javascript
复制
aq_shadow %>%
  as.data.frame() %>% 
  # 使用线性填补
  impute_lm(Ozone ~ Temp + Wind) %>%
  ggplot(aes(x = Temp,
             y = Ozone,
             colour = Ozone_NA)) + 
  geom_point()
代码语言:javascript
复制

数字化缺失查看函数】

对于个案的查看

  • n_miss 查看缺失值数量
  • n_complete 查看非缺失值数量
  • prop_miss_case 查看缺失比例
  • pct_miss_case 查看缺失百分比
  • miss_case_summary
代码语言:javascript
复制
代码语言:javascript
复制
# 返回一个三列的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
代码语言:javascript
复制

对于变量的查看

代码语言:javascript
复制
代码语言:javascript
复制
# 查看变量缺失情况
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
代码语言:javascript
复制

group_by

代码语言:javascript
复制
使用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

缺失建模

代码语言:javascript
复制
代码语言:javascript
复制
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 = ")
代码语言:javascript
复制

结束语

naniar包是一个较新的包,记得去年我还是自己编码进行缺失值分析的,有些函数还是比较有用的,比如对变量和个案分别进行缺失值分析,这个包还在不断的完善中,未来会变得越来越好。

最后祝大家圣诞快乐,平平安安有人挂念。

代码语言:javascript
复制
love&peace
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 火星娃统计 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 缺失值处理包_naniar
    • 概述
      • 查看缺失值
        • vis_dat
        • vis_miss
        • geom_miss_point
        • 可视化缺失变量
      • Tidy Missing Data: The Shadow Matrix
        • 可视化填补数据
          • 数字化缺失查看函数】
            • 对于个案的查看
            • 对于变量的查看
          • group_by
            • 缺失建模
              • 结束语
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档