Как избежать лог (0) термин в регрессии


10

У меня есть следующие простые векторы X и Y:

> X
[1] 1.000 0.063 0.031 0.012 0.005 0.000
> Y
[1] 1.000 1.000 1.000 0.961 0.884 0.000
> 
> plot(X,Y)

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

Я хочу сделать регрессию с использованием журнала X. Чтобы избежать получения журнала (0), я стараюсь положить +1 или +0,1 или +0,00001 или +0,000000000000001:

> summary(lm(Y~log(X)))
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  NA/NaN/Inf in 'x'
> summary(lm(Y~log(1+X)))

Call:
lm(formula = Y ~ log(1 + X))

Residuals:
       1        2        3        4        5        6 
-0.03429  0.22189  0.23428  0.20282  0.12864 -0.75334 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)   0.7533     0.1976   3.812   0.0189 *
log(1 + X)    0.4053     0.6949   0.583   0.5910  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.4273 on 4 degrees of freedom
Multiple R-squared:  0.07838,   Adjusted R-squared:  -0.152 
F-statistic: 0.3402 on 1 and 4 DF,  p-value: 0.591

> summary(lm(Y~log(0.1+X)))

Call:
lm(formula = Y ~ log(0.1 + X))

Residuals:
       1        2        3        4        5        6 
-0.08099  0.20207  0.23447  0.21870  0.15126 -0.72550 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)    1.0669     0.3941   2.707   0.0537 .
log(0.1 + X)   0.1482     0.2030   0.730   0.5058  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.4182 on 4 degrees of freedom
Multiple R-squared:  0.1176,    Adjusted R-squared:  -0.103 
F-statistic: 0.5331 on 1 and 4 DF,  p-value: 0.5058

> summary(lm(Y~log(0.00001+X)))

Call:
lm(formula = Y ~ log(1e-05 + X))

Residuals:
       1        2        3        4        5        6 
-0.24072  0.02087  0.08796  0.13872  0.14445 -0.15128 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     1.24072    0.12046  10.300 0.000501 ***
log(1e-05 + X)  0.09463    0.02087   4.534 0.010547 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.1797 on 4 degrees of freedom
Multiple R-squared:  0.8371,    Adjusted R-squared:  0.7964 
F-statistic: 20.56 on 1 and 4 DF,  p-value: 0.01055

> 
> summary(lm(Y~log(0.000000000000001+X)))

Call:
lm(formula = Y ~ log(1e-15 + X))

Residuals:
        1         2         3         4         5         6 
-0.065506  0.019244  0.040983  0.031077 -0.019085 -0.006714 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     1.06551    0.02202   48.38 1.09e-06 ***
log(1e-15 + X)  0.03066    0.00152   20.17 3.57e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.04392 on 4 degrees of freedom
Multiple R-squared:  0.9903,    Adjusted R-squared:  0.9878 
F-statistic: 406.9 on 1 and 4 DF,  p-value: 3.565e-05

Выход отличается во всех случаях. Какое правильное значение поставить, чтобы избежать log (0) в регрессии? Каков правильный метод для таких ситуаций.

Изменить: моя главная цель состоит в том, чтобы улучшить прогнозирование регрессионной модели, добавив лог-термин, то есть: lm (Y ~ X + log (X))


4
Ни один из них не является , все они , поэтому любое понятие «правильности» является бессмысленным. Ни один из них не является «правильным» для . Чтобы выбрать между ними, вам нужно больше рассказать о том, какие свойства вы хотите и какие свойства вы готовы отказаться. Чего вы на самом деле пытаетесь достичь? log(x)log ( x )log(x+c)log(x)
Glen_b

Я хочу улучшить прогнозирование модели регрессии с помощью lm (Y ~ X + log (X)). Для этого, что бы вы посоветовали избегать log (0)?
rnso

5
Вы не можете иметь журнал (X) там; Вы уже установили это. Так чего же вы на самом деле пытаетесь достичь? Учитывая, что вы не можете взять log (0), что вы хотите получить из регрессии? Почему вы хотите войти (X) там? Что вы можете терпеть вместо того, чтобы иметь log (X) там?
Glen_b

3
Какая наука здесь? Это должно быть руководство к тому, что делать.
Ник Кокс

1
Поэтому я не вижу там ничего, что касалось бы вопросов, которые я поднимал (или, что более важно, того, что поднял Ник Кокс), и в действительности ничего, что могло бы помочь ответить на этот вопрос.
Glen_b

Ответы:


8

Чем меньше константа, которую вы добавляете, тем больше выброс, который вы создадите: введите описание изображения здесь

Так что здесь трудно обосновать какую-либо константу. Вы можете рассмотреть преобразование, которое не имеет проблем с 0, например, многочлен третьего порядка.


