Wie finden Sie gute Startwerte für die Funktion nls?

7

Ich verstehe nicht, warum ich für diese Daten keine nls Funktion haben kann. Ich habe es mit vielen verschiedenen Startwerten versucht und ich habe immer den gleichen Fehler.

Hier ist was ich gemacht habe:

%Vor%

Ich habe immer diesen Fehler:

%Vor%     
Tali 13.03.2012, 21:45
quelle

3 Antworten

8

Dies kann mit zwei linearen Parametern ( .lin1 und .lin2 ) und einem nichtlinearen Parameter ( b ) wie folgt geschrieben werden:

%Vor%

wo .lin1 = a+c und .lin2 = -a (also a = - .lin2 und c = .lin1 + .lin2 ) Damit können wir "plinear" verwenden, was nur die Angabe eines Startwerts für den einzelnen nichtlinearen Parameter erfordert (das Problem der Einstellung der Startwerte für die anderen Parameter) und konvergiert, obwohl der Startwert von b=75 weit von dem der Lösung entfernt ist:

%Vor%

Hier ist das Ergebnis eines Laufs, von dem wir anhand der Größe von .lin2 sehen können, dass das Problem schlecht skaliert ist:

%Vor%

BEARBEITEN: Probe hinzugefügt und Skalierung kommentieren.

    
G. Grothendieck 13.03.2012, 23:43
quelle
9

Die Anpassung eines nichtlinearen Dreiparametermodells an vier Datenpunkte wird in jedem Fall eine moderate Herausforderung sein, obwohl sich die Daten in diesem Fall gut verhalten. Punkt # 1 ist, dass Ihr Startwert für Ihren c -Parameter (-5) weit weg war. Das Zeichnen eines Bildes der Kurve, die Ihren Startparametern entspricht (siehe unten), würde Ihnen helfen, dies zu verstehen (würde auch erkennen, dass die Kurve von c an ihrem Minimum bis c+a an ihrem Maximum und der Bereich von Ihre Daten sind von 0,6 bis 1 ...)

Aber selbst mit einer besseren Startschätzung habe ich festgestellt, dass ich mich mit Kontrollparametern (d. h. control=nls.control(maxiter=200) ) und dann mit weiteren Warnungen beschäftigt habe - nls ist nicht für seine Robustheit bekannt. Also habe ich das SSasympOff -Modell ausprobiert, das eine selbststartende Version der Kurve implementiert, die Sie anpassen möchten.

%Vor%

Mein Rat lautet im Allgemeinen, dass es einfacher ist, herauszufinden, was vor sich geht, und Probleme zu beheben, wenn Sie nls außerhalb von geom_smooth anpassen und die hinzuzufügende Kurve mit predict.nls erstellen. ...

Allgemeiner gesagt besteht die Art und Weise, wie Sie gute Anfangsparameter erhalten, darin, die Geometrie der Funktion, die Sie anpassen, zu verstehen und welche Parameter welche Aspekte der Kurve steuern. Wie oben erwähnt, ist c der Minimalwert der verschobenen Sättigungsexponentialkurve, a ist der Bereich und b ist ein Skalierungsparameter (Sie können sehen, dass bei x=b die Kurve% co_de ist % oder ungefähr 2/3 des Weges vom Minimum zum Maximum). Entweder ein bisschen Algebra und Kalkül (d. H. Grenzen nehmen) oder das Spielen mit der 1-exp(-1) -Funktion sind gute Möglichkeiten, diese Informationen zu sammeln.

    
Ben Bolker 13.03.2012 23:16
quelle
2

Ich habe Mühe, eine Interpretation Ihrer Parameter zu finden: a ist eine Steigung, b die Konvergenzgeschwindigkeit und a + c die Grenze, aber c allein scheint nicht viel zu bedeuten. Nach der Neuparametrierung Ihrer Funktion verschwindet das Problem.

%Vor%

Der Wert von c sieht jedoch sehr, sehr hoch aus: Das ist wahrscheinlich der Grund, warum das Modell anfänglich nicht konvergierte.

%Vor%

Hier ist eine andere, vernünftigere Parametrisierung der gleichen Funktion.

%Vor%     
Vincent Zoonekynd 13.03.2012 23:41
quelle

Tags und Links