Jak przekształcić dane nieujemne, w tym zera?


191

Jeśli mam bardzo wypaczone pozytywne dane, często biorę dzienniki. Ale co mam zrobić z mocno wypaczonymi nieujemnymi danymi, które zawierają zera? Widziałem dwie zastosowane transformacje:

  • log(x+1) który ma ciekawą funkcję, która 0 odwzorowuje na 0.
  • log(x+c) gdzie c jest albo oszacowane, albo ustawione na bardzo małą wartość dodatnią.

Czy są jakieś inne podejścia? Czy są jakieś dobre powody, aby preferować jedno podejście od innych?


19
Podsumowałem niektóre odpowiedzi oraz inne materiały na stronie robjhyndman.com/researchtips/transformations
Rob Hyndman,

5
doskonały sposób na transformację i promocję stat.stackoverflow!
robin girard

Tak, zgadzam się na @robingirard (właśnie tu przybyłem z powodu postu Roba na blogu)!
Ellie Kesselman,

Zobacz także stats.stackexchange.com/questions/39042/..., aby znaleźć aplikację do danych ocenzurowanych z lewej strony (które można scharakteryzować, aż do zmiany lokalizacji, dokładnie tak, jak w niniejszym pytaniu).
whuber

2
Pytanie o sposób transformacji wydaje się dziwne, nie mówiąc przede wszystkim o celu transformacji. Jaka jest sytuacja? Dlaczego konieczna jest transformacja? Jeśli nie wiemy, co próbujesz osiągnąć, jak można cokolwiek rozsądnie zasugerować ? (Oczywiście nie można mieć nadziei na przejście do normalności, ponieważ istnienie (niezerowego) prawdopodobieństwa zer zerowych oznacza skok w rozkładzie na zero, którego piku żadna transformacja nie usunie - może jedynie go przesuwać.)
Glen_b

Odpowiedzi:


55

Wydaje mi się, że najwłaściwszy wybór transformacji zależy od modelu i kontekstu.

Punkt „0” może wynikać z kilku różnych powodów, z których każdy może wymagać innego traktowania:

  • Obcięcie (jak w przykładzie Robina): Użyj odpowiednich modeli (np. Mieszanin, modeli przetrwania itp.)
  • Brakujące dane: dane Impute / obserwacje upuszczenia, jeśli jest to właściwe.
  • Naturalny punkt zerowy (np. Poziom dochodów; bezrobotny ma zerowy dochód): Przekształć w razie potrzeby
  • Czułość przyrządu pomiarowego: Być może dodać niewielką ilość danych?

Naprawdę nie oferuję odpowiedzi, ponieważ podejrzewam, że nie ma uniwersalnej, „poprawnej” transformacji, gdy masz zera.


6
Każda odpowiedź na moje pytanie zawierała przydatne informacje, a ja głosowałem na nie wszystkie. Ale mogę wybrać tylko jedną odpowiedź, a Srikant's zapewnia najlepszy przegląd IMO.
Rob Hyndman,

2
Zauważ też, że istnieją modele z napompowaniem zerowym (dodatkowe zera i zależy Ci na niektórych zerach: model mieszany) i modele przeszkodowe (zera i zależy ci na zerach: model dwustopniowy z początkowym modelem ocenzurowanym).
Wayne,

82

Nikt nie wspominał o odwrotnej hiperbolicznej transformacji sinusoidalnej. Więc dla kompletności dodam go tutaj.

Jest to alternatywa dla transformacji Box-Coxa i jest zdefiniowana przez gdzie . Dla dowolnej wartości zero zmienia się na zero. Istnieje również wersja dwuparametrowa umożliwiająca przesunięcie, podobnie jak w przypadku dwuparametrowej transformacji BC. Burbidge, Magee i Robb (1988) omawiają transformację IHS, w tym oszacowanie .θ > 0 θ θ

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

Transformacja IHS działa z danymi zdefiniowanymi na całej linii rzeczywistej, w tym wartościami ujemnymi i zerami. W przypadku dużych wartości zachowuje się jak transformacja dziennika, niezależnie od wartości (z wyjątkiem 0). Ograniczająca wielkość liter jako daje .θ θ 0 f ( y , θ ) yyθθ0f(y,θ)y

Wydaje mi się, że transformacja IHS powinna być o wiele lepiej znana niż obecnie.


1
Wygląda na dobrą alternatywę dla transformacji / logistycznychtanh
Firebug

