Wie kann ich nicht negative Daten einschließlich Nullen transformieren?

191

Wenn ich stark verzerrte positive Daten habe, nehme ich oft Protokolle. Aber was soll ich mit stark verzerrten, nicht negativen Daten machen, die Nullen enthalten? Ich habe zwei Transformationen gesehen:

  • log(x+1) mit der netten Funktion, dass 0 auf 0 abgebildet wird.
  • log(x+c) wobei c entweder geschätzt oder auf einen sehr kleinen positiven Wert gesetzt wird.

Gibt es noch andere Ansätze? Gibt es gute Gründe, einen Ansatz dem anderen vorzuziehen?

Rob Hyndman
quelle
19
Ich habe einige der Antworten und weiteres Material unter robjhyndman.com/researchtips/transformations zusammengefasst
Rob Hyndman
5
ausgezeichnete Möglichkeit, stat.stackoverflow zu transformieren und zu fördern!
Robin Girard
Ja, ich stimme @robingirard zu (ich bin gerade wegen Robs Blogpost hier angekommen)!
Ellie Kesselman
Siehe auch stats.stackexchange.com/questions/39042/… für eine Anwendung auf linkszensierte Daten (die bis zu einem Ortswechsel genau wie in der vorliegenden Frage charakterisiert werden können).
whuber
2
Es scheint seltsam, sich zu fragen, wie man transformiert, ohne vorher den Zweck der Transformation angegeben zu haben. Was ist die Situation? Warum muss man sich verwandeln? Wenn wir nicht wissen, was Sie erreichen wollen, wie kann man vernünftigerweise etwas vorschlagen ? ( Selbstverständlich kann man nicht hoffen, Normalität zu verwandeln, weil die Existenz einer (nicht Null) Wahrscheinlichkeit von exakt Null bei Null eine Spitze in der Verteilung impliziert, die keine Umwandlung Spike entfernen wird -. Es nur sie können sich frei bewegen)
Glen_b

Antworten:

55

Es scheint mir, dass die am besten geeignete Wahl der Transformation vom Modell und dem Kontext abhängt.

Der '0'-Punkt kann aus verschiedenen Gründen auftreten, von denen jeder unterschiedlich behandelt werden muss:

  • Trunkierung (wie in Robins Beispiel): Verwenden Sie geeignete Modelle (z. B. Gemische, Überlebensmodelle usw.).
  • Fehlende Daten: Daten unterstellen / ggf. Beobachtungen fallen lassen.
  • Natürlicher Nullpunkt (z. B. Einkommensniveau; ein Arbeitsloser hat kein Einkommen): Bei Bedarf umwandeln
  • Empfindlichkeit des Messgeräts: Fügen Sie den Daten möglicherweise eine kleine Menge hinzu?

Ich biete nicht wirklich eine Antwort an, da ich vermute, dass es keine universelle, 'korrekte' Transformation gibt, wenn Sie Nullen haben.


quelle
6
Jede Antwort auf meine Frage hat nützliche Informationen geliefert und ich habe sie alle positiv bewertet. Aber ich kann nur eine Antwort auswählen und Srikants bietet den besten Überblick IMO.
Rob Hyndman
2
Beachten Sie auch, dass es Modelle mit Null-Inflation gibt (zusätzliche Nullen und Sie interessieren sich für einige Nullen: ein Mischungsmodell) und Hürdenmodelle (Nullen und Sie interessieren sich für Nicht-Nullen: ein zweistufiges Modell mit einem anfänglich zensierten Modell).
Wayne
82

Niemand erwähnte die inverse hyperbolische Sinustransformation. Der Vollständigkeit halber füge ich es hier hinzu.

Dies ist eine Alternative zu den Box-Cox-Transformationen und wird definiert durch wobei . Für jeden Wert von wird Null auf Null abgebildet. Ebenso wie bei der Zwei-Parameter-BC-Transformation gibt es eine Zwei-Parameter-Version, die eine Verschiebung ermöglicht. Burbidge, Magee und Robb (1988) diskutieren die IHS-Transformation einschließlich der Schätzung von .

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

Die IHS-Transformation arbeitet mit Daten, die auf der gesamten realen Linie definiert sind, einschließlich negativer Werte und Nullen. Für große Werte von verhält es sich wie eine Protokolltransformation, unabhängig vom Wert von (außer 0). Der Grenzfall als ergibt .yθθ0f(y,θ)y

