Dies kann mit zwei linearen Parametern ( .lin1
und .lin2
) und einem nichtlinearen Parameter ( b
) wie folgt geschrieben werden:
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:
Hier ist das Ergebnis eines Laufs, von dem wir anhand der Größe von .lin2
sehen können, dass das Problem schlecht skaliert ist:
BEARBEITEN: Probe hinzugefügt und Skalierung kommentieren.
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.
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.
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.
Hier ist eine andere, vernünftigere Parametrisierung der gleichen Funktion.
%Vor%