1
O IHS niektórych wydaje się nie zgadzają: onlinelibrary.wiley.com/doi/10.1890/10-0340.1/abstract
Kjetil b Halvorsen

3
Ten artykuł dotyczy odwrotnej sinusoidy, a nie odwrotnego sinusa hiperbolicznego.
Bryan

42

Przydatnym podejściem, gdy zmienna jest używana jako niezależny czynnik w regresji, jest zastąpienie jej dwiema zmiennymi: jedna jest binarnym wskaźnikiem tego, czy wynosi zero, a druga jest wartością oryginalnej zmiennej lub jej ponownym wyrażeniem, takie jak jego logarytm. Technikę tę omówiono w książce Hosmer & Lemeshow na temat regresji logistycznej (i w innych miejscach, jestem pewien). Skrócone wykresy prawdopodobieństwa dodatniej części oryginalnej zmiennej są przydatne do identyfikacji odpowiedniego ponownego wyrażenia. (Zobacz przykłady na https://stats.stackexchange.com/a/30749/919 ).

Kiedy zmienna jest zależna w modelu liniowym, regresja ocenzurowana (jak Tobit ) może być użyteczna, ponownie eliminując potrzebę tworzenia logarytmu początkowego. Ta technika jest powszechna wśród ekonometrów.


1
Czy modelowanie danych jako Poissona z zerowym napełnieniem jest szczególnym przypadkiem tego podejścia?
David LeBauer,

4
@David, choć wydaje się podobny, nie jest, ponieważ ZIP jest modelem zmiennej zależnej , a nie zmiennej niezależnej.
whuber

1
@whuber Technikę tę omówiono w książce Hosmer & Lemeshow na temat regresji logistycznej. Czy przypadkiem wiesz, w którym rozdziale omawiają tę technikę? Patrzę na ich książkę, ale nie mogę znaleźć właściwej strony ...
landroni

1
@landroni H&L był wtedy w mojej głowie świeży, więc jestem pewien, że w tej książce jest coś związanego z tym tematem. (Konsultowałem się z nim w celu opracowania bardzo dużych modeli regresji i wiele niezależnych zmiennych musiało być traktowanych w ten sposób.) Jednak w tym momencie nie mogę również znaleźć odniesienia. O tej technice pisałem w kolejnych postach, na wypadek, gdybyś szukał szczegółów. Dwa, które pojawiają się podczas wyszukiwania witryny, znajdują się na stronie stats.stackexchange.com/questions/6563 i stats.stackexchange.com/questions/4831 .
whuber

1
@landroni Tak, są równoważne, w taki sam sposób, jak wszystkie kodowania numeryczne dowolnej zmiennej binarnej są równoważne. Wybierz ten, który uznasz za najwygodniejszy do interpretacji.
whuber

37

Transformacje logów ze zmianami są specjalnymi przypadkami transformacji Box-Cox :

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

Są to rozszerzone formularze dla wartości ujemnych, ale mają również zastosowanie do danych zawierających zera. Box and Cox (1964) przedstawia algorytm znajdowania odpowiednich wartości dla przy maksymalnym prawdopodobieństwie. To daje ostateczną transformację. λ

Powodem preferowania transformacji Box-Coxa jest to, że opracowano je w celu zapewnienia założeń dla modelu liniowego. Wykonano pewne prace, aby wykazać, że nawet jeśli twoich danych nie można przekształcić do normalności, szacowana nadal prowadzi do rozkładu symetrycznego.λ

Nie jestem pewien, jak dobrze to adresuje twoje dane, ponieważ może być tak, że która jest tylko logarytmiczną transformacją, o której wspomniałeś, ale może warto oszacować wymagane , aby sprawdzić, czy inna transformacja jest właściwa.λ=(0,1)λ

W R boxcox.fitfunkcja w pakiecie geoRobliczy parametry.


hmm, nie mogę sprawić, by lateks „zaczął przypadki”, aby zaakceptować nowe linie. : - /
ars

@ars Naprawiłem eqns, aby używał początkowych przypadków. Mam nadzieję, że nie zmieniłem przy tym ekwipunku.

1
@Rob: Przepraszam. GeoR Diggle'a jest właściwą drogą - ale określ lambda2=TRUEw argumentach do boxcox.fit. (Również zaktualizowałem odpowiedź.)
ars

3
@ gd047: oto miłym referencyjny: elevatorlady.ca/doc/refcard/expressions.html
ars

6
Dla każdego, kto czyta to zastanawianie się, co się stało z tą funkcją, jest ona teraz wywoływana boxcoxfit.
stragu

19

Zakładam, że zero! = Brakujące dane, ponieważ to zupełnie inne pytanie.

Myśląc o tym, jak radzić sobie z zerami w wielu regresjach liniowych, zastanawiam się, ile faktycznie mamy zer?

Tylko kilka zer

Jeśli mam jedno zero w stosunkowo dużym zbiorze danych, mam tendencję do:

  1. Usuń punkt, weź dzienniki i dopasuj model
  2. Dodaj małe do rzeczy, weź dzienniki i dopasuj modelc

Czy dopasowanie modelu się zmienia? Co z wartościami parametrów? Jeśli model jest dość odporny na usunięcie punktu, wybiorę szybkie i brudne podejście do dodawania .c

Możesz uczynić tę procedurę nieco mniej surową i zastosować metodę boxcox z przesunięciami opisanymi w odpowiedzi ars.

Duża liczba zer

Jeśli mój zestaw danych zawiera dużą liczbę zer, oznacza to, że prosta regresja liniowa nie jest najlepszym narzędziem do zadania. Zamiast tego użyłbym czegoś takiego jak modelowanie mieszanin (jak sugerują Srikant i Robin).


15

Jeśli chcesz czegoś szybkiego i brudnego, dlaczego nie użyć pierwiastka kwadratowego?


7
I często transformacja pierwiastka kostki działa dobrze i pozwala na zera i negatywy. Stwierdziłem, że pierwiastek sześcianu szczególnie dobrze działa, gdy na przykład pomiar jest objętością lub liczbą cząstek na jednostkę objętości. Korzeń sześcianu przekształciłby go w wymiar liniowy. Bardziej elastycznym podejściem jest dopasowanie ograniczonego splajnu sześciennego (splajnu naturalnego) do pierwiastka sześcianu lub pierwiastka kwadratowego, umożliwiając niewielkie odchylenie od założonej formy.
Frank Harrell,

2
+1. Mały artykuł na temat pierwiastków kostki znajduje się na stata-journal.com/article.html?article=st0223 (będzie to darmowy plik .pdf z pierwszego kwartału 2014 r.)
Nick Cox

2
Pierwiastek kwadratowy zera wynosi zero, więc transformowane są tylko wartości niezerowe. Nie ma to nic wspólnego z kolcem, jeśli zero jest zawyżone, i może powodować poważne problemy, jeśli w grupach każda ma inną liczbę zer. Innymi słowy, jeśli niektóre grupy mają wiele zer, a inne mają niewiele, transformacja może wpłynąć na wiele rzeczy w negatywny sposób. W przypadku grupy o największej wariancji (która również miała najmniej zer), prawie wszystkie wartości są przekształcane. W przeciwieństwie do tych, które mają najwięcej zer, niewiele wartości jest przekształcanych. To może zmienić, która grupa ma największą wariancję.
D_Williams,

Żadna transformacja nie zachowa wariancji w przypadku opisanym przez @D_Williams. Modele mieszanin (wspomniane gdzie indziej w tym wątku) byłyby prawdopodobnie dobrym rozwiązaniem w tym przypadku.
mkt

10

Zakładam, że masz ciągłe dane.

Jeśli dane zawierają zera, oznacza to, że masz skok zerowy, co może wynikać z określonego aspektu twoich danych. Pojawia się na przykład w energii wiatru, wiatr poniżej 2 m / s wytwarza zerową moc (nazywa się to odcięciem), a wiatr nad (coś około) 25 m / s również wytwarza zerową moc (ze względów bezpieczeństwa nazywany jest odcięciem) . Podczas gdy dystrybucja wytwarzanej energii wiatrowej wydaje się ciągła, skok jest zerowy.

Moje rozwiązanie: w tym przypadku sugeruję, aby traktować zera osobno, pracując z mieszaniną wartości szczytowej zera i modelem, który planowałeś zastosować dla części rozkładu, która jest ciągła (wrt Lebesgue).


9

Porównując odpowiedź dostarczoną przez @RobHyndman z transformacją log-plus-one rozszerzoną na wartości ujemne z 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)

