So passen Sie ein benutzerdefiniertes nichtlineares Modell mithilfe mehrerer Parameter anIch habe ein nichtlineares Modell, für das ich unten eine neue Spalte mit der Formel erstellt habe. Es wird beschrieben, dass das Modell einer Sigmoidalkurve mit zwei definierten Stufen ähnelt, 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 Stichproben stark variieren und zwischen 0 und 1 liegen.
Ich habe eine Liste von Beispielen, für die ich dasselbe Modell anpassen und diese Parameterwerte entsprechend der besten Anpassung abrufen muss. Die beste Anpassung möchte ich anhand des minimalen RMSE oder des maximalen R2 messen. Allerdings habe ich keine Ahnung, wie das geht. 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 bei der Anpassung des Modells hilfreich ist.
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 verwende.
Könnte jemand Feedback dazu geben, wie man die Modellanpassung automatisch durch alle Proben in der Datentabelle laufen lässt 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: So passen Sie ein benutzerdefiniertes nichtlineares Modell mithilfe mehrerer Parameter anDanke.Betreff: So passen Sie ein benutzerdefiniertes nichtlineares Modell mithilfe mehrerer Parameter anDie Standardverlustfunktion ist die Methode der kleinsten Quadrate, sodass JMP die Differenz zwischen der beobachteten Reaktion und der vorhergesagten Reaktion automatisch quadriert.
Ich denke, dass Ihre Parameterschätzungen hoch sein werden, sodass es schwierig sein wird, zu konvergieren. Auch hier würde ich das Problem interaktiv mithilfe von Nonlinear lösen, bevor ich versuche, es mit einem Skript zu automatisieren.
Möglicherweise möchten Sie sich bezüglich dieses Problems an den technischen Support von JMP wenden. (support@jmp.com)
Betreff: So passen Sie ein benutzerdefiniertes nichtlineares Modell mithilfe mehrerer Parameter anJa, das ist das Modell, das ich verwende. Welche Funktion sollte ich dann verwenden, um die Verlustfunktion anzugeben?Betreff: So passen Sie ein benutzerdefiniertes nichtlineares Modell mithilfe mehrerer Parameter anIst dies das Modell, das Sie anpassen möchten:

Die Verlustfunktion sollte nicht die SSQ()-Funktion verwenden. Die nichtlineare Plattform kombiniert den Verlust in jeder Zeile automatisch.
Betreff: So passen Sie ein benutzerdefiniertes nichtlineares Modell mithilfe mehrerer Parameter anDie Startwerte wurden basierend auf den mit Excel Solver für dieselben Daten erzielten Ergebnissen verwendet.
Es ist etwas überraschend, dass JMP keine ähnlichen Ergebnisse erzielt oder keine gute Konvergenz erreicht. Außerdem hat JMP Schwierigkeiten, die Iterationen mit der Verlustfunktion auszuführen, und stürzt schließlich ab. Wenn es ohne Verlustfunktion ausgeführt wird, wird keine Konvergenz erreicht.
Betreff: So passen Sie ein benutzerdefiniertes nichtlineares Modell mithilfe mehrerer Parameter anNoch ein Kommentar: Ich empfehle, interaktiv mit Nonlinear zu arbeiten, bis Sie die beste Konfiguration gefunden haben. Auf diese Weise wird es wahrscheinlich schneller und einfacher gehen, als gleichzeitig zu versuchen, das Skripting zum Laufen zu bringen. Anschließend können Sie das Skript speichern, um mit der Entwicklung fortzufahren.
Betreff: So passen Sie ein benutzerdefiniertes nichtlineares Modell mithilfe mehrerer Parameter anErstens bedeutet die Option „Fertig stellen“ nicht, dass der Vorgang für immer fortgesetzt wird. Dies entspricht dem Klicken auf die Schaltfläche „Los“ anstelle der Schaltfläche „Schritt“ 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 den Vorgang erneut ausführen, damit Nonlinear stärker arbeitet, um eine gute Lösung zu erhalten. Auch die anderen Kriterien können Sie bei Bedarf verändern (lockern oder verstärken).
Zweitens könnte die langsame Konvergenz ein Hinweis auf eine schlechte Auswahl der Startwerte sein. Wie haben Sie diese Werte für Ihre Daten ermittelt?
Betreff: So passen Sie ein benutzerdefiniertes nichtlineares Modell mithilfe mehrerer Parameter anMeine 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 zwar die Schätzungen, aber es führt die Iterationen erst „unendlich“ aus, wie ich denke, dass der Befehl :Finish dies anfordern würde. Ist das korrekt? Es geht nur bis 60. Daher ist die Ausgabeanpassung nicht besonders gut 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: So passen Sie ein benutzerdefiniertes nichtlineares Modell mithilfe mehrerer Parameter anWas die nichtlineare Modellierung betrifft, kenne ich mich nur mit der Festlegung eines Konvergenzkriteriums, eines Ziels, aus.Vor vielen Jahren, als die Rechenleistung im Vergleich zu heute schwach war, habe ich normalerweise SAS verwendet, um eine Schleife aus mehreren Startschätzungen zu erstellen und dann die Restergebnisse zu vergleichen. Daher kann ich bei Ihrer Anfrage nach dem „besten Modell“ nicht weiterhelfen.
Sie haben weder die von Ihnen verwendete JMP-Version noch Ihre Skriptkenntnisse erwähnt. Um dieses Skript zu verstehen, müssen Sie einige grundlegende Syntaxkenntnisse kennen. Nachfolgend finden Sie eine Änderung des Skripts aus JMP Scripting Index>Objects>Nonlinear>CopyByGroupScript.
Es :
- erstellt eine „by“-Spalte, in Ihrem Beispiel wäre dies Ihre :Sample-Spalte
- Weist dem Bericht ein Handle/eine Referenz zu, obj. Hier würden Sie Ihr Skript ändern Wo( :Sample == "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) sind eine verschachtelte Liste von Anzeigefeldern. Wenn Sie beispielsweise in der GUI ein bestimmtes Tabellenfeld für eine Gruppe haben, mit der rechten Maustaste klicken und „Kombinierte Datentabelle erstellen“ auswählen, führt diese JSL dasselbe aus.Xpath ist eine allgemeine Methode zum Auffinden von Anzeigefeldern. Find ist weniger flexibel, aber syntaktisch einfacher zu lesen. Die folgende Xpath-Anweisung gibt ein Handle/eine Referenz auf jedes Gliederungsfeld im obj-Bericht zurück, das eine Lösung darstellt. Jedes Lösungsgliederungsfeld hat zwei Tabellenfelder, das weiß ich, wenn ich mir die Struktur ansehe.Alles, was ich brauche, ist das erste Auftreten dieser Tabellenfelder, um die Nachricht zu senden und eine kombinierte Datentabelle zu erstellen.
Dies sollte Ihnen einen Ausgangspunkt geben.Führen Sie zunächst das folgende Skript aus, um sicherzustellen, dass es auf Ihrer JMP-Version ausgeführt wird, und ändern Sie es dann. Hier ist ein Bild einer Schätzungstabelle 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>