R語言naniar包(新名詞:陰影矩陣;Shadow matrices)
- 2020 年 2 月 11 日
- 筆記

naniar提供了有條理,整潔的方式來匯總,可視化和處理丟失的數據,它的特性是:
- 陰影矩陣(用於缺失數據)
-
bind_shadow()
andnabular()
-
- 統計缺失數據
-
n_miss()
andn_complete()
-
pct_miss()
andpct_complete()
-
- 總結缺失數據
-
miss_var_summary()
andmiss_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_shadow
或nabular
將陰影綁定到數據:
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