1. Kiểm tra cơ chế khuyết

1.1. Sử dụng hàm có sẵn

library(visdat)
library(naniar)
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
library(tidyr)
library(mice)
## 
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
## 
##     filter
## The following objects are masked from 'package:base':
## 
##     cbind, rbind


Thực hành data attenu (data có sẵn trong R)

head(attenu)


Vì có sẵn trong R, có thể dùng help() để hiểu hơn và dataset này

help(attenu)


Kiểm tra dataset có bị khuyết hay không?

anyNA(attenu)
## [1] TRUE


Tính số ô bị khuyết trên từng cột, thấy được dataset này chỉ bị khuyết trên cột station

colSums(is.na(attenu))
##   event     mag station    dist   accel 
##       0       0      16       0       0


Đếm số quan sát bị khuyết có trong dataset

sum(!complete.cases(attenu))
## [1] 16

1.2. Package visdat

Xem được tổng quan về dataset:

  • Thông tin các cột, kiểu dữ liệu từng cột

  • Phân bố của giá trị khuyết trên dataset

vis_dat(attenu)


1.3. Little’s Test

  • H0: dataset có cơ chế khuyết theo MCAR

  • H1: không phải MCAR

So sánh p.value với mức ý nghĩa (alpha) đề ra:

  • 10%

  • 5%

  • 1%

p.value < alpha -> bác bỏ H0

p.value > alpha -> chưa có cơ sở bác bỏ H0

Kết luận: vì p-value = 0.0004953635 nên bác bỏ H0 hay dataset này không theo cơ chế MCAR

mcar_test(attenu) # naniar


2. Xử lý giá trị khuyết

2.1. Xoá giá trị khuyết

Sử dụng dataset airquality về thông tin chất lượng không khí theo ngày, thấy được bị khuyết tại cột Ozone và Solar.R

colSums(is.na(airquality))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##      37       7       0       0       0       0


2.1.1. Xoá theo cột

Trường hợp cột bị khuyết rất nặng, không thể xử lý

head(select(airquality, -Ozone))


2.1.2. Xoá theo dòng (xoá quan sát) (listwise deletion)

  • Nhiều quan sát khuyết cùng trên nhiều cột

  • Số quan sát khuyết chiếm tỷ lệ ít

na.omit(airquality)


2.1.3. Xoá theo cặp (pairwise deletion)

Chỉ xử lý giá trị khuyết khi biến đó có trong phân tích

# gói tidyr
drop_na(airquality, Solar.R) # chỉ định cột cần xoá

2.2. Nhập giá trị khuyết (imputation)

2.2.1. Sử dụng mean, median, …

airquality %>% 
  is.na() %>% 
  colSums()
##   Ozone Solar.R    Wind    Temp   Month     Day 
##      37       7       0       0       0       0


Xử lý missing trên Ozone và Solar.R

airquality %>% 
  mutate(
    Ozone = as.double(Ozone),
    Ozone = replace_na(
      Ozone, 
      mean(airquality$Ozone, na.rm=T)
    ),
    Solar.R = as.double(Solar.R),
    Solar.R = replace_na(
      Solar.R, 
      median(airquality$Solar.R, na.rm=T)
    )
  )


mice_air <- mice(
  airquality, 
  m = 1, 
  method = "mean"
)
## 
##  iter imp variable
##   1   1  Ozone  Solar.R
##   2   1  Ozone  Solar.R
##   3   1  Ozone  Solar.R
##   4   1  Ozone  Solar.R
##   5   1  Ozone  Solar.R
# View(mice_air)
airquality1 <- complete(mice_air)

2.2.2. Hot-deck

Thay thế bằng giá trị ngẫu nhiên

airquality2 <- mice(
  airquality, 
  m = 1, 
  method = "sample" # hot-deck
) %>% 
  complete()
## 
##  iter imp variable
##   1   1  Ozone  Solar.R
##   2   1  Ozone  Solar.R
##   3   1  Ozone  Solar.R
##   4   1  Ozone  Solar.R
##   5   1  Ozone  Solar.R


2.2.3. Hồi quy thông thường

mice(airquality, m = 1, method = 'norm.predict') %>%
  complete()
## 
##  iter imp variable
##   1   1  Ozone  Solar.R
##   2   1  Ozone  Solar.R
##   3   1  Ozone  Solar.R
##   4   1  Ozone  Solar.R
##   5   1  Ozone  Solar.R

2.2.4. Hồi quy ngẫu nhiên

mice(airquality, m = 1, method = "norm.nob") %>% 
  complete() %>% 
  View()
## 
##  iter imp variable
##   1   1  Ozone  Solar.R
##   2   1  Ozone  Solar.R
##   3   1  Ozone  Solar.R
##   4   1  Ozone  Solar.R
##   5   1  Ozone  Solar.R


Đối với phương pháp mỗi lần điền ra kết quả khác nhau, cần thực hiện điền đa khả năng

# mô phỏng phân phối chuẩn
plot(density(rnorm(100000, mean = 0, sd = 1)))


2.2.5. Thuật toán ML

Decision Tree

mice(airquality, method = "cart", m = 1) %>% 
  complete() %>% 
  View()
## 
##  iter imp variable
##   1   1  Ozone  Solar.R
##   2   1  Ozone  Solar.R
##   3   1  Ozone  Solar.R
##   4   1  Ozone  Solar.R
##   5   1  Ozone  Solar.R


Ensemble Learning

Random Forest (rừng ngẫu nhiên)

Sử dụng tốt hơn với dữ liệu lớn (nhiều biến, nhiều quan sát)

mice(airquality, method = "rf", m = 1) %>% 
  complete()
## 
##  iter imp variable
##   1   1  Ozone  Solar.R
##   2   1  Ozone  Solar.R
##   3   1  Ozone  Solar.R
##   4   1  Ozone  Solar.R
##   5   1  Ozone  Solar.R


2.2.6. Điền đa khả năng

mice_norm <- mice(
  airquality, 
  method = "norm.nob", 
  m = 5
)
## 
##  iter imp variable
##   1   1  Ozone  Solar.R
##   1   2  Ozone  Solar.R
##   1   3  Ozone  Solar.R
##   1   4  Ozone  Solar.R
##   1   5  Ozone  Solar.R
##   2   1  Ozone  Solar.R
##   2   2  Ozone  Solar.R
##   2   3  Ozone  Solar.R
##   2   4  Ozone  Solar.R
##   2   5  Ozone  Solar.R
##   3   1  Ozone  Solar.R
##   3   2  Ozone  Solar.R
##   3   3  Ozone  Solar.R
##   3   4  Ozone  Solar.R
##   3   5  Ozone  Solar.R
##   4   1  Ozone  Solar.R
##   4   2  Ozone  Solar.R
##   4   3  Ozone  Solar.R
##   4   4  Ozone  Solar.R
##   4   5  Ozone  Solar.R
##   5   1  Ozone  Solar.R
##   5   2  Ozone  Solar.R
##   5   3  Ozone  Solar.R
##   5   4  Ozone  Solar.R
##   5   5  Ozone  Solar.R
# View(mice_norm) # xem kết quả điền
mice_norm1 <- complete(mice_norm, action = 1)
# dataset đầu tiên
mice_norm1
# tương tự với action = 2 cho dataset thứ 2