Dữ liệu demo:
Demo dữ liệu có 6 ngày từ ngày 7 tới ngày 12, trong đó tại ngày 8 và ngày 9 bị khuyết dữ liệu (missing data)
demo_data <- data.frame(
x = seq(as.Date('2023-05-07'), as.Date('2023-05-12'), by = 'day'),
y = c(100, NA, NA, 200, 300, 400)
)
demo_data
Dùng giá trị của ngày phía trước để điền vào giá trị khuyết thiếu của ngày phía sau
Ví dụ: khi điền ngày 8 và ngày 9 ta sẽ lấy giá trị từ ngày 7
Sử dụng package zoo
library(zoo)
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
na.locf(demo_data)
Dùng giá trị của ngày phía sau để điền vào giá trị khuyết thiếu của ngày phía trước
Ví dụ: khi điền ngày 8 và ngày 9 ta sẽ lấy giá trị từ ngày 10
na.locf(demo_data, fromLast = TRUE)
Giá trị khuyết của ngày 8 và ngày 9 được điền bằng cách lấy trung bình có trong số là khoảng cách của ngày 8 và ngày 9 tới 2 ngày liền kề là ngày 7 và ngày 10
Trong đó: với ngày càng gần ngày bị missing thì có trọng số cao hơn
Ví dụ: khi điền ngày 8 thì ngày 7 có trọng số cao hơn ngày 10
Công thức:
\[ y = \frac{y_1(x_2-x) + y_2(x - x_1)}{x_2 - x_1} \]
# Ví dụ tính giá trị y khi x ở ngày 8/5
(100*(10 - 8) + 200*(8 - 7))/(10 - 7)
## [1] 133.3333
#interpolate y khi x ở ngày 8/5
approx(demo_data$x, demo_data$y, xout=as.Date('2023-05-08'))
## $x
## [1] "2023-05-08"
##
## $y
## [1] 133.3333
# Ví dụ tính giá trị y khi x ở ngày 8/5
(100*(10 - 9) + 200*(9 - 7))/(10 - 7)
## [1] 166.6667
#interpolate y khi x ở ngày 9/5
approx(demo_data$x, demo_data$y, xout=as.Date('2023-05-09'))
## $x
## [1] "2023-05-09"
##
## $y
## [1] 166.6667
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
mutate(
demo_data,
y = case_when(
is.na(y) ~ approx(demo_data$x, demo_data$y, xout = x)$y,
TRUE ~ y
)
)