Próbuję dopasować linię + krzywą wykładniczą do niektórych danych. Na początek próbowałem to zrobić na niektórych sztucznych danych. Funkcja to: Jest to efektywnie krzywa wykładnicza o przekroju liniowym, a także dodatkowy parametr przesunięcia poziomego ( m ). Jednak gdy używam funkcji R, pojawia się przerażający błąd „ pojedyncza macierz gradientu przy początkowych oszacowaniach parametrów ”, nawet jeśli używam tych samych parametrów, których użyłem do wygenerowania danych. Próbowałem różnych algorytmów, różnych wartości początkowych i próbowałem użyć
nls()
optim
aby zminimalizować resztkową sumę kwadratów, wszystko bezskutecznie. Czytałem, że przyczyną tego może być nadmierna parametryzacja formuły, ale nie sądzę, że jest (prawda?) Czy ktoś ma jakieś sugestie dotyczące tego problemu? Czy to tylko niezręczny model?
Krótki przykład:
#parameters used to generate the data
reala=-3
realb=5
realc=0.5
realr=0.7
realm=1
x=1:11 #x values - I have 11 timepoint data
#linear+exponential function
y=reala + realb*realr^(x-realm) + realc*x
#add a bit of noise to avoid zero-residual data
jitter_y = jitter(y,amount=0.2)
testdat=data.frame(x,jitter_y)
#try the regression with similar starting values to the the real parameters
linexp=nls(jitter_y~a+b*r^(x-m)+c*x, data=testdat, start=list(a=-3, b=5, c=0.5, r=0.7, m=1), trace=T)
Dzięki!
r
nonlinear-regression
nls
steiny
źródło
źródło
Odpowiedzi:
Ostatnio mnie to ugryzło. Moje intencje były takie same, stwórz sztuczny model i przetestuj go. Głównym powodem jest ten podany przez @whuber i @marco. Taki model nie został zidentyfikowany. Aby to zobaczyć, pamiętaj, że NLS minimalizuje funkcję:
Powiedzmy, że jest minimalizowany przez zestaw parametrów( a , b , m , r , c ) . Nietrudno zauważyć, że zestaw parametrów( a , b r- m, 0 , r , c ) da tę samą wartość funkcji, którą należy zminimalizować. W związku z tym model nie został zidentyfikowany, tzn. Nie ma unikalnego rozwiązania.
Nietrudno też zrozumieć, dlaczego gradient jest osobliwy. Oznaczać
Następnie
i otrzymujemy to dla wszystkichx
Stąd macierz
nie będzie miał pełnej rangi i dlatego
nls
nada osobliwy gradientowy komunikat.Spędziłem ponad tydzień szukając błędów w moim kodzie gdzie indziej, dopóki nie zauważyłem, że główny błąd był w modelu :)
źródło
Powyższe odpowiedzi są oczywiście poprawne. Po co warto, oprócz podanych wyjaśnień, jeśli próbujesz tego na sztucznym zbiorze danych, zgodnie ze stroną pomocy nls pod adresem : http://stat.ethz.ch/R-manual/R-patch/ biblioteka / stats / html / nls.html
R's nls nie będzie w stanie sobie z tym poradzić. Strona pomocy wyraźnie stwierdza:
Zatem brak hałasu == brak korzyści dla nls R.
źródło