Pojedynczy błąd gradientu w nls z prawidłowymi wartościami początkowymi

19

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ć

y=a+br(xm)+cx
nls()
optimaby 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!

steiny
źródło
2
Wskazówka: spójrz na współczynnik (dla ustalonego ) i zauważ, że ma jednowymiarową rodzinę rozwiązań z . rxrbrm=constant(b,m)b=rmconstant
whuber
1
To nie jest zidentyfikowany model, chyba że lub są w jakiś sposób ograniczone. Myślę, że wymaganie wykona zadanie. brr(0,1)
Makro

Odpowiedzi:

16

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ę:

ja=1n(yja-za-brxja-m-doxja)2)

Powiedzmy, że jest minimalizowany przez zestaw parametrów(za,b,m,r,do) . Nietrudno zauważyć, że zestaw parametrów(za,br-m,0,r,do) 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ć

fa(za,b,r,m,do,x)=za+brx-m+dox

Następnie

fab=rx-m

fam=-blnrrx-m

i otrzymujemy to dla wszystkich x

blnrfab+fam=0.

Stąd macierz

(fa(x1)fa(xn))

nie będzie miał pełnej rangi i dlatego nlsnada 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 :)

mpiktas
źródło
2
Wiem, że to stare, ale zastanawiam się, czy to oznacza, że ​​nls nie może być stosowany w modelach, których nie można zidentyfikować? Na przykład sieć neuronowa?
Hrabia Zero,
duża szansa, wiem, ale czy mógłbyś to rozbić dla mniej pamiętających ludzi? :). jakie jest zatem rozwiązanie problemu PO? Zrezygnować i iść do domu?
theforestecologist
2
brx-mβrxmββ=br-m
@CountZero, w zasadzie tak, zwykłe metody optymalizacji zawiodłyby, gdyby parametry nie zostały zidentyfikowane. Sieci neuronowe omijają ten problem, dodając dodatkowe przeciwwskazania i używając innych interesujących sztuczek.
mpiktas
fam=-blnr rx-m
17

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:

Ostrzeżenie

Nie używaj nls na sztucznych „zerowych” danych.

Funkcja nls wykorzystuje kryterium zbieżności z przesunięciem względnym, które porównuje niedokładność liczbową przy bieżących oszacowaniach parametrów z resztkową sumą kwadratów. Działa to dobrze na danych formularza

y = f (x, θ) + eps

(z var (eps)> 0). Nie wskazuje konwergencji danych w formularzu

y = f (x, θ)

ponieważ kryterium sprowadza się do porównania dwóch składników błędu zaokrąglenia. Jeśli chcesz przetestować nls na sztucznych danych, dodaj składnik szumu, jak pokazano w poniższym przykładzie.

Zatem brak hałasu == brak korzyści dla nls R.

B_D_Dubbya
źródło
Witamy na stronie @B_D_Dubbya. Pozwoliłem sobie sformatować twoją odpowiedź, mam nadzieję, że nie masz nic przeciwko. Więcej informacji na temat edytowania odpowiedzi na CV znajdziesz tutaj .
gung - Przywróć Monikę
1
Zdaję sobie sprawę z tego problemu - stąd użycie funkcji „fluktuacji”, aby dodać trochę hałasu
steiny