Mir scheint, dass die IHS-Transformation viel bekannter sein sollte als sie ist.

Rob Hyndman
quelle
1
Sieht aus wie eine gute Alternative zu / Logistik-Transformationentanh
Firebug
1
Über die IHS scheinen einige anderer Meinung zu sein: onlinelibrary.wiley.com/doi/10.1890/10-0340.1/abstract
kjetil b halvorsen
3
In diesem Artikel geht es um die inverse Sinustransformation, nicht um den inversen hyperbolischen Sinus.
Bryan
42

Ein nützlicher Ansatz, wenn die Variable als unabhängiger Faktor in der Regression verwendet wird, besteht darin, sie durch zwei Variablen zu ersetzen: Eine ist ein binärer Indikator dafür, ob sie Null ist, und die andere ist der Wert der ursprünglichen Variablen oder ein erneuter Ausdruck davon. wie sein Logarithmus. Diese Technik wird in Hosmer & Lemeshows Buch über logistische Regression diskutiert (und an anderen Stellen, da bin ich mir sicher). Abgeschnittene Wahrscheinlichkeitsdiagramme des positiven Teils der ursprünglichen Variablen sind nützlich, um einen geeigneten Wiederausdruck zu identifizieren. (Beispiele finden Sie in der Analyse unter https://stats.stackexchange.com/a/30749/919 .)

Wenn die Variable die abhängige Variable in einem linearen Modell ist, kann eine zensierte Regression (wie Tobit ) nützlich sein, wodurch wiederum die Notwendigkeit vermieden wird, einen gestarteten Logarithmus zu erzeugen. Diese Technik ist unter Ökonomen üblich.

whuber
quelle
1
Ist die Modellierung von Daten als Poisson ohne Inflation ein Sonderfall dieses Ansatzes?
David LeBauer
4
@David, obwohl es ähnlich zu sein scheint, ist es nicht, da die ZIP ein Modell der abhängigen Variablen ist, nicht der unabhängigen Variablen.
whuber
1
@whuber Diese Technik wird in Hosmer & Lemeshows Buch über logistische Regression besprochen. Würden Sie zufällig wissen, in welchem ​​Kapitel sie diese Technik besprechen? Ich schaue in ihr Buch, kann aber nicht die richtige Seite finden ...
landroni
1
@landroni H & L war damals noch frisch in meinem Kopf, daher bin ich zuversichtlich , dass dieses Buch etwas zu diesem Thema enthält. (Ich hatte es zu Rate gezogen, um einige sehr große Regressionsmodelle zu entwickeln, und viele der unabhängigen Variablen mussten auf diese Weise behandelt werden.) Allerdings kann ich den Verweis auch an dieser Stelle nicht finden. Ich habe in den folgenden Beiträgen darüber geschrieben, falls Sie nach Details suchen. Zwei, die in einer Site-Suche angezeigt werden, befinden sich unter stats.stackexchange.com/questions/6563 und stats.stackexchange.com/questions/4831 .
Whuber
1
@landroni Ja, sie sind äquivalent, genauso wie alle numerischen Kodierungen einer binären Variablen äquivalent sind. Wählen Sie diejenige, die Sie am bequemsten interpretieren möchten.
Whuber
37

Die Log-Transformationen mit Verschiebungen sind Spezialfälle der Box-Cox-Transformationen :

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

Dies ist die erweiterte Form für negative Werte, gilt jedoch auch für Daten, die Nullen enthalten. Box und Cox (1964) stellen einen Algorithmus vor, mit dem mit maximaler Wahrscheinlichkeit geeignete Werte für die werden können. Dies gibt Ihnen die ultimative Transformation. λ

Ein Grund, Box-Cox-Transformationen zu bevorzugen, besteht darin, dass sie entwickelt wurden, um Annahmen für das lineare Modell zu gewährleisten. Es wurde einige Arbeit geleistet, um zu zeigen, dass das geschätzte auch dann zu einer symmetrischen Verteilung führt , wenn Ihre Daten nicht zur Normalität transformiert werden können .λ

Ich bin mir nicht sicher, wie gut dies Ihre Daten adressiert, da es das das nur die von Ihnen erwähnte Log-Transformation ist, aber es kann sich lohnen, die erforderlichen zu schätzen , um zu sehen, ob es sich um eine andere handelt Transformation ist angemessen.λ=(0,1)λ

In R berechnet die boxcox.fitFunktion in package geoRdie Parameter für Sie.

ars
quelle
hmm, ich kann den Latex "begin cases" nicht dazu bringen, neue Zeilen zu akzeptieren. : - /
ars
@ars Ich habe die EQNS repariert, um Anfangsfälle zu verwenden. Ich hoffe, ich habe die EQNS dabei nicht kaputt gemacht.
1
@ Rob: Oh, Entschuldigung. Diggles GeoR ist der richtige Weg - aber geben Sie lambda2=TRUEin den Argumenten an boxcox.fit. (Hat auch die Antwort aktualisiert.)
ars
3
@ GD047: Hier ist eine nette Referenz: elevatorlady.ca/doc/refcard/expressions.html
ars
6
Für alle, die dies lesen und sich fragen, was mit dieser Funktion passiert ist, heißt sie jetzt boxcoxfit.
Stragu
19

Ich gehe davon aus, dass Null! = Fehlende Daten, da dies eine ganz andere Frage ist.

Wenn ich darüber nachdenke, wie Nullen in multipler linearer Regression zu behandeln sind, neige ich dazu, zu überlegen, wie viele Nullen wir tatsächlich haben.

Nur ein paar Nullen

Wenn ich eine einzelne Null in einem relativ großen Datensatz habe, neige ich dazu:

  1. Entfernen Sie den Punkt, nehmen Sie Protokolle und passen Sie das Modell an
  2. Fügen Sie dem Punkt ein kleines , nehmen Sie Protokolle und passen Sie das Modell anc

Passt das Modell? Was ist mit den Parameterwerten? Wenn das Modell ziemlich robust ist, um den Punkt zu entfernen, werde ich mich für einen schnellen und schmutzigen Ansatz entscheiden, hinzuzufügen .c

Sie könnten diese Prozedur etwas weniger grob gestalten und die Boxcox-Methode mit den in der Antwort von ars beschriebenen Verschiebungen anwenden.

Große Anzahl von Nullen

Wenn mein Datensatz eine große Anzahl von Nullen enthält, ist eine einfache lineare Regression möglicherweise nicht das beste Werkzeug für den Job. Stattdessen würde ich so etwas wie eine Mischungsmodellierung verwenden (wie von Srikant und Robin vorgeschlagen).

csgillespie
quelle
15

Wenn Sie etwas schnelles und schmutziges wollen, warum nicht die Quadratwurzel verwenden?

user856
quelle
7
Und häufig funktioniert die Kubikwurzeltransformation gut und erlaubt Nullen und Negative. Ich habe festgestellt, dass die Kubikwurzel besonders gut funktioniert, wenn zum Beispiel das Volumen oder die Anzahl der Partikel pro Volumeneinheit gemessen wird. Die Kubikwurzel würde es in eine lineare Dimension konvertieren. Ein flexiblerer Ansatz besteht darin, einen eingeschränkten kubischen Spline (natürlichen Spline) auf die Kubikwurzel oder Quadratwurzel aufzubringen, wobei die angenommene Form leicht abgewichen wird.
Frank Harrell
2
+1. Einen kleinen Artikel über Kubikwurzeln finden Sie unter stata-journal.com/article.html?article=st0223 (Dies ist eine kostenlose PDF-Datei ab dem ersten Quartal 2014.)
Nick Cox
2
Eine Quadratwurzel von Null ist Null, daher werden nur die Werte ungleich Null transformiert. Dies hat keinen Einfluss auf die Spitze, wenn die Null aufgeblasen ist, und kann schwerwiegende Probleme verursachen, wenn in Gruppen jeweils eine unterschiedliche Anzahl von Nullen vorhanden ist. Mit anderen Worten, wenn einige Gruppen viele Nullen und andere wenige haben, kann sich diese Transformation negativ auf viele Dinge auswirken. Für die Gruppe mit der größten Varianz (auch mit den geringsten Nullen) werden fast alle Werte transformiert. Im Gegensatz dazu werden bei denen mit den meisten Nullen nicht viele Werte transformiert. Dies kann ändern, welche Gruppe die größte Varianz aufweist.
D_Williams
Keine Transformation behält die Varianz in dem von @D_Williams beschriebenen Fall bei. Mischmodelle (an anderer Stelle in diesem Thread erwähnt) wären in diesem Fall wahrscheinlich ein guter Ansatz.
mkt
10

Ich gehe davon aus, dass Sie kontinuierliche Daten haben.

Wenn die Daten Nullen enthalten, bedeutet dies, dass Sie eine Spitze auf Null haben, die möglicherweise auf einen bestimmten Aspekt Ihrer Daten zurückzuführen ist. Es tritt zum Beispiel bei Windenergie auf, Wind unter 2 m / s erzeugt keine Leistung (es wird als Einschnitt bezeichnet) und Wind über 25 m / s erzeugt ebenfalls keine Leistung (aus Sicherheitsgründen wird es als Ausschluss bezeichnet). . Während die Verteilung der produzierten Windenergie kontinuierlich zu sein scheint, gibt es eine Spitze in Null.

Meine Lösung: In diesem Fall empfehle ich, die Nullen separat zu behandeln, indem Sie mit einer Mischung aus der Spitze in Null und dem Modell arbeiten, das Sie für den Teil der Verteilung verwenden möchten, der kontinuierlich ist (bezogen auf Lebesgue).

Robin Girard
quelle
9

Vergleichen der von @RobHyndman bereitgestellten Antwort mit einer auf negative Werte erweiterten log-plus-eins-Transformation mit der folgenden Form:

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)

