R語言naniar包(新名詞:陰影矩陣;Shadow matrices)

  • 2020 年 2 月 11 日
  • 筆記

naniar提供了有條理,整潔的方式來匯總,可視化和處理丟失的數據,它的特性是:

  • 陰影矩陣(用於缺失數據)
    • bind_shadow() and nabular()
  • 統計缺失數據
    • n_miss() and n_complete()
    • pct_miss()and pct_complete()
  • 總結缺失數據
    • miss_var_summary() and miss_var_table()
    • miss_case_summary(), miss_case_table()
  • 缺失數據的可視化:
    • geom_miss_point()
    • gg_miss_var()
    • gg_miss_case()
    • gg_miss_fct()

安裝

  • CRAN:
install.packages("naniar")
  • github
# install.packages("remotes")  remotes::install_github("njtierney/naniar")

首先嘗試一下naniar

library(ggplot2)    ggplot(data = airquality,         aes(x = Ozone,             y = Solar.R)) +    geom_point()  #> Warning: Removed 42 rows containing missing values (geom_point).

因為ggplot2不能處理缺失值,所以我們得到了一個warning message ,我們可以使用geom_miss_point() 去展示缺失數據。

library(naniar)  ggplot(data = airquality,         aes(x = Ozone,             y = Solar.R)) +    geom_miss_point()

geom_miss_point() 已將缺失值移到比最小值低10%的位置。 缺失值是一種不同的顏色,因此缺失變得十分關注。 由於它是ggplot2幾何圖形,因此支援諸如構面和其他ggplot功能等功能。

p1 <-  ggplot(data = airquality,         aes(x = Ozone,             y = Solar.R)) +    geom_miss_point() +    facet_wrap(~Month, ncol = 2) +    theme(legend.position = "bottom")    p1

naniar提供了一種用於處理缺失數據的數據結構,即陰影矩陣。陰影矩陣與數據的維數相同,由數據值缺失的二進位指示符組成,其中缺失表示為「 NA」,而未缺失表示為「!NA」,變數名保持相同, 在變數中添加後綴「 _NA」。

head(airquality)  #>   Ozone Solar.R Wind Temp Month Day  #> 1    41     190  7.4   67     5   1  #> 2    36     118  8.0   72     5   2  #> 3    12     149 12.6   74     5   3  #> 4    18     313 11.5   62     5   4  #> 5    NA      NA 14.3   56     5   5  #> 6    28      NA 14.9   66     5   6    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

將陰影矩陣綁定到有助於您更好地跟蹤缺失值的數據。 這種格式稱為「 nabular」,是「 NA」和「 tabular」的組合。 您可以使用bind_shadownabular將陰影綁定到數據:

bind_shadow(airquality)  #> # A tibble: 153 x 12  #>    Ozone Solar.R  Wind  Temp Month   Day Ozone_NA Solar.R_NA Wind_NA Temp_NA  #>    <int>   <int> <dbl> <int> <int> <int> <fct>    <fct>      <fct>   <fct>  #>  1    41     190   7.4    67     5     1 !NA      !NA        !NA     !NA  #>  2    36     118   8      72     5     2 !NA      !NA        !NA     !NA  #>  3    12     149  12.6    74     5     3 !NA      !NA        !NA     !NA  #>  4    18     313  11.5    62     5     4 !NA      !NA        !NA     !NA  #>  5    NA      NA  14.3    56     5     5 NA       NA         !NA     !NA  #>  6    28      NA  14.9    66     5     6 !NA      NA         !NA     !NA  #>  7    23     299   8.6    65     5     7 !NA      !NA        !NA     !NA  #>  8    19      99  13.8    59     5     8 !NA      !NA        !NA     !NA  #>  9     8      19  20.1    61     5     9 !NA      !NA        !NA     !NA  #> 10    NA     194   8.6    69     5    10 NA       !NA        !NA     !NA  #> # … with 143 more rows, and 2 more variables: Month_NA <fct>, Day_NA <fct>  nabular(airquality)  #> # A tibble: 153 x 12  #>    Ozone Solar.R  Wind  Temp Month   Day Ozone_NA Solar.R_NA Wind_NA Temp_NA  #>    <int>   <int> <dbl> <int> <int> <int> <fct>    <fct>      <fct>   <fct>  #>  1    41     190   7.4    67     5     1 !NA      !NA        !NA     !NA  #>  2    36     118   8      72     5     2 !NA      !NA        !NA     !NA  #>  3    12     149  12.6    74     5     3 !NA      !NA        !NA     !NA  #>  4    18     313  11.5    62     5     4 !NA      !NA        !NA     !NA  #>  5    NA      NA  14.3    56     5     5 NA       NA         !NA     !NA  #>  6    28      NA  14.9    66     5     6 !NA      NA         !NA     !NA  #>  7    23     299   8.6    65     5     7 !NA      !NA        !NA     !NA  #>  8    19      99  13.8    59     5     8 !NA      !NA        !NA     !NA  #>  9     8      19  20.1    61     5     9 !NA      !NA        !NA     !NA  #> 10    NA     194   8.6    69     5    10 NA       !NA        !NA     !NA  #> # … with 143 more rows, and 2 more variables: Month_NA <fct>, Day_NA <fct>

可視化

airquality %>%    bind_shadow() %>%    ggplot(aes(x = Temp,               fill = Ozone_NA)) +    geom_density(alpha = 0.5)
airquality %>%    bind_shadow() %>%    simputation::impute_lm(Ozone ~ Temp + Solar.R) %>%    ggplot(aes(x = Solar.R,               y = Ozone,               colour = Ozone_NA)) +    geom_point()  #> Warning: Removed 7 rows containing missing values (geom_point).

執行upset圖

gg_miss_upset(airquality)

變數可視化

藉助tidyverse的工具,naniar在遵循易於閱讀的一致原則的同時做到了這一點,naniar還為每個變數提供了方便的可視化效果。

gg_miss_var(airquality)

給定變數在重複跨度中的缺失數

gg_miss_span(pedestrian,               var = hourly_counts,               span_every = 1500)

統計缺失和完整觀測值

naniar還提供了方便的助手來計算缺失和完整觀測值的數量,比例和百分比:

n_miss(airquality)  #> [1] 44  n_complete(airquality)  #> [1] 874  prop_miss(airquality)  #> [1] 0.04793028  prop_complete(airquality)  #> [1] 0.9520697  pct_miss(airquality)  #> [1] 4.793028  pct_complete(airquality)  #> [1] 95.20697

缺失數據的數值摘要

可以使用miss_var_summary()miss_case_summary()查看每種情況下的缺失數量和百分比以及變數,它們都返回按缺失值數量排序的輸出。

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_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

group_by()計算出每個變數在各個級別中缺失的數量。

library(dplyr)  #>  #> Attaching package: 'dplyr'  #> The following objects are masked from 'package:stats':  #>  #>     filter, lag  #> The following objects are masked from 'package:base':  #>  #>     intersect, setdiff, setequal, union  airquality %>%    group_by(Month) %>%    miss_var_summary()  #> # A tibble: 25 x 4  #> # Groups:   Month [5]  #>    Month variable n_miss pct_miss  #>    <int> <chr>     <int>    <dbl>  #>  1     5 Ozone         5     16.1  #>  2     5 Solar.R       4     12.9  #>  3     5 Wind          0      0  #>  4     5 Temp          0      0  #>  5     5 Day           0      0  #>  6     6 Ozone        21     70  #>  7     6 Solar.R       0      0  #>  8     6 Wind          0      0  #>  9     6 Temp          0      0  #> 10     6 Day           0      0  #> # … with 1