Как мне преобразовать неотрицательные данные, включая нули?


191

Если у меня сильно искажены положительные данные, я часто беру логи. Но что мне делать с сильно искаженными неотрицательными данными, которые содержат нули? Я видел два использованных преобразования:

  • log(x+1) который имеет аккуратную особенность, которая 0 отображается на 0.
  • log(x+c) где c либо оценивается, либо устанавливается как очень небольшое положительное значение.

Есть ли другие подходы? Есть ли веские причины предпочитать один подход другим?


19
Я кратко изложил некоторые ответы и некоторые другие материалы по адресу robjhyndman.com/researchtips/transformations
Роб Хиндман,

5
отличный способ трансформировать и продвигать stat.stackoverflow!
Робин Жирар

Да, я согласен @robingirard (я только что прибыл сюда из-за сообщения в блоге Роба)!
Элли Кессельман

Также см. Stats.stackexchange.com/questions/39042/… для применения к данным, подвергнутым левой цензуре (которые можно охарактеризовать, вплоть до смещения местоположения, точно так же, как в настоящем вопросе).
whuber

2
Кажется странным спрашивать о том, как трансформироваться, не указав в первую очередь цель трансформации. Что за ситуация? Почему необходимо преобразовать? Если мы не знаем, чего вы пытаетесь достичь, как можно разумно предложить что-нибудь ? (Ясно, что нельзя надеяться на преобразование в нормальное состояние, поскольку наличие (ненулевой) вероятности точных нулей подразумевает скачок в распределении в нуле, который не удалит никакое преобразование - он может только перемещать его.)
Glen_b

Ответы:


55

Мне кажется, что наиболее подходящий выбор преобразования зависит от модели и контекста.

Точка '0' может возникать по нескольким различным причинам, каждая из которых может рассматриваться по-разному:

  • Усечение (как в примере Робина): используйте соответствующие модели (например, смеси, модели выживания и т. Д.)
  • Отсутствующие данные: вменять данные / отбросить наблюдения, если это необходимо
  • Естественная нулевая точка (например, уровень дохода; безработный имеет нулевой доход): трансформируйте по мере необходимости
  • Чувствительность измерителя: возможно, добавить небольшое количество данных?

Я на самом деле не предлагаю ответ, так как подозреваю, что универсального, «правильного» преобразования нет, когда у вас есть нули.


6
Каждый ответ на мой вопрос предоставил полезную информацию, и я проголосовал за них всех. Но я могу выбрать только один ответ, и Srikant предлагает лучший обзор IMO.
Роб Хиндман

2
Также обратите внимание, что существуют модели с нулевым раздувом (дополнительные нули, и вы заботитесь о некоторых нолях: смешанная модель) и модели с барьерами (нули, и вы заботитесь о ненулевых значениях: двухэтапная модель с исходной цензурированной моделью).
Уэйн

82

Никто не упомянул обратное преобразование гиперболического синуса. Поэтому для полноты я добавляю это сюда.

Это альтернатива преобразованиям Бокса-Кокса и определяется как где . Для любого значения ноль отображается на ноль. Существует также двухпараметрическая версия, допускающая сдвиг, так же, как и при двухпараметрическом преобразовании BC. Burbidge, Magee и Robb (1988) обсуждают трансформацию IHS, включая оценку .thetas ; > 0 & thetas ; & thetas ;

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

Преобразование IHS работает с данными, определенными на всей реальной линии, включая отрицательные значения и нули. Для больших значений он ведет себя как преобразование журнала, независимо от значения (кроме 0). Предельный случай как дает .θ θ 0 f ( y , θ ) yyθθ0f(y,θ)y

Мне кажется, что преобразование IHS должно быть лучше известно, чем оно есть.


1
Похоже, хорошая альтернатива / логистических преобразованийtanh
Firebug

1
По поводу IHS некоторые, похоже, не согласны: onlinelibrary.wiley.com/doi/10.1890/10-0340.1/abstract
kjetil b halvorsen

3
Эта статья о обратном преобразовании синуса, а не об обратном гиперболическом синусе.
Брайан

42

