Anpassen eines benutzerdefinierten nichtlinearen Modells mit mehreren ParameternIch habe ein nichtlineares Modell, für das ich eine neue Spalte mit der folgenden Formel erstellt habe. Das Modell wird als einer sigmoidalen Kurve mit zwei definierten Stufen ähnlich beschrieben, für die ich drei Parameter habe, die jede Stufe charakterisieren. Eine Anfangsstufe, die durch die Parameter K1, Y1 und P1 beschrieben wird, und eine zweite Stufe, die durch die Parameter K2, Y2 und P2 beschrieben wird. Außerdem habe ich für jeden Parameter eine neue Spalte erstellt und einen Anfangswert von 0,1 zugewiesen, um die Anpassung zu erleichtern (nicht im Skript unten). Die Werte können jedoch zwischen den Proben von 0 bis 1 stark variieren.
Ich habe eine Liste von Beispielen, für die ich dasselbe Modell anpassen und diese Parameterwerte entsprechend der besten Anpassung abrufen muss. Die beste Passform möchte ich basierend auf dem minimalen RMSE oder dem maximalen R2 messen. Allerdings habe ich keine Ahnung, wie man das macht. Ich habe eine Spalte für die Verlustfunktion erstellt, die ich als SSQ zwischen den experimentellen Daten (:Production) und dem Modell (:Model) berechne, in der Hoffnung, dass dies beim Anpassen des Modells helfen würde.
col7 = New Column("Model");
col7<< set formula (Parameter({Y1_Y1_0 = 0.001, K1_K1_0 = 0.001, P1_P1_0 = 0.001, Y2_Y2_0 = 0.001, K2_K2_0 = 0.001, P2_P2_0 = 0.001},
Y1_Y1_0 * Exp(-Exp(((K1_K1_0 * Exp()) / Y1_Y1_0) * (P1_P1_0 - :Days))) + Y2_Y2_0 * Exp(-Exp(((K2_K2_0 * Exp()) / Y2_Y2_0) * (P2_P2_0 - :Days)))));
col8=newcolumn("Error");
col8<< set Formula(SSQ(:Production - :Model));
col8<<EVALFORMULA></EVALFORMULA>
Als Beispiel für das resultierende Skript, wenn das Modell an eine Probe angepasst wird
Nonlinear(
Y( :Methane Yield ),
X( :Model ),
Loss( :Err ),
Iteration Limit( 1000 ),
Numeric Derivatives Only( 1 ),
Unthreaded( 1 ),
Loss is Neg LogLikelihood( 1 ),
Newton,
Finish,
Where( :Sample == "M301" )
);
Ich versuche, diese Analysen zu automatisieren, da ich bisher Excel Solver verwendet habe.
Könnte jemand Feedback dazu geben, wie man die Modellanpassung automatisch durch alle Proben in der Datentabelle führt und die Parameter abruft, wenn RSME minimal ist (wenn ich richtig liege, wenn die Verlustfunktion minimal ist) oder wenn R2 maximal ist?
Würden die Parameterwerte in jeder Spalte automatisch aktualisiert?
Danke
Ivo
Betreff: Anpassung eines benutzerdefinierten nichtlinearen Modells mit mehreren ParameternDanke.Betreff: Anpassung eines benutzerdefinierten nichtlinearen Modells mit mehreren ParameternDie Standardverlustfunktion ist die Methode der kleinsten Quadrate, sodass JMP automatisch die Differenz zwischen der beobachteten Reaktion und der vorhergesagten Reaktion quadriert.
Ich denke, dass Ihre Parameterschätzungen hoch sein werden, so dass es schwierig sein wird, zu konvergieren. Auch hier würde ich das Problem mit Nonlinear interaktiv lösen, bevor ich versuche, es mit einem Skript zu automatisieren.
Wenden Sie sich bezüglich dieses Problems möglicherweise an den technischen Support von JMP. (support@jmp.com)
Betreff: Anpassung eines benutzerdefinierten nichtlinearen Modells mit mehreren ParameternJa, das ist das Modell, das ich verwende. Welche Funktion sollte ich dann verwenden, um die Verlustfunktion anzugeben?Betreff: Anpassung eines benutzerdefinierten nichtlinearen Modells mit mehreren ParameternIst dies das Modell, das Sie anpassen möchten:

