Ich habe Daten in der Form . Für die Schätzung von bis ich die Formeln dieses Papiers: John Fox - Nichtlineare Regression und nichtlineare kleinste Quadrate In diesem Papier wird \ beta_1 anhand der Daten geschätzt. Wenn ich das mache, funktioniert es gut, auch wenn ich nur drei Punkte habe. Daraus kann ich die beiden anderen berechnen. Ich habe meine Parameter mit nls () in R und LevenbergMarquardt in C # getestet. Die von ihnen zurückgegebenen Modelle sind zufriedenstellend.
Das Problem ist, dass ich nicht auf die Daten schauen möchte, um einen guten Schätzer für . Ich möchte, dass mein Programm sie berechnet. Für einige Zeit habe ich Werte verwendet, die etwas höher waren als das Maximum meiner Werte (etwas zwischen und . Dies funktionierte gut, solange die Punkte den größten Teil der Funktion abdeckten. Es funktionierte auch gut, wenn die Datenpunkte befanden sich irgendwo von der "Spitze" der Kurve, aber als sie alle aus dem Bereich "unterhalb" des Wendepunkts stammten, war dieser Schätzer definitiv niedriger als er sein sollte und ich konnte das Modell nicht anpassen. Wenn ich etwas verwende Das ist definitiv höher als der Maximalpunkt (durch Multiplikation mit lächerlich hohen Werten). Das Modell passt in keiner nützlichen Weise.
Messungen könnten so aussehen:
x = (40, 50, 60, 70), y = (1000, 950, 400, 200) -> leicht abzuschätzen
x = (40, 50, 60, 70), y = (1000, 950, 800, 100) -> leicht abzuschätzen
x = (40, 50, 60, 70), y = (500, 200, 100, 50) -> nicht so einfach abzuschätzen
Ich denke, ich könnte herausfinden, wo ich mich in der Funktion befinde (am "unteren", am "oberen", am Hang), indem ich die Deltas in den gegebenen Punkten berechne und abhängig davon eine Obergrenze berechne. Hat jemand einen Hinweis auf eine bessere Lösung? Zusätzliche Informationen: Wenn dies nicht möglich ist, ist es für mich wichtiger, dass Messungen, die angepasst werden können, so gut wie möglich sind, und ich akzeptiere, dass einige Messungen überhaupt nicht angepasst werden können.
(Obwohl ich eine Implementierung in C # möchte, habe ich sie hier gepostet, glaube ich nicht, dass das Problem sprachabhängig ist.)
Update (Anwendung davon):
x sind Temperaturwerte und y die entsprechenden Messungen. Von Natur aus ist es gegeben, dass es wie eine logistische Kurve mit höheren y-Werten bei niedrigeren Temperaturen aussehen sollte und umgekehrt. Der Schmelzpunkt ist gleich dem Wendepunkt der Kurve, der sich bei kleinen Änderungen der Modellparameter stark ändert.
Update (einige zusammengesetzte Daten mit 7 Datenpunkten und bekanntem Wendepunkt bei 60):
//first I made up some data without any noise and enough (13) points
double[] x17 = { 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90 };
double[] y17 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 59.642....
//Then I took three different parts of that data
(to simulate how much data I will have in the real world)
double[] x18 = { 30, 35, 40, 45, 50, 55, 60 };
double[] y18 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000 };
//calculated inflection point: 59.263.... is ok!
double[] x19 = { 60, 65, 70, 75, 80, 85, 90 };
double[] y19 = { 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 53.447.... to small!
double[] x20 = { 45, 50, 55, 60, 65, 70, 75 };
double[] y20 = { 1700, 1500, 1280, 1000, 720, 500, 300 };
//calculated inflection point: 59.868... almost perfect!
Mein aktueller Ansatz für eine Schätzung der Obergrenze ist y0 * y0 / y1. Auf diese Weise hoffe ich zu berücksichtigen, dass ich möglicherweise nicht immer einen Wert nahe dem Maximum habe.
Update: Die x- und y-Werte werden niemals negativ sein. x ist immer {40, 45, 50, 55, 60, 65, 70}, es sei denn, ein Datenpunkt geht verloren.
Update: Ich habe viele, viele Tests mit simulierten Daten durchgeführt, die einfach anzupassen sein sollten (ich wähle Datenpunkte aus, die genau auf der Kurve liegen = ohne Rauschen), und ich sehe, dass es gut funktioniert, es sei denn, der erste oder zweite Datenpunkt (wo x = 40 oder x = 45) fehlt. Ich denke, ich muss solche Messungen verwerfen und der Benutzer muss damit leben.