Полезный подход, когда переменная используется в качестве независимого фактора в регрессии, заключается в замене ее на две переменные: одна представляет собой двоичный индикатор того, является ли она нулевой, а другая представляет собой значение исходной переменной или ее повторное выражение, такой как его логарифм. Эта техника обсуждается в книге Хосмера и Лемешоу по логистической регрессии (и в других местах, я уверен). Усеченные вероятностные графики положительной части исходной переменной полезны для определения подходящего повторного выражения. (См. Анализ по адресу https://stats.stackexchange.com/a/30749/919 для примеров.)

Когда переменная является зависимой в линейной модели, цензурная регрессия (например, Tobit ) может быть полезна, снова устраняя необходимость производить начальный логарифм. Этот метод распространен среди эконометристов.


1
Является ли моделирование данных с нуля Пуассона частным случаем этого подхода?
Дэвид Лебауэр

4
@David, хотя это кажется похожим, это не так, потому что ZIP является моделью зависимой переменной, а не независимой переменной.
whuber

1
@whuber Этот метод обсуждается в книге Хосмера и Лемешоу о логистической регрессии. Вы случайно не узнали, в какой главе они обсуждают этот метод? Я смотрю на их книгу, но не могу найти нужную страницу ...
Ландрони

1
@landroni H & L тогда был свежим в моей памяти, поэтому я уверен, что в этой книге есть что- то , связанное с этой темой. (Я консультировался с ним, чтобы разработать некоторые очень большие регрессионные модели, и многие независимые переменные должны были обрабатываться таким образом.) Однако я не могу найти ссылку и на этом этапе. Я писал об этой технике в следующих постах, на случай, если вы ищете детали. Два из них, которые отображаются в поиске по сайту, находятся по адресу stats.stackexchange.com/questions/6563 и stats.stackexchange.com/questions/4831 .
whuber

1
@landroni Да, они эквивалентны, так же как все числовые кодировки любой двоичной переменной эквивалентны. Выберите тот, который вы считаете наиболее удобным для интерпретации.
whuber

37

Лог-преобразования со сдвигами являются частными случаями преобразований Бокса-Кокса :

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

Это расширенная форма для отрицательных значений, но также применимая к данным, содержащим нули. Бокс и Кокс (1964) представляют алгоритм для поиска подходящих значений для с максимальной вероятностью. Это дает вам окончательное преобразование. λ

Причина, по которой предпочтение отдается преобразованиям Бокса-Кокса, заключается в том, что они разработаны для обеспечения допущений для линейной модели. Была проделана определенная работа, чтобы показать, что даже если ваши данные не могут быть преобразованы в нормальное состояние, то оценочное значение все равно приведет к симметричному распределению.λ

Я не уверен, насколько хорошо это обращается к вашим данным, так как это может быть тот который является просто преобразованием журнала, которое вы упомянули, но, возможно, стоит оценить требуемые , чтобы увидеть, если другой преобразование уместно.λλ=(0,1)λ

В R boxcox.fitфункция в пакете geoRвычислит параметры для вас.


хм, не могу заставить латекс "начинать дела", чтобы принимать новые строки. : - /
АРС

@ars Я исправил eqns, чтобы использовать начало. Я надеюсь, что я не искажал eqns в процессе.

1
@Rob: Ой, прости. GeoR Диггла - путь, но укажите lambda2=TRUEв аргументах boxcox.fit. (Также обновленный ответ.)
АРС

3
@ gd047: вот хорошая ссылка: elevatorlady.ca/doc/refcard/expressions.html
АРС

6
Для тех, кто читает это, интересно, что случилось с этой функцией, теперь она вызывается boxcoxfit.
Страгу

19

Я предполагаю, что ноль! = Пропущенные данные, так как это совершенно другой вопрос.

Размышляя о том, как обращаться с нулями в множественной линейной регрессии, я склонен учитывать, сколько нулей у нас на самом деле?

Только пара нулей

Если у меня достаточно одного нуля в достаточно большом наборе данных, я склонен:

  1. Убери точку, возьми логи и подгони модель
  2. Добавьте маленькую к", возьмите логи и подгоните модельc

Меняется ли модель? Как насчет значений параметров? Если модель достаточно устойчива к удалению точки, я пойду на быстрый и грязный подход добавления .c

Вы можете сделать эту процедуру немного менее грубой и использовать метод boxcox со сдвигами, описанными в ответе ars.

Большое количество нулей

Если мой набор данных содержит большое количество нулей, то это говорит о том, что простая линейная регрессия не лучший инструмент для работы. Вместо этого я бы использовал что-то вроде смешанного моделирования (как предложили Срикант и Робин).


15

Если вы хотите что-то быстрое и грязное, почему бы не использовать квадратный корень?


7
И часто преобразование корня куба работает хорошо, и допускает нули и негативы. Я обнаружил, что кубический корень особенно хорошо работает, когда, например, измерение представляет собой объем или количество частиц на единицу объема. Корень куба преобразует его в линейное измерение. Более гибкий подход заключается в размещении ограниченного кубического сплайна (естественного сплайна) на корне куба или квадратном корне, что позволяет немного отклониться от принятой формы.
Фрэнк Харрелл

2
+1. Небольшую статью о корнях куба можно найти на stata-journal.com/article.html?article=st0223 (это будет бесплатный PDF-файл с первого квартала 2014 года.)
Ник Кокс,

2
Квадратный корень из нуля равен нулю, поэтому преобразуются только ненулевые значения. Это никак не влияет на всплеск, если он раздувается до нуля, и может вызвать серьезные проблемы, если в группах каждая группа имеет разное количество нулей. Другими словами, если в одних группах много нулей, а в других мало, эта трансформация может негативно повлиять на многие вещи. Для группы с наибольшей дисперсией (также имеющей наименьшее количество нулей) почти все значения преобразуются. В отличие от тех, которые имеют наибольшее количество нулей, не так много значений преобразуются. Это может изменить, какая группа имеет наибольшую дисперсию.
D_Williams

Никакое преобразование не будет поддерживать дисперсию в случае, описанном @D_Williams. Модели смесей (упомянутые в другом месте в этой теме), вероятно, будут хорошим подходом в этом случае.
Мкт

10

Я предполагаю, что у вас есть непрерывные данные.

Если данные содержат нули, это означает, что у вас есть всплеск нуля, который может быть связан с каким-то конкретным аспектом ваших данных. Это проявляется, например, в энергии ветра: ветер ниже 2 м / с генерирует нулевую мощность (это называется включением), а ветер свыше (что-то вокруг) 25 м / с также производит нулевую мощность (по соображениям безопасности это называется отключением) , В то время как распределение производимой энергии ветра кажется непрерывным, наблюдается всплеск нуля.

Мое решение: в этом случае я предлагаю обрабатывать нули отдельно, работая со смесью спайка в нуле и модели, которую вы планировали использовать для непрерывной части распределения (с Лебегом).


9

Сравнение ответа, предоставленного @RobHyndman, с преобразованием log-plus-one, расширенным до отрицательных значений, с формой:

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)

