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))

rnso
źródło
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.

Maarten Buis
źródło
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ć.

Neil G.
źródło
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

Aghila
źródło
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.

użytkownik280432
źródło
Dzięki. Dobra analiza.
rnso