Jak widać, wraz ze wzrostem transformacja wygląda jak funkcja krokowa. Z wygląda bardzo podobnie do transformacji log-plus-one. A kiedy zbliża się do linii.θ 1 θ 0θθ1θ0

wprowadź opis zdjęcia tutaj


EDYCJA: Pamiętaj, że transformacja dziennika może być podobnie zmieniona do dowolnej skali, z podobnymi wynikami. Chciałem tylko pokazać, co daje podobne wyniki na podstawie poprzedniej odpowiedzi. Największa różnica między obydwoma podejściami to region blisko , co widać po ich pochodnych.x = 0θx=0


8

Ponieważ zaproponowano dwuparametrowe dopasowanie Box-Coxa, oto R, aby dopasować dane wejściowe, uruchomić na nim dowolną funkcję (np. Prognozowanie szeregów czasowych), a następnie zwrócić odwrócone dane wyjściowe:

# 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))
}

5

Załóżmy, że Y to kwota, jaką każdy Amerykanin wydaje na nowy samochód w danym roku (całkowita cena zakupu). Y wzrośnie do zera; nie będzie miał żadnych wartości od 0 do około 12 000; i przyjmą inne wartości, głównie w wieku dwudziestu i trzydziestu tysięcy. Predyktorzy byliby przybliżeniami do poziomu potrzeby i / lub zainteresowania dokonaniem takiego zakupu. Nie można powiedzieć, że potrzeba lub zainteresowanie wynosi zero dla osób, które nie dokonały zakupu; w tych skalach osoby niebędące nabywcami byłyby znacznie bliżej nabywców niż Y, a nawet log Y sugerowałby. W przypadku bardzo podobnym do tego, ale w służbie zdrowia, stwierdziłem, że najdokładniejsze przewidywania, ocenione na podstawie krzyżowej walidacji zestawu testowego / zestawu treningowego, zostały uzyskane w kolejności rosnącej,

  1. Regresja logistyczna na binarnej wersji Y,
  2. OLS na Y,
  3. Regresja porządkowa (PLUM) na Y podzielona na 5 kategorii (aby podzielić nabywców na 4 grupy jednakowej wielkości),
  4. Wielomianowa regresja logistyczna na Y podzielona na 5 kategorii,
  5. OLS w logu (10) Y (nie myślałem o wypróbowaniu katalogu głównego kostki) i
  6. OLS na Y podzielony na 5 kategorii.