θθ1θ0

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


θx=0


8

Так как было предложено двухпараметрическое согласование Box-Cox, вот некоторые R, чтобы подогнать входные данные, запустить произвольную функцию для них (например, прогнозирование временных рядов), а затем вернуть инвертированный вывод:

# 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

Предположим, Y - это сумма денег, которую каждый американец тратит на новый автомобиль в течение определенного года (общая цена покупки). Y будет всплывать в 0; не будет иметь значений от 0 до 12000; и будет принимать другие ценности в основном в подростковом возрасте, двадцатых и тридцатых тысячах. Предикторы будут прокси для уровня потребности и / или заинтересованности в совершении такой покупки. Потребность или интерес вряд ли можно назвать нулевыми для лиц, которые не делали покупки; в этих масштабах непокупатели были бы намного ближе к покупателям, чем Y или даже журнал Y предложил бы. В случае, похожем на этот, но в сфере здравоохранения, я обнаружил, что наиболее точные прогнозы, судя по перекрестной проверке наборов тестов / наборов тренировок, были получены в порядке возрастания:

  1. Логистическая регрессия на двоичной версии Y,
  2. OLS на Y,
  3. Порядковая регрессия (PLUM) на Y разбита на 5 категорий (чтобы разделить покупателей на 4 группы равного размера),
  4. Полиномиальная логистическая регрессия по Y, разбитая на 5 категорий,
  5. OLS в журнале (10) Y (я не думал о попытке корня куба), и
  6. OLS на Y разбиты на 5 категорий.