Wie Sie sehen, sieht die Transformation mit zunehmender Zunahme von wie eine Sprungfunktion aus. Mit ähnelt es stark der log-plus-eins-Transformation. Und wenn , nähert es sich einer Linie.θ 1 θ 0θθ1θ0

Bildbeschreibung hier eingeben


BEARBEITEN: Beachten Sie, dass die Protokolltransformation mit ähnlichen Ergebnissen in beliebigem Maßstab geändert werden kann. Ich wollte nur zeigen, was auf der Grundlage der vorherigen Antwort ähnliche Ergebnisse liefert. Der größte Unterschied zwischen beiden Ansätzen ist der Bereich in der Nähe von , wie wir an ihren Ableitungen sehen können.x = 0θx=0

Firebug
quelle
8

Da die Zwei-Parameter-Anpassung Box-Cox vorgeschlagen wurde, sind hier einige R, um Eingabedaten anzupassen, eine beliebige Funktion darauf auszuführen (z. B. Zeitreihenvorhersage) und dann die invertierte Ausgabe zurückzugeben:

# 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
quelle
5

Angenommen, Y ist der Geldbetrag, den jeder Amerikaner in einem bestimmten Jahr für ein neues Auto ausgibt (Gesamtkaufpreis). Y erhöht sich auf 0; wird überhaupt keine Werte zwischen 0 und ungefähr 12.000 haben; und nimmt andere Werte meistens in den Teenagern, Zwanzigern und Dreißigern von Tausenden an. Prädiktoren wären Stellvertreter für den Bedarf und / oder das Interesse an einem solchen Kauf. Man kann kaum sagen, dass Bedürfnis oder Interesse für Personen, die keinen Kauf getätigt haben, gleich Null sind. Auf diesen Skalen wären Nicht-Käufer den Käufern viel näher als Y oder sogar das Protokoll von Y vermuten lassen würde. In einem ähnlichen Fall, aber im Gesundheitswesen, stellte ich fest, dass die genauesten Vorhersagen, beurteilt durch Test-Set / Training-Set-Kreuzvalidierung, erhalten wurden durch, in aufsteigender Reihenfolge,

  1. Logistische Regression auf eine binäre Version von Y,
  2. OLS auf Y,
  3. Ordinale Regression (PLUM) für Y in 5 Kategorien unterteilt (um Käufer in 4 gleich große Gruppen zu unterteilen),
  4. Multinomiale logistische Regression von Y in 5 Kategorien unterteilt,
  5. OLS auf dem Log (10) von Y (ich habe nicht daran gedacht, die Kubikwurzel zu probieren) und
  6. OLS auf Y wurde in 5 Kategorien eingeteilt.

