Omówiona tutaj transformacja mocy Yeo-Johnsona ma doskonałe właściwości zaprojektowane do radzenia sobie z zerami i negatywami przy jednoczesnym wykorzystaniu mocnych stron transformacji mocy Boxa Coxa. Do tego zazwyczaj chodzę, gdy mam do czynienia z zerami lub danymi ujemnymi.
Oto podsumowanie transformacji z zaletami / wadami, aby zilustrować, dlaczego Yeo-Johnson jest lepszy.
Log
Plusy: Dobrze sobie radzi z pozytywnymi danymi.
Minusy: nie obsługuje zer.
> log(0)
[1] -Inf
Log Plus 1
Zalety: Przesunięcie plus 1 dodaje możliwość obsługi zer oprócz pozytywnych danych.
Minusy: kończy się niepowodzeniem z negatywnymi danymi
> log1p(-1)
[1] -Inf
> log1p(-2)
[1] NaN
Warning message:
In log1p(-2) : NaNs produced
Pierwiastek kwadratowy
Zalety: Wykorzystuje transformację mocy, która może obsługiwać zera i dane dodatnie.
Minusy: kończy się niepowodzeniem z negatywnymi danymi
> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced
Box Cox
Kod R:
box_cox <- function(x, lambda) {
eps <- 0.00001
if (abs(lambda) < eps)
log(x)
else
(x ^ lambda - 1) / lambda
}
Zalety: Umożliwia skalowane transformacje mocy
Wady: cierpi na problemy z zerami i negatywami (tzn. Może obsługiwać tylko dane dodatnie.
> 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
Kod 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)
}
Plusy: radzą sobie z danymi dodatnimi, zerowymi i ujemnymi.
Minusy: Brak, o którym mogę myśleć. Właściwości są bardzo podobne do Box-Coxa, ale mogą obsługiwać dane zerowe i ujemne.
> yeo_johnson(0, lambda = 0)
[1] 0
> yeo_johnson(0, lambda = -0.5)
[1] 0
> yeo_johnson(-1, lambda = 0.5)
[1] -1.218951