Некоторые отшатнутся при этой категоризации непрерывной зависимой переменной. Но хотя это и приносит в жертву некоторую информацию, классификация, кажется, помогает, восстанавливая важный базовый аспект ситуации - опять же, что «нули» намного больше похожи на остальные, чем указывал бы Y.


4
Вы также можете разделить его на две модели: вероятность покупки автомобиля (бинарный ответ) и стоимость автомобиля с учетом покупки. Это стандартная практика во многих областях, например, страхование, кредитный риск и т. Д.
Hong Ooi

1
@HongOoi - можете ли вы предложить какие-либо материалы о том, когда этот подход применим и не применим?
rolando2

4

Обсуждаемое здесь преобразование мощности Йео-Джонсона обладает превосходными свойствами, разработанными для обработки нулей и негативов, в то же время опираясь на сильные стороны преобразования мощности Бокс-Кокса. Это то, к чему я обычно обращаюсь, когда имею дело с нулями или отрицательными данными.

Вот краткое изложение преобразований с плюсами / минусами, чтобы проиллюстрировать, почему Йео-Джонсон предпочтительнее.

Журнал

Плюсы: хорошо с положительными данными.

Минусы: не обрабатывает нули.

> log(0)
[1] -Inf

Log Plus 1

Плюсы: смещение плюс 1 добавляет возможность обработки нулей в дополнение к положительным данным.

Минусы: не с отрицательными данными

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

Квадратный корень

Плюсы: использует преобразование мощности, которое может обрабатывать нули и положительные данные.

Минусы: не с отрицательными данными

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

Box Cox

Код R:

box_cox <- function(x, lambda) {

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

}

Плюсы: позволяет масштабные преобразования мощности

Минусы: страдает от проблем с нулями и негативами (то есть может обрабатывать только положительные данные.

> box_cox(0, lambda = 0)
[1] -Inf
> box_cox(0, lambda = -0.5)
[1] -Inf
> box_cox(-1, lambda = 0.5)
[1] NaN

Йео Джонсон

Код 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)

}

Плюсы: может обрабатывать положительные, нулевые и отрицательные данные.

Минусы: ни о чем я не могу думать. Свойства очень похожи на Box-Cox, но могут обрабатывать ноль и отрицательные данные.

> 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
Минусы для Йео-Джонсона: сложное, отдельное преобразование для позитивов и негативов и для значений по обе стороны от лямбды, магическое значение настройки (эпсилон; а что такое лямбда?). Нет очевидного преимущества по сравнению с более простым преобразованием журнала с отрицательным расширением, показанным в ответе Firebug, если только вам не требуются масштабные преобразования мощности (как в Box-Cox).
Конрад Рудольф

1

Чтобы прояснить, как обращаться с нулевым логарифмом в регрессионных моделях, мы написали педагогическую статью, объясняющую лучшее решение и распространенные ошибки, которые люди делают на практике. Мы также разработали новое решение для решения этой проблемы.

Вы можете найти документ, нажав здесь: https://ssrn.com/abstract=3444996

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

YY+c>0

В нашей статье мы фактически приводим пример, в котором добавление очень маленьких констант фактически обеспечивает наивысшее смещение. Мы предоставляем производное выражение предвзятости.

На самом деле, пуассоновское псевдо максимальное правдоподобие (PPML) можно рассматривать как хорошее решение этой проблемы. Нужно рассмотреть следующий процесс:

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

Мы показываем, что эта оценка объективна и что ее можно просто оценить с помощью GMM с помощью любого стандартного статистического программного обеспечения. Например, это можно оценить, выполнив только одну строку кода со Stata.

Мы надеемся, что эта статья поможет, и мы хотели бы получить от вас обратную связь.

Кристоф Беллего и Луи-Даниэль Папе КРЕСТ - Политехническая школа - ENSAE

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.