Як перетворити негативні значення на логарифми?


12

Мені хотілося б знати, як перетворити негативні значення Log(), оскільки у мене є гетерокедастичні дані. Я прочитав, що це працює з формулою, Log(x+1)але це не працює з моєю базою даних, і я продовжую отримувати NaNs в результаті. Наприклад, я отримую це Попереджувальне повідомлення (я не помістив повну базу даних, тому що думаю, що одного із моїх негативних значень достатньо, щоб показати приклад):

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

Спасибі заздалегідь

ОНОВЛЕННЯ:

Ось гістограма моїх даних. Я працюю з палеонтологічним часовим рядом хімічних вимірювань, наприклад, різниця між змінними, такими як Ca і Zn, занадто велика, тоді мені потрібен певний тип стандартизації даних, тому я тестую log()функцію. введіть тут опис зображення

Це мої необроблені дані


2
Логарифм визначається лише для позитивних чисел і зазвичай використовується як статистичне перетворення позитивних даних, щоб модель зберегла цю позитивність. log(x+1)Перетворення буде визначено тільки для x > -1, а потім x + 1позитивно. Було б добре дізнатися вашу причину, коли ви хочете в журналі перетворити ваші дані.
Меттью Друрі

3
Розкажіть більше про дані, включаючи діапазон, середнє значення, частоти від’ємних, нульових та позитивних значень. Можливо, узагальнена лінійна модель з посиланням на журнал має найбільш сенс для даних, доки розумно думати, що середня реакція є позитивною. Можливо, ви не повинні взагалі трансформуватися.
Нік Кокс

6
Дякуємо, що додали деталі. Для таких даних 0 має значення (рівність!), Якого слід дотримуватися, дійсно зберігати . З цієї та інших причин я б використав кубічні корені. На практиці вам знадобляться деякі варіанти sign(x) * (abs(x))^(1/3), деталі залежно від синтаксису програмного забезпечення. Докладніше про коріння куба див., Наприклад, stata-journal.com/sjpdf.html?articlenum=st0223 (див. Esp. Pp. 152-3). Ми використовували коріння куба для візуалізації змінної відповіді, яка може мати позитивний та негативний характер .com / природа / журнал / v500 / n7464 / повний /…
Нік Кокс

8
Чому ви не перетворюєте оригінальні змінні замість відмінностей?
whuber

4
log(x+4)x>45

Відповіді:


14

Оскільки логарифм визначений лише для додатних чисел, ви не можете прийняти логарифм від'ємних значень. Однак якщо ви прагнете отримати кращий розподіл своїх даних, ви можете застосувати наступне перетворення.

Припустимо, ви перекосили негативні дані:

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

(1,1)

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

і, нарешті, застосувати зворотний гіперболічний дотичний:

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

Тепер ваші дані виглядають приблизно нормально. Це також називається перетворенням Фішера.


9
atanh[(xmin(x))/(max(x)min(x))]

2
@NickCox Ви абсолютно праві. Можливо, якщо ОП додасть більше деталей щодо його проблеми, ми могли б знайти альтернативне рішення!
stochazesthai

Внутрішній аргумент у моєму першому коментарі - це не те, що трансформується, а дух мого коментаря - я думаю, що це не впливає.
Нік Кокс

Шановний @stochazesthai, дякую за ваше детальне пояснення, але я не можу застосувати ваш код до моїх даних. Я оновив своє запитання за допомогою посилання на мої вихідні дані наприкінці.
ПК Дарвіна

Висловлювання z <- z[-max(z)]і z <- z[-min(z)]недоцільно скорочуються zдо єдиного значення. Також загальна функція atanh(((x - min(x)) / (max(x) - min(x))))виробляє Infдля мінімальних і максимальних значень x.
Макс Ghenis

-1

Щоб перетворити його в масштаб журналу, спочатку знайдіть журнал додатного числа, а потім помножте його на його знак, слід зробити наступний код.

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

Використовуючи наведений вище приклад, ми можемо побудувати наступний перекошений розподіл

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

введіть тут опис зображення

Використовуючи функцію перетворення наступним чином, ми отримуємо розподіл, який виглядає більш "нормальним"

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

введіть тут опис зображення


3
(1) Більшість мов програмування ( Rвключені) реалізують функцію signum (яка повертає -1 для від'ємних чисел, 1 для додатних чисел і 0 для нуля). Використовувати його було б виразніше і швидше. (2) Ваша пропозиція погана для аналізу даних, подібних до проілюстрованих, оскільки вона має величезний перерив у нулі!
whuber

дякую за signum, я не знав про це, цікаво, як це реалізується
yosemite_k

3
Існують різні способи. У багатьох архітектурах процесорів біт знаків встановлюється після багатьох операцій, тому його можна було використовувати. У поданні IEEE з подвійною точністю з плаваючою точкою знак можна знайти, перевіривши один біт (плюс ще один швидкий тест на справжній нуль). У конвеєрних архітектурах з прогнозним розгалуженням тощо, зазвичай набагато ефективніше не розгалужуватись, якщо це взагалі можливо, саме тому використання вбудованої версії signum може бути суттєвим обчислювальним виграшем. Між іншим, встановлення, y <- 1коли виглядає довільним - це справді може накрутити статистичний аналіз. x=0
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.