Как преобразовать отрицательные значения в логарифмы?

12

Я хотел бы знать, как преобразовать отрицательные значения в Log(), так как у меня есть гетероскедастические данные. Я прочитал, что это работает с формулой, Log(x+1)но это не работает с моей базой данных, и я продолжаю получать NaN в результате. Например, я получаю это предупреждение (я не поместил свою полную базу данных, потому что я думаю, что одного из моих отрицательных значений достаточно, чтобы показать пример):

> 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. Стр.152-3). Мы использовали корни куба, чтобы помочь визуализации переменной ответа, которая может быть положительной и отрицательной по своей природе .com / nature / journal / v500 / n7464 / full /…
Ник Кокс
8
Почему вы не преобразуете исходные переменные вместо различий?
whuber
4
Вы решили математическую задачу. Я думаю, что с предложением @ whuber или корнями куба было бы легче работать, особенно если константа является чисто эмпирической или варьируется между переменными. Хорошее правило для выбора преобразований - использовать только преобразования, которые будут работать для похожих данных, которые вы можете себе представить. Таким образом, «работает» для но потерпит неудачу, если ваша следующая партия будет ограничена ..x > - 4 - 5log(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))

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

stochazesthai
источник
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.
Макс Генис
-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)))

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

yosemite_k
источник
3
(1) Большинство языков программирования ( Rвключены) реализуют функцию signum (которая возвращает -1 для отрицательных чисел, 1 для положительных чисел и 0 для нуля). Использование было бы более выразительным и быстрым. (2) Ваше предложение плохое для анализа данных, подобных показанным, потому что оно имеет огромный разрыв в нуле!
whuber
спасибо за Signum, я не знал об этом, интересно , как это реализовано
yosemite_k
3
Есть разные способы. Во многих процессорных архитектурах после многих операций устанавливается знаковый бит, поэтому его можно использовать. В представлении с плавающей точкой двойной точности IEEE знак можно найти, проверив один бит (плюс еще один быстрый тест на истинный ноль). В конвейерных архитектурах с прогнозирующим ветвлением и т. Д. Обычно гораздо эффективнее не ветвиться, если это вообще возможно, поэтому использование встроенной версии signum может быть значительным вычислительным преимуществом. Между прочим, установка, y <- 1когда выглядит произвольно - это может действительно испортить статистический анализ. x=0
whuber