Jak uniknąć logarytmu (0) w regresji


10

Mam następujące proste wektory X i 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)

wprowadź opis zdjęcia tutaj

Chcę wykonać regresję za pomocą dziennika X. Aby uniknąć uzyskania dziennika (0), próbuję umieścić +1 lub +0.1 lub +0.00001 lub +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

Wynik jest różny we wszystkich przypadkach. Jaka jest poprawna wartość, aby uniknąć log (0) w regresji? Jaka jest właściwa metoda dla takich sytuacji.

Edycja: moim głównym celem jest poprawienie predykcji modelu regresji poprzez dodanie logarytmu, tj .: lm (Y ~ X + log (X))


4
Żaden z nich nie jest , wszystkie są , więc każde pojęcie „poprawności” jest nonsensowne. Żadne z nich nie jest „poprawne” dla . Aby wybrać między nimi, musisz powiedzieć więcej o tym, jakie właściwości chcesz i jakie właściwości jesteś gotowy porzucić. Co tak naprawdę próbujesz osiągnąć? log(x)log(x+c)log(x)
Glen_b

Chcę poprawić przewidywanie modelu regresji za pomocą lm (Y ~ X + log (X)). W tym celu, jakie byłoby twoje zalecenie, aby unikać log (0)?
rso

5
Nie możesz tam mieć logu (X); już to ustaliłeś. Co właściwie próbujesz osiągnąć? Biorąc pod uwagę, że nie możesz wziąć logu (0), co chcesz wydostać się z regresji? Dlaczego chcesz tam logować (X)? Co możesz tolerować zamiast logu (X)?
Glen_b

3
Czym jest tutaj nauka? Powinien być przewodnikiem po tym, co robić.
Nick Cox,

1
rso, nie widzę tam nic, co rozwiązałoby podnoszone przeze mnie kwestie (lub, co ważniejsze, ten, który podniósł Nick Cox), ani też nic, co mogłoby pomóc w rozwiązaniu tego pytania.
Glen_b

Odpowiedzi:


8

Im mniejsza stała, tym większe jest dodanie wartości odstającej, którą utworzysz: wprowadź opis zdjęcia tutaj

Trudno więc uzasadnić tutaj jakąkolwiek stałą. Można rozważyć transformację, która nie ma problemu z zerami, na przykład wielomian trzeciego rzędu.


Czy x + x ^ 2 + x ^ 3 jest równoważne log (x)? Zobacz moje komentarze w innej odpowiedzi, dlaczego próbuję użyć wartości dziennika.
rso

2
Nie są równoważne, ale alternatywy.
Maarten Buis

10

Dlaczego chcesz wykreślić logarytmy? Co jest złego w wykreślaniu zmiennych takimi, jakie są?

Jednym z powodów, dla których warto pracować z dziennikami, jest na przykład założenie, że rozkład generowania jest log-normalny.

Innym może być to, że liczby reprezentują parametry skali lub są używane wielokrotnie, w którym to przypadku przestrzeń, w której się znajdują, jest naturalnie logarytmiczna (z tego samego powodu, dla którego Jeffreys przed zmienną skali jest logarytmiczny).

Żaden z nich nie ma miejsca. Myślę, że właściwą odpowiedzią tutaj jest nie rób tego. Najpierw wymyśl model generowania danych, a następnie wykorzystaj dane w sposób zgodny z tym.

Wygląda na to, że próbujesz dodać jak najwięcej funkcji wejść, aby uzyskać „doskonałe dopasowanie”. Dlaczego nie dodasz żadnej z tych funkcji: http://en.wikipedia.org/wiki/List_of_mathematical_functions ? Och, prawdopodobnie uważasz, że wiele z nich jest niedorzecznych, jak funkcja Ackermanna. Dlaczego są śmieszne? Każda funkcja dodawanego wejścia jest zasadniczo twoją hipotezą związku. Każdemu z nas trudno sobie wyobrazić, że jest funkcją funkcji totalnej Eulera zastosowanej do . Dlatego jestem przeciwko jest funkcją . Wydaje mi się to równie śmieszne, jeśli nie wyjaśnisz mi tej hipotezy.x y log xyxylogx

Prawdopodobnie jedyną rzeczą, którą dostaniesz poprzez ciągłe dodawanie funkcji danych wejściowych, jest przerobiony model. Jeśli chcesz modelu, który faktycznie dobrze się sprawdza, musisz dobrze zgadywać i mieć wystarczającą ilość danych, aby nauczyć się modelu. Im więcej zgadniesz, tym więcej parametrów będziesz mieć, tym więcej danych będziesz potrzebować.


Nie chcę drukować dzienników. Chcę użyć zmiennej X w regresji. Aby uzyskać jak najlepsze dopasowanie, zakładam, że powinniśmy dołączyć log, a także wielomiany. Do tego potrzebuję wartości dziennika.
rso

@rnso: Więc wyobrażasz sobie, że wartość docelowa jest iloczynem tych danych wejściowych? To bardzo dziwne, że wartość docelowa jest multiplikowana w stosunku do danych wejściowych, gdy dane wejściowe mogą wynosić zero.
Neil G

Nie produkt, ale suma. Próbuję użyć formuły: lm (Y ~ X + log (X))
rnso

1
@rnso: tak, ale dodanie tych logów jest jak powiedzenie, że , i dlaczego uważasz, że jeśli może wynosić zero? x ieyxiwixi
Neil G

1
pomijasz termin dziennika. Masz już współczynnik terminu log: Not a number
Caleth

3

Trudno powiedzieć z tak małą ilością szczegółów na temat twoich danych i tylko sześcioma obserwacjami, ale być może twój problem leży w twojej zmiennej Y (ograniczonej od zera do jednego), a nie w twoim X. Spójrz na następujące podejście przy użyciu dwuparametrowego funkcja log-logistyczna z pakietu 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))))

wprowadź opis zdjęcia tutaj


1

Patrząc na wykres y względem x, formą funkcjonalną wydaje się być y = 1 - exp (-alfa x), o bardzo wysokiej wartości alfa. Jest to funkcja zbliżona, ale niezupełnie, do dopasowania tych danych potrzebna będzie duża liczba wielomianów (pomyśl w kategoriach exp (x) = 1 + x + x ^ 2/2! +. + X ^ n / n! + ...). Zmieniając warunki, otrzymujemy exp (-alpha x) = 1-y. Jeśli weźmiesz teraz logi, daje to -alpha x = log (1-y). Możesz zdefiniować nową zmienną z = log (1-y) i spróbować znaleźć alfę, która najlepiej pasuje do danych. Nadal masz problem z tym, jak poradzić sobie z y = 1. Nie znam kontekstu twojego problemu, ale mam wrażenie, że musiałbyś pomyśleć o y asymptotycznie zbliżającym się do 1, gdy x zbliża się do 1, ale nigdy tak naprawdę nie osiąga 1.

Zastanawiając się nad tym, zastanawiam się, czy dane pochodzą z rozkładu Weibulla y = 1 - exp (-alpha x ^ beta). Zmieniając warunki, otrzymujemy beta log (x) = log (-log (1-y)) - log (alfa) i możemy użyć OLS, aby uzyskać alfa i beta. Pozostaje kwestia obsługi y = 1.


Dzięki. Dobra analiza.
rnso
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.