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=ax−b/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
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,
xi≈1a(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
xi≈b21−2a^b^x^3/2y2i.
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/y2ixixiyixi1/y2iyi in rot, die kleinste hälfte in blau und eine linie durch den ursprung passen zu den roten punkten.
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):
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 x
und y
gebildet 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]