Einige werden bei dieser Kategorisierung einer stetigen abhängigen Variablen zurückschrecken. Obwohl es einige Informationen opfert, scheint die Kategorisierung zu helfen, indem ein wichtiger Grundaspekt der Situation wiederhergestellt wird - wiederum, dass die "Nullen" dem Rest viel ähnlicher sind, als Y anzeigen würde.

rolando2
quelle
4
Sie können es auch in zwei Modelle aufteilen: die Wahrscheinlichkeit, ein Auto zu kaufen (binäre Antwort) und den Wert des Autos, das beim Kauf gekauft wurde. Dies ist die Standardpraxis in vielen Bereichen, z. B. Versicherungen, Kreditrisiken usw.
Hong Ooi
1
@ HongOoi - können Sie Lesungen vorschlagen, wann dieser Ansatz anwendbar ist und wann nicht?
Rolando2
4

Die hier diskutierte Yeo-Johnson-Leistungstransformation weist hervorragende Eigenschaften auf, um Nullen und Negative zu verarbeiten und gleichzeitig auf den Stärken der Box-Cox-Leistungstransformation aufzubauen. Dies ist, was ich normalerweise gehe, wenn ich mit Nullen oder negativen Daten zu tun habe.

Hier ist eine Zusammenfassung der Transformationen mit Vor- und Nachteilen, um zu veranschaulichen, warum Yeo-Johnson vorzuziehen ist.

