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
visdatXem đượ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)
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
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
Trường hợp cột bị khuyết rất nặng, không thể xử lý
head(select(airquality, -Ozone))
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)
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á
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)
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
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
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)))
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