Chuyển đổi năng lượng Yeo-Johnson được thảo luận ở đây có các đặc tính tuyệt vời được thiết kế để xử lý các số không và âm trong khi xây dựng các điểm mạnh của chuyển đổi năng lượng Box Cox. Đây là những gì tôi thường làm khi tôi xử lý số không hoặc dữ liệu âm.
Dưới đây là một bản tóm tắt các biến đổi với ưu / nhược điểm để minh họa tại sao Yeo-Johnson lại thích hợp hơn.
Đăng nhập
Ưu điểm: Làm tốt với dữ liệu tích cực.
Nhược điểm: Không xử lý số không.
> log(0)
[1] -Inf
Đăng nhập cộng 1
Ưu điểm: Phần bù cộng 1 bổ sung khả năng xử lý các số 0 ngoài dữ liệu dương.
Nhược điểm: Thất bại với dữ liệu âm
> log1p(-1)
[1] -Inf
> log1p(-2)
[1] NaN
Warning message:
In log1p(-2) : NaNs produced
Căn bậc hai
Ưu điểm: Sử dụng một chuyển đổi năng lượng có thể xử lý số không và dữ liệu tích cực.
Nhược điểm: Thất bại với dữ liệu âm
> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced
Hộp Cox
Mã R:
box_cox <- function(x, lambda) {
eps <- 0.00001
if (abs(lambda) < eps)
log(x)
else
(x ^ lambda - 1) / lambda
}
Ưu điểm: Cho phép biến đổi công suất theo tỷ lệ
Nhược điểm: Bị các vấn đề với số không và số âm (nghĩa là chỉ có thể xử lý dữ liệu tích cực.
> box_cox(0, lambda = 0)
[1] -Inf
> box_cox(0, lambda = -0.5)
[1] -Inf
> box_cox(-1, lambda = 0.5)
[1] NaN
Yeo Johnson
Mã R:
yeo_johnson <- function(x, lambda) {
eps <- .000001
not_neg <- which(x >= 0)
is_neg <- which(x < 0)
not_neg_trans <- function(x, lambda) {
if (abs(lambda) < eps) log(x + 1)
else ((x + 1) ^ lambda - 1) / lambda
}
neg_trans <- function(x, lambda) {
if (abs(lambda - 2) < eps) - log(-x + 1)
else - ((-x + 1) ^ (2 - lambda) - 1) / (2 - lambda)
}
x[not_neg] <- not_neg_trans(x[not_neg], lambda)
x[is_neg] <- neg_trans(x[is_neg], lambda)
return(x)
}
Ưu điểm: Có thể xử lý dữ liệu dương, không và âm.
Nhược điểm: Không ai mà tôi có thể nghĩ ra. Các thuộc tính rất giống với Box-Cox nhưng có thể xử lý dữ liệu âm và không.
> yeo_johnson(0, lambda = 0)
[1] 0
> yeo_johnson(0, lambda = -0.5)
[1] 0
> yeo_johnson(-1, lambda = 0.5)
[1] -1.218951