Jak przekształcić wartości ujemne na logarytmy?

12

Chciałbym wiedzieć, jak przekształcić wartości ujemne Log(), ponieważ mam dane heteroskedastyczne. Przeczytałem, że działa ze wzorem, Log(x+1)ale to nie działa z moją bazą danych i nadal otrzymuję NaN. Np. Dostaję ten komunikat ostrzegawczy (nie umieściłem całej bazy danych, ponieważ myślę, że jedna z moich wartości ujemnych wystarczy, aby pokazać przykład):

> log(-1.27+1)
[1] NaN
Warning message:
In log(-1.27 + 1) : NaNs produced
> 

Z góry dziękuję

AKTUALIZACJA:

Oto histogram moich danych. Pracuję z paleontologicznymi szeregami czasowymi pomiarów chemicznych, np. Różnica między zmiennymi takimi jak Ca i Zn jest zbyt duża, to potrzebuję pewnego rodzaju standaryzacji danych, dlatego testuję tę log()funkcję. wprowadź opis zdjęcia tutaj

To są moje surowe dane

Darwin PC
źródło
2
Logarytm jest zdefiniowany tylko dla liczb dodatnich i jest zwykle używany jako transformacja statystyczna dla danych dodatnich, aby model zachował tę pozytywność. log(x+1)Transformacja jest zdefiniowana tylko dla x > -1, ponieważ wtedy x + 1jest dodatni. Dobrze byłoby poznać powód, dla którego chcesz logować transformację danych.
Matthew Drury
3
Powiedz nam więcej o danych, w tym zakresie, średniej, częstotliwościach wartości ujemnych, zerowych i dodatnich. Może się zdarzyć, że uogólniony model liniowy z łączem logicznym ma największy sens dla danych, o ile uzasadnione jest przypuszczenie, że średnia odpowiedź jest pozytywna. Możliwe, że wcale nie powinieneś się transformować.
Nick Cox,
6
Dziękujemy za dodanie szczegółów. Dla takich danych 0 ma znaczenie (równość!), Które należy uszanować, a nawet zachować . Z tego i innych powodów użyłbym pierwiastków kostki. W praktyce będziesz potrzebować trochę zmian sign(x) * (abs(x))^(1/3), w zależności od składni oprogramowania. Więcej informacji na temat pierwiastek sześcienny patrz np stata-journal.com/sjpdf.html?articlenum=st0223 (patrz zwł. Pp.152-3) korzenie .My używane kostki do pomocy wizualizacji zmiennej odpowiedzi, które mogą być pozytywne i negatywne w przyrodzie .pl / nature / journal / v500 / n7464 / full /…
Nick Cox
8
Dlaczego nie zmieniasz oryginalnych zmiennych zamiast różnic?
whuber
4
Rozwiązałeś problem matematyczny. Wydaje mi się, że @ sugestia Whubera lub pierwiastki kostki byłyby łatwiejsze do pracy, szczególnie jeśli stała jest czysto empiryczna lub zmienia się pomiędzy zmiennymi. Dobrą zasadą wyboru transformacji jest stosowanie tylko transformacji, które działałyby dla podobnych danych, jakie można sobie wyobrazić. Tak więc „działa” dla ale nie powiedzie się, jeśli twoja następna partia zostanie ograniczona przez ..log(x+4)x>45
Nick Cox

Odpowiedzi:

14

Ponieważ logarytm jest zdefiniowany tylko dla liczb dodatnich, nie można przyjąć logarytmu wartości ujemnych. Jeśli jednak chcesz uzyskać lepszą dystrybucję swoich danych, możesz zastosować następującą transformację.

Załóżmy, że wypaczyłeś negatywne dane:

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

następnie możesz zastosować pierwszą transformację, aby Twoje dane leżały w :(1,1)

z <- (x - min(x)) / (max(x) - min(x)) * 2 - 1
z <- z[-min(z)]
z <- z[-max(z)]
min(z); max(z)

i na koniec zastosuj odwrotną styczną hiperboliczną:

t <- atanh(z)
plot(density(t))

Teraz Twoje dane wyglądają mniej więcej normalnie. Nazywa się to również transformacją Fishera.

stochazesthai
źródło
9
Rozwiązałeś bezpośredni problem matematyczny. Ale nie sądzę, aby najbardziej prawdopodobnym konsumentom wyników statystycznych łatwo byłoby pomyśleć o jako skala reakcji, a podczas modelowania trzeba pomyśleć, która struktura błędu ma sens. Skala byłaby wrażliwa na empiryczne minimum i maksimum. atanh[(xmin(x))/(max(x)min(x))]
Nick Cox,
2
@NickCox Masz absolutną rację. Może jeśli OP doda więcej szczegółów na temat swojego problemu, moglibyśmy znaleźć alternatywne rozwiązanie!
stochazesthai
Wewnętrzny argument w moim pierwszym komentarzu nie dotyczy tego, co się transformuje, ale duch mojego komentarza jest taki, jak sądzę, bez zmian.
Nick Cox,
Drogi @stochazesthai, dziękuję za szczegółowe wyjaśnienie, ale nie mogę zastosować twojego kodu do moich danych. Na końcu zaktualizowałem swoje pytanie, podając link do moich surowych danych.
Darwin PC
Stwierdzenia z <- z[-max(z)]i z <- z[-min(z)]niewłaściwie zmniejszają zsię do jednej wartości. Również funkcja ogólna atanh(((x - min(x)) / (max(x) - min(x))))generuje Infwartości minimalne i maksymalne wynoszące x.
Max Ghenis,
-1

Aby przekształcić go w skalę dziennika, najpierw znajdź dziennik liczby dodatniej, a następnie pomnóż go przez jego znak, następujący kod powinien to zrobić.

transform_to_log_scale <- function(x){
    if(x==0){
        y <- 1
    } else {
        y <- (sign(x)) * (log(abs(x)))
    }
        y 
    }

Korzystając z powyższego przykładu, możemy wykreślić następujący przekrzywiony rozkład

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

wprowadź opis zdjęcia tutaj

Po użyciu funkcji przekształcania w następujący sposób, otrzymujemy rozkład, który wygląda bardziej „normalnie”

plot(density(sapply(x,FUN=transform_logs_scale)))

wprowadź opis zdjęcia tutaj

yosemite_k
źródło
3
(1) Większość języków programowania (w Rzestawie) implementuje funkcję signum (która zwraca -1 dla liczb ujemnych, 1 dla liczb dodatnich i 0 dla zer). Korzystanie z niego byłoby bardziej wyraziste i szybsze. (2) Twoja propozycja jest kiepska do analizy danych takich jak te przedstawione, ponieważ ma ogromną nieciągłość na poziomie zerowym!
whuber
dzięki za signum, nie wiedziałem o tym, zastanawiam się, jak to jest realizowane
yosemite_k
3
Istnieją różne sposoby. W wielu architekturach procesorów bit znaku jest ustawiany po wielu operacjach, więc można go użyć. W reprezentacji zmiennoprzecinkowej podwójnej precyzji IEEE znak można znaleźć, sprawdzając pojedynczy bit (plus kolejny szybki test na prawdziwe zero). W architekturach potokowych z rozgałęzianiem predykcyjnym itp. Zwykle znacznie wydajniej nie rozgałęziać, jeśli to w ogóle możliwe, dlatego użycie wbudowanej wersji signum może być znaczącym zyskiem obliczeniowym. Nawiasem mówiąc, ustawienie, y <- 1gdy wygląda na dowolne - może naprawdę popsuć analizę statystyczną. x=0
whuber