Niektórzy odskoczą od tej kategoryzacji ciągłej zmiennej zależnej. Ale choć poświęca niektóre informacje, kategoryzacja wydaje się pomóc, przywracając ważny podstawowy aspekt sytuacji - ponownie, że „zera” są znacznie bardziej podobne do reszty, niż wskazuje Y.


4
Możesz również podzielić go na dwa modele: prawdopodobieństwo zakupu samochodu (odpowiedź binarna) oraz wartość samochodu przy zakupie. Jest to standardowa praktyka w wielu dziedzinach, np. Ubezpieczenie, ryzyko kredytowe itp.
Hong Ooi

1
@HongOoi - czy możesz zasugerować jakieś odczyty, kiedy to podejście jest i nie ma zastosowania?
rolando2

4

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

1
Wady dla Yeo – Johnsona: złożona, osobna transformacja dla pozytywów i negatywów oraz dla wartości po obu stronach lambda, magiczna wartość strojenia (epsilon; a czym jest lambda?). Brak wyraźnej przewagi w porównaniu do prostszej transformacji dziennika z rozszerzeniem ujemnym pokazanej w odpowiedzi Firebuga, chyba że potrzebujesz skalowanych transformacji mocy (jak w Box-Cox).
Konrad Rudolph,

1

Aby wyjaśnić, jak radzić sobie z logarytmem zerowym w modelach regresji, napisaliśmy artykuł pedagogiczny wyjaśniający najlepsze rozwiązanie i typowe błędy, które ludzie popełniają w praktyce. Opracowaliśmy również nowe rozwiązanie tego problemu.

Artykuł możesz znaleźć, klikając tutaj: https://ssrn.com/abstract=3444996

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

YY+c>0

W naszym artykule podajemy przykład, w którym dodanie bardzo małych stałych zapewnia najwyższe odchylenie. Zapewniamy wyraz wyrażenia stronniczości.

W rzeczywistości Pseudo maksymalne prawdopodobieństwo Poissona (PPML) można uznać za dobre rozwiązanie tego problemu. Należy wziąć pod uwagę następujący proces:

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

Pokazujemy, że ten estymator jest bezstronny i że można go po prostu oszacować za pomocą GMM za pomocą dowolnego standardowego oprogramowania statystycznego. Na przykład można to oszacować, wykonując tylko jedną linię kodu za pomocą Stata.

Mamy nadzieję, że ten artykuł może pomóc i chcielibyśmy uzyskać od Ciebie informację zwrotną.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.