Burada tartışılan Yeo-Johnson güç dönüşümü , Box Cox güç dönüşümünün gücünden yararlanırken sıfırları ve negatifleri ele almak için tasarlanmış mükemmel özelliklere sahiptir. Sıfırlar veya negatif verilerle uğraşırken genellikle buna giderim.
Yeo-Johnson'ın neden tercih edildiğini göstermek için artıları / eksileri olan dönüşümlerin bir özetini burada bulabilirsiniz.
Giriş
Artıları: Olumlu verilerle iyi yapar.
Eksileri: Sıfırları işlemez.
> log(0)
[1] -Inf
Günlük Artı 1
Artıları: Artı 1 ofseti, pozitif verilere ek olarak sıfırları kullanma yeteneği sağlar.
Eksileri: Olumsuz verilerle başarısız
> log1p(-1)
[1] -Inf
> log1p(-2)
[1] NaN
Warning message:
In log1p(-2) : NaNs produced
Kare kök
Artıları: Sıfırları ve pozitif verileri işleyebilecek bir güç dönüşümü kullanır.
Eksileri: Olumsuz verilerle başarısız
> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced
Kutu Cox
R Kodu:
box_cox <- function(x, lambda) {
eps <- 0.00001
if (abs(lambda) < eps)
log(x)
else
(x ^ lambda - 1) / lambda
}
Artıları: Ölçekli güç dönüşümleri sağlar
Eksileri: Sıfırlar ve negatiflerle ilgili sorunlardan muzdarip (yani sadece pozitif verileri idare edebilir).
> 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
R Kodu:
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)
}
Artıları: Olumlu, sıfır ve olumsuz verileri işleyebilir.
Eksileri: Hiç düşünemiyorum. Özellikler Box-Cox'a çok benzer, ancak sıfır ve negatif verileri işleyebilir.
> yeo_johnson(0, lambda = 0)
[1] 0
> yeo_johnson(0, lambda = -0.5)
[1] 0
> yeo_johnson(-1, lambda = 0.5)
[1] -1.218951