Comment devrais-je transformer des données non négatives, y compris des zéros?

191

Si j'ai des données positives très asymétriques, je prends souvent des journaux. Mais que dois-je faire avec des données non négatives hautement asymétriques qui incluent des zéros? J'ai vu deux transformations utilisées:

  • log(x+1) qui a la particularité que 0 mappe sur 0.
  • log(x+c) où c est estimé ou défini comme une très petite valeur positive.

Existe-t-il d'autres approches? Existe-t-il de bonnes raisons de préférer une approche aux autres?

Rob Hyndman
la source
19
J'ai résumé certaines des réponses et d'autres éléments sur robjhyndman.com/researchtips/transformations
Rob Hyndman
5
excellent moyen de transformer et de promouvoir stat.stackoverflow!
robin girard
Oui, je suis d'accord avec @robingirard (je viens d'arriver ici à cause du billet de blog de Rob)!
Ellie Kesselman
Voir également stats.stackexchange.com/questions/39042/… pour une application aux données censurées à gauche (pouvant être caractérisées, jusqu'à un changement de lieu, exactement comme dans la présente question).
whuber
2
Il semble étrange de demander comment transformer sans avoir déclaré le but de la transformation. Quelle est la situation? Pourquoi est-il nécessaire de transformer? Si nous ne savons pas ce que vous essayez d'atteindre, comment peut-on raisonnablement suggérer quelque chose ? (Il est clair que l'on ne peut pas espérer se transformer en normalité, car l'existence d'une probabilité (non nulle) de zéros exacts implique un pic dans la distribution à zéro, pic qu'aucune transformation ne supprimera - elle ne peut que le déplacer.)
Glen_b

Réponses:

55

Il me semble que le choix de transformation le plus approprié dépend du modèle et du contexte.

Le point "0" peut provenir de plusieurs raisons différentes, chacune pouvant être traitée différemment:

  • Troncature (comme dans l'exemple de Robin): utilisez des modèles appropriés (mélanges, modèles de survie, etc.)
  • Données manquantes: Imputez les données / supprimez les observations, le cas échéant.
  • Point zéro naturel (p. Ex. Niveaux de revenu; un chômeur a un revenu nul): Transformez-vous au besoin
  • Sensibilité de l'instrument de mesure: peut-être, ajouter une petite quantité aux données?

Je n'offre pas vraiment de réponse car je soupçonne qu'il n'y a pas de transformation «correcte» universelle lorsque vous avez des zéros.


la source
6
Chaque réponse à ma question a fourni des informations utiles et je les ai toutes votées. Mais je ne peux sélectionner qu'une seule réponse et Srikant fournit la meilleure vue d'ensemble, OMI.
Rob Hyndman
2
Notez également qu'il existe des modèles zéro-gonflés (des zéros supplémentaires et que vous tenez à certains zéros: un modèle de mélange) et des modèles d'obstacles (des zéros et que vous vous souciez des non-zéros: un modèle à deux étapes avec un modèle censuré initial).
Wayne
82

Personne n'a mentionné la transformation sinus hyperbolique inverse. Donc, pour être complet, je l’ajoute ici.

Ceci est une alternative aux transformations de Box-Cox et est défini par où . Pour toute valeur de , zéro correspond à zéro. Il existe également une version à deux paramètres permettant un décalage, tout comme avec la transformation BC à deux paramètres. Burbidge, Magee et Robb (1988) discutent de la transformation d'IHS, y compris l'estimation de .

f(y,θ)=sinh1(θy)/θ=log[θy+(θ2y2+1)1/2]/θ,
θ>0θθ

La transformation IHS fonctionne avec des données définies sur la ligne réelle entière, y compris les valeurs négatives et les zéros. Pour les grandes valeurs de il se comporte comme une transformation de journal, quelle que soit la valeur de (sauf 0). Le cas limite donne .yθθ0f(y,θ)y

Il me semble que la transformation IHS devrait être beaucoup plus connue qu’elle ne l’est.

Rob Hyndman
la source
1
On dirait une bonne alternative aux transformations / logistiquetanh
Firebug
1
À propos de l'IHS, certains semblent ne pas être d'accord: onlinelibrary.wiley.com/doi/10.1890/10-0340.1/abstract
kjetil b halvorsen
3
Ce document traite de la transformation sinus inverse, pas du sinus hyperbolique inverse.
Bryan
42

Une approche utile lorsque la variable est utilisée comme facteur indépendant dans la régression consiste à la remplacer par deux variables: l’une est un indicateur binaire indiquant si elle est nulle et l’autre est la valeur de la variable d’origine ou une ré-expression de celle-ci, comme son logarithme. Cette technique est décrite dans le livre de Hosmer & Lemeshow sur la régression logistique (et ailleurs, j'en suis sûr). Les courbes de probabilité tronquées de la partie positive de la variable d'origine sont utiles pour identifier une nouvelle expression appropriée. (Voir l'analyse sur https://stats.stackexchange.com/a/30749/919 pour des exemples.)

Lorsque la variable est la variable dépendante dans un modèle linéaire, une régression censurée (comme Tobit ) peut être utile, évitant ainsi le besoin de produire un logarithme commencé. Cette technique est courante chez les économétriciens.

whuber
la source
1
La modélisation des données en tant que Poisson à gonflage nul est-elle un cas particulier de cette approche?
David LeBauer le
4
@ David, bien qu'il semble similaire, ce n'est pas le cas, car le ZIP est un modèle de la variable dépendante , pas de la variable indépendante.
whuber
1
@whuber Cette technique est discutée dans le livre de Hosmer & Lemeshow sur la régression logistique. Par hasard voudriez-vous savoir dans quel chapitre ils discutent de cette technique? Je regarde leur livre, mais n'arrive pas à trouver la bonne page ...
landroni
1
@landroni H & L était alors dans mon esprit, alors je suis convaincu que ce livre a quelque chose de lié à ce sujet. (Je l'avais consulté pour développer de très grands modèles de régression et de nombreuses variables indépendantes devaient être traitées de cette façon.) Cependant, je ne trouve pas la référence à ce stade non plus. J'ai écrit sur cette technique dans des publications ultérieures, au cas où vous voudriez des détails. Deux sites figurant dans une recherche sur le site sont les sites stats.stackexchange.com/questions/6563 et stats.stackexchange.com/questions/4831 .
whuber
1
@landroni Oui, ils sont équivalents, de la même manière que tous les encodages numériques d'une variable binaire sont équivalents. Choisissez celui que vous trouvez le plus pratique à interpréter.
whuber
37

Les transformations de journal avec décalages sont des cas particuliers des transformations Box-Cox :

y(λ1,λ2)={(y+λ2)λ11λ1when λ10log(y+λ2)when λ1=0

Ce sont la forme étendue pour les valeurs négatives, mais également applicable aux données contenant des zéros. Box et Cox (1964) présentent un algorithme pour trouver les valeurs appropriées pour les utilisant le maximum de vraisemblance. Cela vous donne la transformation ultime. λ

Une des raisons de préférer les transformations Box-Cox est qu'elles ont été développées pour garantir les hypothèses du modèle linéaire. Certains travaux ont montré que même si vos données ne peuvent pas être transformées en normalité, les estimations de conduisent toujours à une distribution symétrique.λ

Je ne sais pas dans quelle mesure cela s’applique à vos données, car il se peut que soit que la transformation de journal que vous avez mentionnée, mais il peut être utile d’estimer le nombre requis de pour voir si une autre la transformation est appropriée.λλ=(0,1)λ

Dans R, la boxcox.fitfonction dans package geoRcalculera les paramètres pour vous.

ars
la source
hmm, le latex "begin cases" ne peut pas accepter les nouvelles lignes. : - /
ars
@ars j'ai corrigé les eqns pour utiliser les cas de début. J'espère que je n'ai pas modifié les évaluations dans le processus.
1
@Rob: Oh, désolé. La géoR de Diggle est la voie à suivre - mais précisez lambda2=TRUEdans les arguments de boxcox.fit. (Mise à jour également de la réponse.)
ars
3
@ gd047: voici une belle référence: elevatorlady.ca/doc/refcard/expressions.html
ars
6
Pour quiconque lit ceci se demandant ce qui est arrivé à cette fonction, elle s'appelle maintenant boxcoxfit.
Stragu
19

Je suppose que zéro! = Données manquantes, car la question est tout à fait différente.

Quand on réfléchit à la façon de gérer les zéros dans une régression linéaire multiple, j'ai tendance à considérer combien de zéros avons-nous réellement?

Seulement quelques zéros

Si j'ai un seul zéro dans un ensemble de données assez volumineux, j'ai tendance à:

  1. Supprimer le point, prendre des journaux et adapter le modèle
  2. c

c

Vous pouvez rendre cette procédure un peu moins crue et utiliser la méthode boxcox avec les décalages décrits dans la réponse de ars.

Grand nombre de zéros

Si mon ensemble de données contient un grand nombre de zéros, cela suggère que la régression linéaire simple n'est pas le meilleur outil pour le travail. J'utiliserais plutôt quelque chose comme une modélisation de mélange (comme suggéré par Srikant et Robin).

csgillespie
la source
15

Si vous voulez quelque chose de rapide et sale, pourquoi ne pas utiliser la racine carrée?

utilisateur856
la source
7
Et fréquemment, la transformation de la racine du cube fonctionne bien et permet des zéros et des négatifs. J'ai trouvé que les racines de cube fonctionnent particulièrement bien lorsque, par exemple, la mesure est un volume ou un nombre de particules par unité de volume. La racine du cube le convertirait en une dimension linéaire. Une approche plus souple consiste à ajuster une spline cubique restreinte (spline naturelle) sur la racine cubique ou la racine carrée, ce qui permet de s’écarter légèrement de la forme supposée.
Frank Harrell
2
+1 Pour un petit article sur les racines de cube, voir stata-journal.com/article.html?article=st0223 (Il s'agira d'un fichier .pdf gratuit du premier trimestre de 2014.)
Nick Cox,
2
Une racine carrée de zéro correspond à zéro et seules les valeurs autres que les zéros sont transformées. Cela ne fait rien pour traiter le pic, si gonflé à zéro, et peut causer de graves problèmes si, dans les groupes, chacun a une quantité différente de zéros. En d’autres termes, si certains groupes ont beaucoup de zéros et d’autres en ont peu, cette transformation peut affecter de nombreuses choses négativement. Pour le groupe avec la variance la plus grande (également le moins nul), presque toutes les valeurs sont transformées. En revanche, ceux qui ont le plus de zéros, peu de valeurs sont transformées. Cela peut changer le groupe qui a la plus grande variance.
D_Williams
Aucune transformation ne maintiendra la variance dans le cas décrit par @D_Williams. Les modèles de mélange (mentionnés ailleurs dans ce fil) seraient probablement une bonne approche dans ce cas.
mardi
10

Je suppose que vous avez des données continues.

Si les données incluent des zéros, cela signifie que vous avez un pic sur zéro qui peut être dû à un aspect particulier de vos données. Il apparaît, par exemple, dans l’énergie éolienne, que le vent au-dessous de 2 m / s produit une puissance nulle (il s’appelle cut-in) et que le vent au-dessus de (environ 25 km / s) produit également une puissance nulle (pour des raisons de sécurité, il s’appelle coupé) . Bien que la distribution de l'énergie éolienne produite semble continue, il y a une pointe de zéro.

Ma solution: dans ce cas, je suggère de traiter les zéros séparément en utilisant un mélange du pic en zéro et du modèle que vous avez prévu d'utiliser pour la partie de la distribution qui est continue (avec Lebesgue).

robin girard
la source
9

En comparant la réponse fournie par @RobHyndman à une transformation log-plus-one étendue aux valeurs négatives sous la forme:

T(x)=sign(x)log(|x|+1)
r = -1000:1000

l = sign(r)*log1p(abs(r))
l = l/max(l)
plot(r, l, type = "l", xlab = "Original", ylab = "Transformed", col = adjustcolor("red", alpha = 0.5), lwd = 3)

#We scale both to fit (-1,1)
for(i in exp(seq(-10, 100, 10))){
  s = asinh(i*r)

  s = s / max(s)
  lines(r, s, col = adjustcolor("blue", alpha = 0.2), lwd = 3)
}
legend("topleft", c("asinh(x)", "sign(x) log(abs(x)+1)"), col = c("blue", "red"), lty = 1)

θθ1θ0

entrez la description de l'image ici


θx=0

Pyromane
la source
8

Puisque l'ajustement Box-Cox à deux paramètres a été proposé, voici quelques R pour ajuster les données d'entrée, exécuter une fonction arbitraire dessus (par exemple, prévision de série chronologique), puis renvoyer la sortie inversée:

# Two-parameter Box-Cox function
boxcox.f <- function(x, lambda1, lambda2) {
  if (lambda1!=0) {
    return(((x + lambda2) ^ lambda1 - 1) / lambda1)
  } else {
    return(log(x + lambda2))
  }
}

# Two-parameter inverse Box-Cox function
boxcox.inv <- function(x, lambda1, lambda2) {
  if (lambda1!=0) {
    return((lambda1 * x + 1) ^ (1 / lambda1) - lambda2)
  } else {
    return(exp(x) - lambda2)
  }
}

# Function to Box-Cox transform x, apply function g, 
# and return inverted Box-Cox output y
boxcox.fit.apply <- function(x, g) {
  require(geoR)
  require(plyr)

  # Fit lambdas
  t <- try(lambda.pair <- boxcoxfit(x, lambda2=T)$lambda)

  # Estimating both lambdas sometimes fails; if so, estimate lambda1 only
  if (inherits(t, "try-error")) {
    lambda1 <- boxcoxfit(x)$lambda
    lambda2 <- 0
  } else {
    lambda1 <- lambda.pair[1]
    lambda2 <- lambda.pair[2]
  }
  x.boxcox <- boxcox.f(x, lambda1, lambda2)

  # Apply function g to x.boxcox. This should return data similar to x (e.g. ts)
  y <- aaply(x.boxcox, 1, g)

  return(boxcox.inv(y, lambda1, lambda2))
}
Max Ghenis
la source
5

Supposons que Y représente la somme d'argent que chaque Américain dépense pour une nouvelle voiture au cours d'une année donnée (prix d'achat total). Y va piquer à 0; n'aura aucune valeur entre 0 et environ 12 000; et prendra d'autres valeurs principalement dans les années de l'adolescence, la vingtaine et la trentaine de milliers. Les prédicteurs seraient des substituts du niveau de besoin et / ou d'intérêt pour effectuer un tel achat. On peut difficilement dire que le besoin ou l’intérêt est nul pour les personnes qui n’effectuent aucun achat; sur ces échelles, les non-acheteurs seraient beaucoup plus proches des acheteurs que Y ou même le log de Y ne le suggère. Dans un cas très semblable à celui observé dans le secteur de la santé, j’ai trouvé que les prévisions les plus précises, à en juger par la validation croisée des ensembles de tests et d’entraînement, ont été obtenues par ordre croissant:

  1. Régression logistique sur une version binaire de Y,
  2. OLS sur Y,
  3. La régression ordinale (PLUM) sur Y est regroupée en 5 catégories (de manière à diviser les acheteurs en 4 groupes de taille égale),
  4. La régression logistique multinomiale sur Y est classée en 5 catégories,
  5. OLS sur le journal (10) de Y (je n'ai pas pensé à essayer la racine du cube), et
  6. OLS sur Y classés en 5 catégories.

Certains vont reculer devant cette catégorisation d'une variable dépendante continue. Mais bien que cela sacrifie certaines informations, la catégorisation semble aider en restaurant un aspect sous-jacent important de la situation - encore une fois, le fait que les "zéros" sont beaucoup plus similaires aux autres que ce que Y aurait indiqué.

rolando2
la source
4
Vous pouvez également le scinder en deux modèles: la probabilité d’acheter une voiture (réponse binaire) et la valeur de la voiture donnée lors d’un achat. C’est la pratique courante dans de nombreux domaines, tels que les assurances, le risque de crédit, etc.
Hong Ooi
1
@HongOoi - pouvez-vous suggérer des lectures sur le moment où cette approche est applicable ou non?
rolando2
4

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
Matt Dancho
la source
1
Inconvénients de Yeo – Johnson: transformation distincte complexe en positifs et négatifs et en valeurs de part et d'autre de lambda, valeur de réglage magique (epsilon; et qu'est-ce que lambda?). Aucun avantage apparent apparent par rapport à la transformation de journal étendue négative étendue décrite dans la réponse de Firebug, sauf si vous avez besoin de transformations de puissance mises à l'échelle (comme dans Box – Cox).
Konrad Rudolph
1

Pour clarifier la manière de traiter le log de zéro dans les modèles de régression, nous avons rédigé un document pédagogique expliquant la meilleure solution et les erreurs courantes commises par les utilisateurs. Nous avons également proposé une nouvelle solution pour résoudre ce problème.

Vous pouvez trouver le document en cliquant ici: https://ssrn.com/abstract=3444996

log(y)=βlog(x)+εβyx

YY+c>0

Dans notre article, nous fournissons en fait un exemple où ajouter de très petites constantes fournit le biais le plus élevé. Nous fournissons une expression du biais.

En fait, le pseudo-maximum de vraisemblance de Poisson (PPML) peut être considéré comme une bonne solution à ce problème. On doit considérer le processus suivant:

yi=aiexp(α+xiβ)E(ai|xi)=1

βaiyi=0E(ai|xi)=1E(yiexp(α+xiβ)|xi)=0

i=1N(yiexp(α+xiβ))xi=0

yi=0

β

log(yi+exp(α+xiβ))=xiβ+ηi

Nous montrons que cet estimateur est non biaisé et qu’il peut simplement être estimé avec GMM avec n’importe quel logiciel statistique standard. Par exemple, il peut être estimé en exécutant une seule ligne de code avec Stata.

Nous espérons que cet article pourra vous aider et nous serions ravis de recevoir vos commentaires.

Christophe Bellégo et Louis-Daniel Pape CREST - Ecole Polytechnique - ENSAE

Christophe Bellégo
la source