Strategie zur Anpassung einer stark nichtlinearen Funktion

12

Zur Analyse von Daten aus einem biophysikalischen Experiment versuche ich derzeit, eine Kurvenanpassung mit einem stark nichtlinearen Modell durchzuführen. Die Modellfunktion sieht grundsätzlich so aus:

y=ax+bx1/2

Hier ist insbesondere der Wert von b von großem Interesse.

Ein Plot für diese Funktion:

Funktionsdiagramm

(Beachten Sie, dass die Modellfunktion auf einer gründlichen mathematischen Beschreibung des Systems basiert und sehr gut zu funktionieren scheint. Es ist nur so, dass automatisierte Anpassungen schwierig sind.)

Natürlich ist die Modellfunktion problematisch: Anpassungsstrategien, die ich bisher ausprobiert habe, scheitern an der scharfen Asymptote bei x=0 , insbesondere bei verrauschten Daten.

Mein Verständnis des Problems hier ist, dass die einfache Anpassung der kleinsten Quadrate (ich habe in MATLAB sowohl mit linearer als auch mit nichtlinearer Regression gespielt; meistens Levenberg-Marquardt) für die vertikale Asymptote sehr empfindlich ist, da kleine Fehler in x enorm verstärkt werden .

Könnte mich jemand auf eine passende Strategie hinweisen, die das umgehen könnte?

Ich habe einige Grundkenntnisse in Statistik, aber das ist immer noch ziemlich begrenzt. Ich würde gerne lernen, wenn ich nur wüsste, wo ich anfangen soll :)

Vielen Dank für Ihren Rat!

Bearbeiten Bitte um Verzeihung, dass Sie vergessen haben, die Fehler zu erwähnen. Das einzige signifikante Rauschen ist in x und es ist additiv.

Bearbeiten 2 Einige zusätzliche Informationen zum Hintergrund dieser Frage. Die obige Grafik modelliert das Streckverhalten eines Polymers. Wie @whuber in den Kommentaren ausführte, benötigen Sie b200a , um ein Diagramm wie oben zu erhalten.

Wie die Leute diese Kurve bis zu diesem Punkt angepasst haben: Es scheint, dass die Leute im Allgemeinen die vertikale Asymptote abschneiden, bis sie eine gute Passform finden. Die Auswahl der Abschaltung ist jedoch immer noch willkürlich, wodurch das Anpassungsverfahren unzuverlässig und nicht reproduzierbar wird.

3 & 4 Fixed Graph bearbeiten .

