Transformasi daya Yeo-Johnson yang dibahas di sini memiliki sifat-sifat luar biasa yang dirancang untuk menangani nol dan negatif sambil membangun kekuatan transformasi daya Box Cox. Inilah yang biasanya saya tuju ketika saya berhadapan dengan nol atau data negatif.
Berikut ini adalah ringkasan transformasi dengan pro / kontra untuk menggambarkan mengapa Yeo-Johnson lebih disukai.
Catatan
Pro: Baik dengan data positif.
Cons: Tidak menangani nol.
> log(0)
[1] -Inf
Log Plus 1
Kelebihan: Offset plus 1 menambahkan kemampuan untuk menangani nol di samping data positif.
Cons: Gagal dengan data negatif
> log1p(-1)
[1] -Inf
> log1p(-2)
[1] NaN
Warning message:
In log1p(-2) : NaNs produced
Akar pangkat dua
Kelebihan: Menggunakan transformasi daya yang dapat menangani nol dan data positif.
Cons: Gagal dengan data negatif
> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced
Kotak Cox
Kode R:
box_cox <- function(x, lambda) {
eps <- 0.00001
if (abs(lambda) < eps)
log(x)
else
(x ^ lambda - 1) / lambda
}
Pro: Mengaktifkan transformasi daya berskala
Cons: Menderita masalah dengan nol dan negatif (yaitu hanya dapat menangani data positif.
> 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
Kode 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)
}
Kelebihan: Dapat menangani data positif, nol, dan negatif.
Cons: Tidak ada yang bisa saya pikirkan. Properti sangat mirip dengan Box-Cox tetapi dapat menangani data nol dan negatif.
> yeo_johnson(0, lambda = 0)
[1] 0
> yeo_johnson(0, lambda = -0.5)
[1] 0
> yeo_johnson(-1, lambda = 0.5)
[1] -1.218951