1寫在前面
我們?cè)谔幚頂?shù)據(jù)的時(shí)候常常會(huì)遇到存在缺失值(NA
)的情況,如何處理就仁者見仁,智者見智了。??
最簡(jiǎn)單粗暴的方法可能就是行刪除法(listwise
)或者個(gè)案刪除法(case-wise
)了,這種方法在缺失值比較少的情況下比較適用,但在NA
較多的情況下可能就會(huì)丟失過多信息導(dǎo)致無法繼續(xù)分析。??
本期我們介紹一下mice包
和ggmice
包這兩只可愛的小老鼠,全名Multivariate Imputation by Chained Equations, mice
,即鏈?zhǔn)椒匠潭嘀靥钛a(bǔ)。??
一張圖總結(jié)基本原理,嘿嘿。??

2用到的包
rm(list = ls())
library(tidyverse)
library(mice)
library(ggmice)
3示例數(shù)據(jù)
這里我們使用一下示例數(shù)據(jù)airquality
,再在其中添加一些缺失值。
dat <- airquality
dat[4:9,3] <- rep(NA,6)
dat[1:4,4] <- NA

4數(shù)據(jù)概覽
4.1 缺失值查看
這里面我們一共有6個(gè)變量,其中4個(gè)存在缺失值。??
summary(dat)

4.2 缺失值可視化
Note! ggmice
提供了一種NA值
的可視化方法,一目了然,nice! ??
plot_pattern(dat,
square = F,
rotate = F)

4.3 influx-outflux plot
這里和大家簡(jiǎn)單介紹一下這個(gè)influx-outflux plot
,總的來說評(píng)估了缺失數(shù)據(jù)與其他變量的聯(lián)系程度。??
一般來說,在建模時(shí),influx
以及outflux
越大越好。??
plot_flux(dat,
label = F,
caption = F)

5可視化一下吧
5.1 連續(xù)變量
這里我們對(duì)連續(xù)變量的缺失值進(jìn)行一下可視化,可以看到紅色的為缺失值。??
ggmice(dat, aes(Ozone, Solar.R))
geom_point()

5.2 分類變量
接著我們對(duì)分類變量的缺失值進(jìn)行一下可視化,紅色的為缺失值。??
ggmice(dat, aes(Month, Solar.R))
geom_point()

5.3 分面展示
ggmice(dat, aes(Month, Solar.R))
geom_point()
facet_wrap(~ Month == 5,
# labeller = label_both
)

6mice包填補(bǔ)缺失值
6.1 填補(bǔ)缺失值
在這里我們生成幾個(gè)填補(bǔ)缺失值后的數(shù)據(jù),m
默認(rèn)是5
,為了減小計(jì)算量,這里我設(shè)置成3
。??
Note! 可選method
包括:??
? pmm
,
? logreg
,
? polyreg
,
? polr
imp <- mice(dat, m = 3, method = 'pmm')

6.2 連續(xù)變量缺失值填補(bǔ)后可視化
我們?cè)倏匆幌绿钛a(bǔ)缺失值后的散點(diǎn)圖吧,紅色的為缺失值填補(bǔ)后。??
ggmice(imp, aes(Ozone, Solar.R))
geom_point()

6.3 分類變量缺失值填補(bǔ)后可視化
ggmice(imp, aes(Month, Solar.R))
geom_point()

6.4 分面展示
ggmice(dat, aes(Month, Solar.R))
geom_point()
facet_wrap(~ Month == 5,
# labeller = label_both
)

7填補(bǔ)數(shù)據(jù)集的可視化
7.1 dotplot
我們之前設(shè)置了m = 3
,這里我們看一下3個(gè)
數(shù)據(jù)集的NA
填補(bǔ)情況。??
ggmice(imp, aes(x = .imp, y = Temp))
geom_jitter(height = 0, width = 0.25)
labs(x = 'Imputation number')

7.2 boxplot
ggmice(imp, aes(x = .imp, y = Temp))
geom_jitter(height = 0, width = 0.25)
geom_boxplot(width = 0.5, size = 1, alpha = 0.75, outlier.shape = NA)
labs(x = 'Imputation number')

8算法收斂
看來default = 5
是有原因的,哈哈哈哈哈哈!??
plot_trace(imp,
# 'Temp'
)

最后祝大家早日不卷!~
點(diǎn)個(gè)在看吧各位~ ?.???? ??? ?