Die Verlustfunktion sollte die SSQ()-Funktion nicht verwenden. Die nichtlineare Plattform kombiniert den Verlust in jeder Reihe automatisch.
Betreff: Anpassung eines benutzerdefinierten nichtlinearen Modells mit mehreren ParameternDie Startwerte wurden basierend auf den Ergebnissen verwendet, die auf Excel Solver für dieselben Daten erzielt wurden.
Es ist etwas überraschend, dass JMP keine ähnlichen Ergebnisse erzielt oder keine gute Konvergenz erzielt. Außerdem hat JMP Schwierigkeiten, die Iterationen mit der Verlustfunktion auszuführen, und stürzt schließlich ab. Beim Betrieb ohne Loss-Funktion wird keine Konvergenz erreicht.
Betreff: Anpassung eines benutzerdefinierten nichtlinearen Modells mit mehreren ParameternNoch ein Kommentar: Ich empfehle, interaktiv mit Nonlinear zu arbeiten, bis Sie die beste Einstellung gefunden haben. Auf diese Weise wird es wahrscheinlich schneller und einfacher gehen, als zu versuchen, das Skripting gleichzeitig zum Laufen zu bringen. Sie können das Skript dann speichern, um die Entwicklung fortzusetzen.
Betreff: Anpassung eines benutzerdefinierten nichtlinearen Modells mit mehreren ParameternErstens bedeutet die Option „Fertig stellen“ nicht „für immer gehen“. Dies entspricht dem Klicken auf die Go-Schaltfläche anstelle der Step-Schaltfläche in der Benutzeroberfläche. Es geht so lange, bis eine der Stoppregeln (Kriterium) erreicht ist. Das Standardlimit für die Anzahl der Iterationen beträgt 60. Sie können erneut laufen, um die nichtlineare Arbeit zu erschweren, um eine gute Lösung zu erhalten. Bei Bedarf können Sie auch die anderen Kriterien ändern (entspannen oder verstärken).
Zweitens könnte die langsame Konvergenz ein Hinweis auf eine schlechte Wahl der Startwerte sein. Wie haben Sie diese Werte für Ihre Daten ermittelt?
Betreff: Anpassung eines benutzerdefinierten nichtlinearen Modells mit mehreren ParameternMeine Erfahrung mit JSL ist minimal. Ich habe leider gerade erst angefangen. Ich verwende JMP14. Danke für die Rückmeldung.
Ich habe Ihr Skript wie von Ihnen vorgeschlagen (unten) geändert und ausgeführt. Es gibt mir die Schätzungen, aber es führt die Iterationen nicht bis "unendlich" aus, wie ich denke, dass der Befehl :Finish anfordern würde. Ist das korrekt? Es geht nur bis 60. Daher ist die Ausgabeanpassung nicht großartig und die Parameterschätzungen sind zu hoch oder negativ, was bedeutet, dass ich möglicherweise Parameterbeschränkungen festlegen muss
obj = Nonlinear(Y( :Methane Yield ), X( :Model ), Loss( :Err ), Finish(), By( :Sample ));
obj << go;
obj << get estimates;
_xx = obj << Xpath("//OutlineBox[@helpKey='Nonlinear Solution']");
fit_dt = (_xx[1]<<FIND></FIND>Betreff: Anpassung eines benutzerdefinierten nichtlinearen Modells mit mehreren ParameternWas die nichtlineare Modellierung betrifft, so kenne ich nur das Setzen eines Konvergenzkriteriums, eines Ziels.Vor vielen Jahren, als die Rechenleistung im Vergleich zu heute schwach war, habe ich normalerweise SAS verwendet, um eine Schleife aus mehreren Anfangsschätzungen zu erstellen und dann die Restergebnisse zu vergleichen. Daher kann ich Ihnen bei Ihrer Anfrage nach dem "besten Modell" nicht helfen.
Sie haben weder erwähnt, welche Version von JMP Sie verwenden, noch Ihre Skriptkenntnisse. Um dieses Skript zu verstehen, müssen Sie einige grundlegende Syntax kennen. Unten ist eine Änderung des Skripts aus JMP Scripting Index>Objects>Nonlinear>CopyByGroupScript.
Es :
- erstellt eine "by"-Spalte, für Ihr Beispiel wäre dies Ihre :Sample-Spalte
- Weist dem Bericht ein Handle/eine Referenz zu, obj. Hier würden Sie Ihr Skript ändern Wo( :Beispiel == "M301" ) Zu Von (:Beispiel)
- demonstriert, wie man mit „get“-Anweisungen eine Ergebnisliste erstellt. Sehen JMP Scripting Index>Objekte>Nichtlinear für verfügbare Nachrichten.
- Alternativ können Sie Ergebnistabellen erstellen.JMP-Berichte (obj) ist eine verschachtelte Liste von Anzeigefeldern. Wenn Sie beispielsweise in der GUI ein bestimmtes Tabellenfeld für eine einzelne Gruppe haben und mit der rechten Maustaste klicken und Kombinierte Datentabelle erstellen auswählen, dann macht diese JSL dasselbe.Xpath ist eine allgemeine Methode, um Anzeigeboxen zu finden. Find ist weniger flexibel, aber syntaktisch einfacher zu lesen. Die nachstehende Xpath-Anweisung gibt einen Handle/Verweis auf jedes Gliederungsfeld im obj-Bericht zurück, das eine Lösung ist. Jede Lösungsskizzenbox hat 2 Tabellenboxen, das weiß ich, wenn ich mir die Struktur ansehe.Alles, was ich brauche, ist das erste Auftreten dieser Tabellenfelder, um die Nachricht zu senden, um eine kombinierte Datentabelle zu erstellen.
Dies sollte Ihnen einen Ausgangspunkt bieten.Führen Sie zuerst das folgende Skript aus, um sicherzustellen, dass es auf Ihrer Version von JMP ausgeführt wird, und ändern Sie es dann. Hier ist ein Bild einer Tabelle mit Schätzungen für dieses Beispielskript.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Nonlinear Examples/US Population.jmp" );
dt << New Column( "_bycol",
Character,
Nominal,
set values( Repeat( {"A", "B"}, N Rows( dt ) )[1 :: N Rows( dt )] )
);
obj = Nonlinear( Y( :pop ), X( :Name( "X-formula" ) ), Finish(), By( _bycol )) ;
obj << go;
//returns a list of vectors where each vector, contains the parameters estimates
obj << get estimates;
//also see Get SSE, Get Parameter Names, Get CI
//Alternately, make a table
_xx = obj << Xpath("//OutlineBox[@helpKey='Nonlinear Solution']");
//only 2 groups so only 2 are found; each contains two sub tables
fit_dt = (_xx[1]<<FIND></FIND>