Singulärer Gradientenfehler in nls bei korrekten Startwerten

19

Ich versuche, eine Linie + Exponentialkurve an einige Daten anzupassen. Zunächst habe ich versucht, dies mit künstlichen Daten zu tun. Die Funktion ist: Es ist effektiv eine Exponentialkurve mit einem linearen Abschnitt sowie einem zusätzlichen horizontalen Verschiebungsparameter ( m ). Wenn ich jedoch die Funktion von R verwende, erhalte ich den gefürchteten Fehler " singuläre Gradientenmatrix bei anfänglichen Parameterschätzungen ", auch wenn ich dieselben Parameter verwende, die ich ursprünglich zum Generieren der Daten verwendet habe. Ich habe die verschiedenen Algorithmen ausprobiert, verschiedene Startwerte und versucht zu verwenden

y=ein+br(x-m)+cx
nls()
optimdie verbleibende Summe der Quadrate zu minimieren, alles ohne Erfolg. Ich habe gelesen, dass ein möglicher Grund dafür eine Überparametrisierung der Formel sein könnte, aber ich glaube nicht, dass dies der Fall ist.
Hat jemand einen Vorschlag für dieses Problem? Oder ist das nur ein unangenehmes Modell?

Ein kurzes Beispiel:

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

Vielen Dank!

steiny
quelle
2
Hinweis: Betrachten Sie den Koeffizienten von (für ein festes r ) und beachten Sie, dass b r - m = Konstante eine eindimensionale Familie von Lösungen ( b , m ) mit b = r mKonstante hat . rxrbr-m=Konstante(b,m)b=rmKonstante
Whuber
1
Dies ist kein identifiziertes Modell, es sei denn, oder r sind irgendwie eingeschränkt. Ich denke, das Erfordernis von r ( 0 , 1 ) würde die Arbeit erledigen. brr(0,1)
Makro

Antworten:

16

Das hat mich kürzlich gebissen. Meine Absichten waren die gleichen, mache ein künstliches Modell und teste es. Der Hauptgrund ist der von @whuber und @marco. Ein solches Modell wird nicht identifiziert. Denken Sie daran, dass NLS die Funktion minimiert, um dies zu sehen:

ich=1n(yich-ein-brxich-m-cxich)2

Angenommen, es wird durch den Parametersatz (ein,b,m,r,c) minimiert . Es ist unschwer zu erkennen , dass die die Gruppe von Parametern (ein,br-m,0,r,c) dem gleichen Wert der Funktion geben , minimiert werden. Daher wird das Modell nicht identifiziert, dh es gibt keine eindeutige Lösung.

Es ist auch nicht schwer zu erkennen, warum der Gradient singulär ist. Bezeichnen

f(ein,b,r,m,c,x)=ein+brx-m+cx

Dann

fb=rx-m

fm=-blnrrx-m

und das bekommen wir für alle x

blnrfb+fm=0.

Daher die Matrix

(f(x1)f(xn))

wird nicht von vollem Rang sein und aus diesem Grund nlswird die singuläre Gradienten-Nachricht geben.

Ich habe über eine Woche damit verbracht, nach Fehlern in meinem Code zu suchen, bis ich bemerkte, dass der Hauptfehler im Modell war :)

mpiktas
quelle
2
Ich weiß, das ist uralt, aber ich frage mich, bedeutet das, dass nls nicht für Modelle verwendet werden kann, die nicht identifizierbar sind? Zum Beispiel ein neuronales Netzwerk?
Count Zero
Fett Chance, ich weiß, aber könnten Sie dies für weniger kalkerinnerliche Leute aufschlüsseln? :). Was ist dann die Lösung für das OP-Problem? Aufgeben und nach Hause gehen?
theforestecologist
2
brx-mβrxmββ=br-m
@CountZero, grundsätzlich ja, übliche Optimierungsmethoden schlagen fehl, wenn die Parameter nicht identifiziert werden. Neuronale Netze umgehen dieses Problem jedoch, indem sie zusätzliche Beschränkungen hinzufügen und andere interessante Tricks anwenden.
mpiktas
fm=-blnr rx-m
17

Die obigen Antworten sind natürlich richtig. Was es wert ist, zusätzlich zu den gegebenen Erklärungen, wenn Sie dies an einem künstlichen Datensatz versuchen, gemäß der nls-Hilfeseite unter: http://stat.ethz.ch/R-manual/R-patched/ library / stats / html / nls.html

Rs nls werden nicht damit umgehen können. Auf der Hilfeseite heißt es speziell:

Warnung

Verwenden Sie nls nicht für künstliche "Null-Residuen" -Daten.

Die Funktion nls verwendet ein Konvergenzkriterium für den relativen Versatz, das die numerische Ungenauigkeit bei den aktuellen Parameterschätzungen mit der restlichen Quadratsumme vergleicht. Dies funktioniert gut mit Daten des Formulars

y = f (x, θ) + eps

(mit var (eps)> 0). Konvergenz auf Daten des Formulars wird nicht angezeigt

y = f (x, θ)

denn das Kriterium läuft darauf hinaus, zwei Komponenten des Rundungsfehlers zu vergleichen. Wenn Sie nls auf künstliche Daten testen möchten, fügen Sie bitte eine Rauschkomponente hinzu, wie im folgenden Beispiel gezeigt.

Also kein Rauschen == nicht gut für Rs nls.

B_D_Dubbya
quelle
Willkommen auf der Site @B_D_Dubbya. Ich habe mir erlaubt, Ihre Antwort zu formatieren. Ich hoffe, es macht Ihnen nichts aus. Weitere Informationen zum Bearbeiten Ihrer Antworten im Lebenslauf finden Sie hier .
gung - Wiedereinsetzung von Monica
1
Ich bin mir dieses Problems bewusst - daher benutze ich die "Jitter" -Funktion, um etwas Rauschen hinzuzufügen
Steiny,