Log

Vorteile: Geht gut mit positiven Daten um.

Nachteile: Behandelt keine Nullen.

> log(0)
[1] -Inf

Log Plus 1

Vorteile: Mit dem Plus-1-Offset können zusätzlich zu positiven Daten auch Nullen verarbeitet werden.

Nachteile: Fehler bei negativen Daten

> log1p(-1)
[1] -Inf
> log1p(-2)
[1] NaN
Warning message:
In log1p(-2) : NaNs produced

Quadratwurzel

Vorteile: Verwendet eine Leistungstransformation, die mit Nullen und positiven Daten umgehen kann.

Nachteile: Fehler bei negativen Daten

> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced

Box Cox

R-Code:

box_cox <- function(x, lambda) {

    eps <- 0.00001
    if (abs(lambda) < eps)
        log(x)
    else
        (x ^ lambda - 1) / lambda

}

Vorteile: Ermöglicht skalierte Leistungstransformationen

Nachteile: Leiden unter Problemen mit Nullen und Negativen (dh können nur positive Daten verarbeiten.

> 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-Code:

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)

}

Vorteile: Kann mit positiven, Null- und negativen Daten umgehen.

Nachteile: Keine, an die ich denken kann. Die Eigenschaften sind denen von Box-Cox sehr ähnlich, können jedoch mit Nulldaten und negativen Daten umgehen.

> 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
quelle
1
Nachteile für Yeo-Johnson: Komplexe, separate Transformation für Positive und Negative sowie für Werte auf beiden Seiten von Lambda, magischer Abstimmungswert (Epsilon; und was ist Lambda?). Kein offensichtlicher Vorteil gegenüber der in Firebugs Antwort gezeigten einfacheren Negativ-Extended-Log-Transformation, es sei denn, Sie benötigen skalierte Power-Transformationen (wie in Box-Cox).
Konrad Rudolph
1

Um zu klären, wie mit dem Null-Log in Regressionsmodellen umgegangen werden soll, haben wir ein pädagogisches Papier verfasst, in dem die beste Lösung und die häufigsten Fehler, die Menschen in der Praxis machen, erläutert werden. Wir haben auch eine neue Lösung für dieses Problem herausgebracht.

Sie finden das Papier, indem Sie hier klicken: https://ssrn.com/abstract=3444996

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

YY+c>0

In unserem Artikel stellen wir tatsächlich ein Beispiel vor, bei dem das Hinzufügen sehr kleiner Konstanten tatsächlich die höchste Verzerrung bewirkt. Wir liefern einen Ausdruck der Voreingenommenheit abzuleiten.

Tatsächlich kann Poisson Pseudo Maximum Likelihood (PPML) als eine gute Lösung für dieses Problem angesehen werden. Man muss den folgenden Prozess berücksichtigen:

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

Wir zeigen, dass dieser Schätzer unbefangen ist und mit GMM mit jeder Standard-Statistiksoftware einfach geschätzt werden kann. Beispielsweise kann dies geschätzt werden, indem nur eine Codezeile mit Stata ausgeführt wird.

Wir hoffen, dass dieser Artikel helfen kann und freuen uns über Ihr Feedback.

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

Christophe Bellégo
quelle