La transformación de energía de Yeo-Johnson discutida aquí tiene excelentes propiedades diseñadas para manejar ceros y negativos mientras se construye sobre las fortalezas de la transformación de energía de Box Cox. Esto es lo que normalmente hago cuando trato con ceros o datos negativos.
Aquí hay un resumen de las transformaciones con pros / contras para ilustrar por qué es preferible Yeo-Johnson.
Iniciar sesión
Pros: le va bien con datos positivos.
Contras: no maneja ceros.
> log(0)
[1] -Inf
Log Plus 1
Pros: El desplazamiento más 1 agrega la capacidad de manejar ceros además de datos positivos.
Contras: falla con datos negativos
> log1p(-1)
[1] -Inf
> log1p(-2)
[1] NaN
Warning message:
In log1p(-2) : NaNs produced
Raíz cuadrada
Pros: Utiliza una transformación de potencia que puede manejar ceros y datos positivos.
Contras: falla con datos negativos
> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced
Box Cox
Código R:
box_cox <- function(x, lambda) {
eps <- 0.00001
if (abs(lambda) < eps)
log(x)
else
(x ^ lambda - 1) / lambda
}
Pros: permite transformaciones de potencia a escala
Contras: Sufre de problemas con ceros y negativos (es decir, solo puede manejar datos positivos.
> 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
Código 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)
}
Pros: puede manejar datos positivos, cero y negativos.
Contras: Ninguno que se me ocurra. Las propiedades son muy similares a Box-Cox pero pueden manejar datos cero y negativos.
> yeo_johnson(0, lambda = 0)
[1] 0
> yeo_johnson(0, lambda = -0.5)
[1] 0
> yeo_johnson(-1, lambda = 0.5)
[1] -1.218951