Является ли x + x ^ 2 + x ^ 3 эквивалентным log (x)? Пожалуйста, смотрите мои комментарии в другом ответе, почему я пытаюсь использовать значения журнала.
rnso

2
Они не эквивалентны, но альтернативы.
Мартен Буис

10

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

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

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

Ни то, ни другое. Я думаю, что правильный ответ здесь не делай этого. Сначала создайте модель генерации данных, а затем используйте ваши данные в соответствии с этим.

Похоже, то, что вы пытаетесь сделать, - это добавить как можно больше функций входов, чтобы получить «идеальное соответствие». Почему бы вам не добавить ни одну из этих функций: http://en.wikipedia.org/wiki/List_of_matumatic_functions ? О, вы, наверное, думаете, что многие из них смешны, например, функция Аккермана. Почему они смешные? Каждая функция ввода, которую вы добавляете, является вашей гипотезой об отношениях. Каждому из нас трудно представить, что - это функция Сложного Эйлера, примененная к . Вот почему я против того, чтобы была функцией . Мне кажется одинаково смешным, если вы не объясните мне эту гипотезу.х у лог хyxylogx

Вероятно, единственное, что вы собираетесь получить, постоянно добавляя функции входов, - это переопределенная модель. Если вы хотите модель, которая на самом деле хорошо проверяет, вы должны сделать хорошие предположения и иметь достаточно данных, чтобы изучить модель. Чем больше предположений вы сделаете, тем больше у вас будет параметров, тем больше данных вам потребуется.


Я не хочу строить журналы. Я хочу использовать переменную X в регрессии. Я полагаю, что для наилучшего соответствия мы должны включить лог, а также полиномы. Для этого мне нужны значения журнала.
rnso

@ rnso: То есть вы представляете, что целевое значение является продуктом этих входных данных? Очень странно, что целевое значение мультипликативно связано со входами, когда вход может быть нулевым.
Нил Дж

Не продукт, а сумма. Я пытаюсь использовать формулу: lm (Y ~ X + log (X))
rnso

1
@rnso: да, но добавление этих терминов в журнал похоже на то, чтобы сказать, что , и почему вы думаете, что если может быть нулем? х яeyxiwixi
Нил Дж

1
Вы пропускаете термин журнала. У вас уже есть коэффициент лог-термин: не число
Caleth

3

Трудно сказать с таким небольшим количеством деталей о ваших данных и только шестью наблюдениями, но, возможно, ваша проблема заключается в вашей переменной Y (ограниченной между нулем и единицей), а не в вашем X. Взгляните на следующий подход, используя двухпараметрический Логистическая функция из пакета drc :

X<-c(1.000, 0.063, 0.031, 0.012, 0.005, 0.000)
Y<-c(1.000, 1.000, 1.000, 0.961, 0.884, 0.000)

library(drc)
mod1<-drm(Y ~ X, fct=LL.2())
summary(mod1)

#Model fitted: Log-logistic (ED50 as parameter) with lower limit at 0 and upper limit at 1 (2 parms)
#
#Parameter estimates:
#  
#  Estimate  Std. Error     t-value p-value
#b:(Intercept) -1.5131e+00  1.4894e-01 -1.0159e+01  0.0005
#e:(Intercept)  1.3134e-03  1.8925e-04  6.9401e+00  0.0023
#
#Residual standard error:
#  
#  0.005071738 (4 degrees of freedom)  

plot(X,Y)
lines(seq(0, 1, 0.001), predict(mod1, data.frame(X=seq(0, 1, 0.001))))

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


1

Если посмотреть на график зависимости y от x, то функциональная форма выглядит так: y = 1 - exp (-альфа x) с очень высокой альфа. Это близко, но не совсем пошаговая функция, и вам понадобится большое количество полиномов, чтобы соответствовать этим данным (подумайте в терминах exp (x) = 1 + x + x ^ 2/2! +. + X ^ n / п! + ...). Переставляя члены, мы получаем exp (-alpha x) = 1-y. Если вы сейчас берете логи, это дает -alpha x = log (1-y). Вы можете определить новую переменную z = log (1-y) и попытаться найти альфу, которая лучше всего соответствует данным. У вас все еще есть вопрос, как справиться с y = 1. Я не знаю контекста вашей проблемы, но у меня сложилось впечатление, что вам придется думать о том, что y асимптотически приближается к 1, когда x приближается к 1, но y никогда не достигает 1.

Подумав об этом еще немного, мне интересно, действительно ли данные получены из распределения Вейбулла y = 1 - exp (-alpha x ^ beta). Переставляя термины, мы получаем beta log (x) = log (-log (1-y)) - log (альфа), и мы можем использовать OLS для получения альфы и беты. Проблема обработки y = 1 остается.


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