La transformation de puissance Yeo-Johnson décrite ici présente d'excellentes propriétés conçues pour gérer les zéros et les négatifs tout en s'appuyant sur les points forts de la transformation de puissance Box Cox. C’est ce à quoi je vais généralement quand j’ai affaire à des zéros ou des données négatives.
Voici un résumé des transformations avec les avantages / inconvénients pour illustrer pourquoi Yeo-Johnson est préférable.
Bûche
Avantages: fait bien avec des données positives.
Inconvénients: Ne gère pas les zéros.
> log(0)
[1] -Inf
Log Plus 1
Avantages: l'offset plus 1 ajoute la possibilité de gérer les zéros en plus des données positives.
Inconvénients: échoue avec les données négatives
> log1p(-1)
[1] -Inf
> log1p(-2)
[1] NaN
Warning message:
In log1p(-2) : NaNs produced
Racine carrée
Avantages: Utilise une transformation de puissance capable de gérer les zéros et les données positives.
Inconvénients: échoue avec les données négatives
> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced
Box Cox
Code R:
box_cox <- function(x, lambda) {
eps <- 0.00001
if (abs(lambda) < eps)
log(x)
else
(x ^ lambda - 1) / lambda
}
Avantages: Permet des transformations de puissance à l'échelle
Inconvénients: Souffre de problèmes de zéros et de négatifs (c.-à-d. Ne peut gérer que des données positives.
> 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
Code 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)
}
Avantages: Peut traiter des données positives, nulles et négatives.
Inconvénients: Aucun que je puisse penser. Les propriétés sont très similaires à Box-Cox mais peuvent gérer des données nulles et négatives.
> yeo_johnson(0, lambda = 0)
[1] 0
> yeo_johnson(0, lambda = -0.5)
[1] 0
> yeo_johnson(-1, lambda = 0.5)
[1] -1.218951