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)
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))
r
regression
lognormal
rnso
źródło
źródło
Odpowiedzi:
Im mniejsza stała, tym większe jest dodanie wartości odstającej, którą utworzysz:
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.
źródło
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 xy x y logx
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ć.
źródło
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 :
źródło
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.
źródło