onnodb
quelle
3
Treten die Fehler in oder in auf ?x oder in beiden auf? In welcher Form soll das Rauschen eintreten (multiplikativ, additiv usw.)? y
Wahrscheinlichkeit
2
@onnodb: Mein Anliegen ist, könnte dies nicht grundsätzlich in Frage stellen, wie robust Ihr Modell selbst ist? Egal, welche Anpassstrategie Sie verwenden, bleibt nicht hochsensibel? Können Sie jemals ein hohes Vertrauen in eine solche Schätzung für b haben?bb ?
curious_cat
1
Das geht leider immer noch nicht. Es gibt einfach keine mögliche Kombination von und b , die den von Ihnen gezeichneten Graphen qualitativ reproduziert. (Offensichtlich ist b negativ. A muss kleiner sein als die geringste Steigung im Graphen, aber positiv, was es in ein enges Intervall bringt. Aber wenn a in diesem Intervall ist, ist es einfach nicht groß genug, um die große negative Spitze bei zu überwinden der Ursprung durch die eingeführten b x 1 / 2 term.) Was haben Sie gezogen? Daten? Irgendeine andere Funktion? abbaabx1/2
whuber
1
Danke, aber es ist immer noch falsch. Verlängerung der Tangente zu diesem Graphen rückwärts von jedem Punkt (x,ax+bx1/2) , wo , werden Sie die y-Achse bei abfängt ( 0 , 3 b / ( 2 x 1 / 2x>0 . Weil die Abwärtsspitze bei 0 b zeigt(0,3b/(2x1/2))0bnegativ ist, muss auch dieser y-Achsenabschnitt negativ sein. In Ihrer Abbildung ist jedoch sehr deutlich, dass die meisten dieser Abschnitte positiv sind und sich auf bis zu . Somit ist es mathematisch unmöglich , daß eine Gleichung wie y = a x + b x 1 / 2 kann die programmierte Kurve beschreiben , auch nicht annähernd. Zumindest müssen Sie so etwas wie passen y = a x + b x 1 / 2 + c . 15.5y=ax+bx1/2y=ax+bx1/2+c
whuber
1
Bevor ich daran gearbeitet habe, wollte ich die Aussage der Frage überprüfen: Deshalb ist es wichtig, dass die Funktion korrekt ist. Ich habe jetzt keine Zeit, eine vollständige Antwort zu geben, möchte aber bemerken, dass "andere Leute" vielleicht falsch liegen - aber es kommt auf noch mehr Details an, leider. Wenn Ihr Fehler wirklich additiv ist, muss er meines Erachtens immer noch stark heteroskedastisch sein, da sonst seine Varianz bei kleinen Werten von x wirklich klein wäre. Was können Sie uns quantitativ über diesen Fehler sagen? xx
Whuber

Antworten:

10

Die Methoden, die wir verwenden würden, um dies manuell anzupassen (d. H. Von Exploratory Data Analysis), können mit solchen Daten bemerkenswert gut funktionieren.

Ich möchte das Modell leicht umparametrieren , um die Parameter positiv zu machen:

y=axb/x.

wir für ein gegebenes y an , dass es ein eindeutiges reales x gibt , das diese Gleichung erfüllt. nenne dies f ( y ; a , b ) oder der Kürze halber f ( y ), wenn ( ayxf(y;a,b)f(y) verstanden wird.(a,b)

Wir beobachten eine Ansammlung geordneter Paare denen x i von f ( y i ; a abweicht(xi,yi)xidurch unabhängige Zufallsvariablen mit dem Mittelwert Null , b ) abweichen. In dieser Diskussion gehe ich davon aus, dass sie alle eine gemeinsame Varianz haben, aber eine Erweiterung dieser Ergebnisse (unter Verwendung gewichteter kleinster Quadrate) ist möglich, offensichtlich und einfach zu implementieren. Hier ist ein simuliertes Beispiel einer solchen Sammlung von 100 Werten mit a = 0,0001 , b = 0,1 und einer gemeinsamen Varianz von σf(yi;a,b)100a=0.0001b=0.1 .σ2=4

Datenplot

Dies ist ein (absichtlich) schwieriges Beispiel, wie die nichtphysikalischen (negativen) Werte und ihre außergewöhnliche Streuung (die normalerweise ± 2 horizontale Einheiten beträgt , aber bis zu 5 betragen kann) erkennen lassenx±2 5 oder auf der x- Achse ) erkennen lassen. Wenn wir eine vernünftige Übereinstimmung mit diesen Daten erzielen können, die der Schätzung von a , b und σ 2 nahekommt , dann sind wir in der Tat erfolgreich.6xabσ2

Eine explorative Anpassung ist iterativ. Jede Stufe besteht aus zwei Schritten: Schätzung (basierend auf den Daten und früheren Schätzungen a und b von a und b , von der vorherigen vorhergesagten Werten x i kann für die erhalten wird , x i ) , und dann schätzen b . Da die Fehler in x sind , schätzen die Anpassungen x i aus ( y i ) und nicht umgekehrt. Um zuerst die Fehler in x einzugeben , wenn xaa^b^abx^ixibxi(yi)xx ausreichend groß ist,

xi1a(yi+b^x^i).

Daher können wir aktualisieren , ein durch den Einbau dieses Modell mit der kleinsten Quadrate (Anmerkung es nur einen Parameter aufweist - eine Steigung, ein --Und kein intercept) und der Kehrwert des Koeffizienten als die aktualisierte Schätzung des Nehmens ein .a^aa

Als nächstes dominiert , wenn ausreichend klein ist, der umgekehrte quadratische Term und wir finden (wieder in erster Ordnung in den Fehlern), dassx

xib212a^b^x^3/2yi2.

Erneut unter Verwendung der kleinsten Quadrate (mit nur einer Steigung Begriff ) haben wir eine aktualisierte Schätzung erhalten b über die Quadratwurzel der angepassten Steigung.bb^

Um zu sehen, warum dies funktioniert, kann eine grobe explorative Annäherung an diese Anpassung erhalten werden, indem gegen 1 / y 2 i für das kleinere x i aufgetragen wird . Noch besser wäre es, weil die x i mit Fehler gemessen werden , und die y i monoton ändern sich mit der x i , sollten wir uns auf die Daten konzentrieren mit den größeren Werten von 1 / y 2 i . Hier ist ein Beispiel aus unserem simulierten Datensatz, der die größte Hälfte vonxi1/yi2xixiyixi1/yi2yi in rot, die kleinste hälfte in blau und eine linie durch den ursprung passen zu den roten punkten.

Zahl

Die Punkte richten sich ungefähr aus, obwohl es bei den kleinen Werten von und y eine leichte Krümmung gibt . (Beachten Sie die Auswahl der Achsen: weil xxyx das Maß ist, ist es üblich, es auf der vertikalen Achse zu zeichnen .) Durch Fokussieren der Anpassung auf die roten Punkte, bei denen die Krümmung minimal sein sollte, sollten wir eine vernünftige Schätzung von . Der im Titel angezeigte Wert von 0,096 ist die Quadratwurzel der Steigung dieser Linie: Es sind nur 4 % weniger als der wahre Wert!b0.0964

Zu diesem Zeitpunkt können die vorhergesagten Werte über aktualisiert werden

x^i=f(yi;a^,b^).

Iterieren Sie, bis sich die Schätzungen entweder stabilisieren (was nicht garantiert ist) oder durch kleine Wertebereiche laufen (was immer noch nicht garantiert werden kann).

Es stellt sich heraus, dass nur schwer abzuschätzen ist, wenn wir eine gute Menge sehr großer Werte von x haben , aber dass b - das die vertikale Asymptote in der ursprünglichen Darstellung (in der Frage) bestimmt und im Mittelpunkt der Frage steht - kann ziemlich genau festgehalten werden, vorausgesetzt, es gibt einige Daten innerhalb der vertikalen Asymptote. In unserem laufenden Beispiel tun die Iterationen konvergieren zu einem = 0.000196 (die fast zweimal der richtige Wert von ist 0,0001 ) undaxba^=0.0001960.0001(was nahe dem korrekten Wert von ist0,1b^=0.10730.1). Dieses Diagramm zeigt noch einmal die Daten, die überlagert sind (a) die wahre Kurve in grau (gestrichelt) und (b) die geschätzte Kurve in rot (durchgehend):

Passt

Diese Anpassung ist so gut, dass es schwierig ist, die wahre Kurve von der angepassten Kurve zu unterscheiden: Sie überlappen sich fast überall. Im Übrigen liegt die geschätzte Fehlervarianz von sehr nahe am wahren Wert von 4 .3.734

Bei diesem Ansatz gibt es einige Probleme:

  • Die Schätzungen sind voreingenommen. Die Abweichung wird deutlich, wenn der Datensatz klein ist und relativ wenige Werte nahe an der x-Achse liegen. Die Passform ist systematisch etwas niedrig.

  • Das Schätzverfahren erfordert ein Verfahren, um "große" von "kleinen" Werten von . Ich könnte explorative Wege vorschlagen, um optimale Definitionen zu identifizieren, aber aus praktischen Gründen können Sie diese als "Tuning" -Konstanten belassen und sie ändern, um die Empfindlichkeit der Ergebnisse zu überprüfen. Ich habe sie willkürlich festgelegt, indem ich die Daten gemäß dem Wert von y i in drei gleiche Gruppen aufteilteyiyi und die beiden äußeren Gruppen verwendete.

  • Die Prozedur funktioniert nicht für alle möglichen Kombinationen von und b oder alle möglichen Datenbereiche. Es sollte jedoch immer dann gut funktionieren, wenn im Datensatz genügend Kurvenmaterial vorhanden ist, um beide Asymptoten wiederzugeben: die vertikale an einem Ende und die geneigte am anderen Ende.ab


Code

Das Folgende ist in Mathematica geschrieben .

estimate[{a_, b_, xHat_}, {x_, y_}] := 
  Module[{n = Length[x], k0, k1, yLarge, xLarge, xHatLarge, ySmall, 
    xSmall, xHatSmall, a1, b1, xHat1, u, fr},
   fr[y_, {a_, b_}] := Root[-b^2 + y^2 #1 - 2 a y #1^2 + a^2 #1^3 &, 1];
   k0 = Floor[1 n/3]; k1 = Ceiling[2 n/3];(* The tuning constants *)
   yLarge = y[[k1 + 1 ;;]]; xLarge = x[[k1 + 1 ;;]]; xHatLarge = xHat[[k1 + 1 ;;]];
   ySmall = y[[;; k0]]; xSmall = x[[;; k0]]; xHatSmall = xHat[[;; k0]];
   a1 = 1/
     Last[LinearModelFit[{yLarge + b/Sqrt[xHatLarge], 
          xLarge}\[Transpose], u, u]["BestFitParameters"]];
   b1 = Sqrt[
     Last[LinearModelFit[{(1 - 2 a1 b  xHatSmall^(3/2)) / ySmall^2, 
          xSmall}\[Transpose], u, u]["BestFitParameters"]]];
   xHat1 = fr[#, {a1, b1}] & /@ y;
   {a1, b1, xHat1}
   ];

Wenden Sie dies auf Daten an (gegeben durch parallele Vektoren xund ygebildet in eine zweispaltige Matrix data = {x,y}) bis zur Konvergenz, beginnend mit Schätzungen von :a=b=0

{a, b, xHat} = NestWhile[estimate[##, data] &, {0, 0, data[[1]]}, 
                Norm[Most[#1] - Most[#2]] >= 0.001 &,  2, 100]
whuber
quelle
3
Dies ist eine erstaunliche Antwort. Ich bin sehr verpflichtet! Ich habe damit gespielt und die Ergebnisse sehen sehr vielversprechend aus. Ich brauche jedoch etwas mehr Zeit, um die Argumentation vollständig zu verstehen :) Außerdem: Könnte ich Sie über Ihre Website wegen einer weiteren (privaten) Frage zu Danksagungen kontaktieren?
Onnodb
3

Lesen Sie die wichtigen Fragen unter @probabilityislogic

Wenn Sie nur Fehler in y haben und diese additiv sind und Sie eine konstante Varianz haben (dh Ihre Annahmen stimmen mit dem überein, wie Sie sich angehört haben), dann lassen Sie y=yxyx=x3/21/x

b

x

-

Bearbeiten Sie, um die zusätzlichen Informationen zu berücksichtigen:

y=b+ax

Wir haben jetzt, dass die Fehler in x und additiv sind. Wir wissen immer noch nicht, ob die Varianz auf dieser Skala konstant ist.

x=y/ab/a=my+c

Let xo=x+η, where this error term may be heteroskedastic (if the original x has constant spread, it will be heteroskedastic, but of known form)

(where the o in xo stands for 'observed')

Then xo=c+my+ϵ where ϵ=ζ looks nice but now has correlated errors in the x and y variables; so it's a linear errors-in-variables model, with heteroskedasticity and known form of dependence in the errors.

I am not sure that improves things! I believe there are methods for that kind of thing, but it's not really my area at all.

I mentioned in the comments that you might like to look at inverse regression, but the particular form of your function may preclude getting far with that.

You might even be stuck with trying fairly robust-to-errors-in-x methods in that linear form.

--

Now a huge question: if the errors are in x, how the heck were you fitting the nonlinear model? Were you just blindly minimizing the sum of squared errors in y? That might well be your problem.

I suppose one could try to rewrite the original thing as a model with errors in the x and try to optimize the fit but I am not sure I see how to set that up right.

Glen_b -Reinstate Monica
quelle
Thanks! It's an interesting transformation, hadn't thought of that --- even though the errors are in x, I'll play around with it anyway!
onnodb
2
"even though the errors are in x" -- yikes, that's kind of important. You may want to check up on inverse regression.
Glen_b -Reinstate Monica
3
...or you could directly fit the model x=13(2ya+21/3y2(27a4b22a3y3+3327a8b44a7b2y3)1/3+(27a4b22a3y3+3327a8b44a7b2y3)1/321/3a2) :-).
whuber
@whuber Hmm. Solving for the cubic, clever. If we write the original in terms of xo where xo is x+ζ, this would leave us with x=(thatmonster)+ϵ, (again with ϵ=ζ) which at least notionally can be done with nonlinear least squares. So that looks like it takes care of the error propagation properly. It might actually work if the OP was to use the linear form I was playing with (using some robust-to-errors-in-the-IV-and-hetero estimation) to get good starting values for the parameters and then try to use this nonlinear LS form to polish it.
Glen_b -Reinstate Monica
I believe linearizing the function x(y) and (ironically) applying nonlinear (weighted) least squares would work, especially if the data were restricted to relatively small values of y where the curve is primarily determined by b.
whuber
0

After some more weeks of experimenting, a different technique seems to work the best in this particular case: Total Least Squares fitting. It's a variant of the usual (nonlinear) Least Squares fitting, but instead of measuring fit errors along just one of the axes (which causes problems in highly nonlinear cases such as this one), it takes both axes into account.

There's a plethora of articles, tutorials and books avaiable on the subject, although the nonlinear case is more elusive. There's even some MATLAB code available.

onnodb
quelle
Thanks for sharing this. I accept that it it might produce good-looking results in your case, but I have two concerns. The first you mention: how exactly does one apply total least squares/errors-in-variables regression/orthogonal regression/Deming regression to nonlinear fits? The second is that this approach does not seem appropriate for your data, in which y is measured essentially without error. When that's the case, you should not be allowing for residuals in the y variable and doing so ought to produce unreliable, biased results.
whuber
@whuber Thanks for expressing your concerns! Right now, I'm still working on running simulations to probe the reliability of TLS fitting for this problem. What I've seen thus far, though, is that TLS' consideration of both variables helps greatly in overcoming the high non-linearity of the model. Fits of simulated data are reliable and converge very well. More work needs to be done though, and I'll definitely have to stack your method up to this one, once we have more actual data available --- and look in detail into your concerns.
onnodb
OK--don't forget I have comparable concerns about the method I proposed!
whuber