Come adattare un modello non lineare personalizzato utilizzando più parametriHo un modello non lineare per il quale ho creato una nuova colonna con la formula sottostante. Il modello è descritto come simile a una curva sigmoidale con due stadi definiti per i quali ho tre parametri che caratterizzano ogni stadio. Uno stadio iniziale descritto dai parametri K1, Y1 e P1 ed un secondo stadio descritto dai parametri K2, Y2 e P2. Inoltre, per ogni parametro ho creato una nuova colonna a cui è stato attribuito un valore iniziale di 0.1 per facilitare l'adattamento (non nello script seguente). Tuttavia, i valori possono variare ampiamente tra i campioni da 0 a 1.
Ho un elenco di campioni per i quali devo adattare lo stesso modello e recuperare i valori di questi parametri in base al miglior adattamento. La soluzione migliore che vorrei misurare in base al minimo RMSE o al massimo R2. Tuttavia, non ho idea di come farlo. Ho creato una colonna per la funzione Perdita che sto calcolando come SSQ tra i dati sperimentali (:Produzione) e il Modello (:Modello) sperando che ciò possa essere d'aiuto durante l'adattamento del modello.
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>
Come esempio dello script risultante quando si adatta il modello a un campione
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" )
);
Sto cercando di automatizzare queste analisi poiché per ora ho utilizzato Excel Solver.
Qualcuno potrebbe fornire un feedback su come eseguire automaticamente l'adattamento del modello attraverso tutti i campioni nella tabella dati e recuperare i parametri per quando RSME è minimo (se ho ragione quando la funzione Loss è minima) o quando R2 è massimo?
I valori dei parametri in ogni colonna verrebbero aggiornati automaticamente?
Grazie
Ivo
Ri: Come adattare un modello non lineare personalizzato utilizzando più parametriGrazie.Ri: Come adattare un modello non lineare personalizzato utilizzando più parametriLa funzione di perdita predefinita è i minimi quadrati, quindi JMP eleva automaticamente al quadrato la differenza tra la risposta osservata e la risposta prevista.
Penso che le stime dei tuoi parametri saranno elevate, quindi sarà difficile convergere. Ancora una volta, risolverei il problema utilizzando Nonlinear in modo interattivo prima di provare ad automatizzarlo con uno script.
Si consiglia di contattare il supporto tecnico di JMP in merito a questo problema. (support@jmp.com)
Ri: Come adattare un modello non lineare personalizzato utilizzando più parametrisi questo è il modello che sto usando quale funzione dovrei usare quindi per specificare la funzione Loss?Ri: Come adattare un modello non lineare personalizzato utilizzando più parametriÈ questo il modello che stai cercando di adattare:

La funzione di perdita non dovrebbe utilizzare la funzione SSQ(). La piattaforma non lineare combinerà automaticamente la perdita in ogni riga.
Ri: Come adattare un modello non lineare personalizzato utilizzando più parametriI valori iniziali sono stati utilizzati sulla base dei risultati ottenuti su Excel Solver per gli stessi dati.
È un po' sorprendente che JMP non raggiunga risultati simili o che non raggiunga una buona convergenza. Inoltre, JMP fa fatica a eseguire le iterazioni utilizzando la funzione Loss e alla fine si arresta in modo anomalo. Quando lo si esegue senza la funzione Loss, non raggiunge alcuna convergenza.
Ri: Come adattare un modello non lineare personalizzato utilizzando più parametriUn altro commento: consiglio di lavorare con Nonlinear in modo interattivo fino a quando non si determina la configurazione migliore. Probabilmente andrà più veloce e più facile in questo modo piuttosto che cercare di far funzionare lo scripting allo stesso tempo. È quindi possibile salvare lo script per continuare lo sviluppo.
Ri: Come adattare un modello non lineare personalizzato utilizzando più parametriInnanzitutto, l'opzione Fine non significa andare per sempre. Equivale a fare clic sul pulsante Vai anziché sul pulsante Passo nell'interfaccia utente. Va fino a quando non viene raggiunta una delle regole di arresto (criterio). Il limite predefinito per il numero di iterazioni è 60. Puoi eseguire di nuovo per far lavorare di più Nonlinear per ottenere una buona soluzione. Puoi anche modificare (rilassare o rafforzare) gli altri criteri se necessario.
In secondo luogo, la lenta convergenza potrebbe essere un'indicazione di scelte sbagliate per i valori di partenza. Come hai determinato quei valori per i tuoi dati?
Ri: Come adattare un modello non lineare personalizzato utilizzando più parametriLa mia esperienza su JSL è minima. Ho appena iniziato purtroppo. Sto usando JMP14. Grazie per il feedback.
Ho modificato il tuo script come suggerito (sotto) e l'ho eseguito. Mi dà le stime ma non esegue le iterazioni fino a "infinito" come penso che il comando :Finish richiederebbe. È corretto? Va solo fino al 60. Pertanto, l'adattamento dell'output non è eccezionale e le stime dei parametri sono troppo alte o negative, il che significa che potrebbe essere necessario impostare i vincoli dei parametri
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>Ri: Come adattare un modello non lineare personalizzato utilizzando più parametriPer quanto riguarda la modellazione non lineare, ho familiarità solo con l'impostazione di un criterio di convergenza, un obiettivo.Molti anni fa, quando la potenza di calcolo era debole rispetto a oggi, in genere utilizzavo SAS per creare un ciclo di più stime iniziali, quindi confrontavo i risultati residui. Quindi non posso aiutarti con la tua richiesta del "miglior modello".
Non hai menzionato quale versione di JMP stai utilizzando, né la tua conoscenza degli script. Per comprendere questo script è necessario conoscere alcune sintassi di base. Di seguito è riportata una modifica dello script da JMP Scripting Index>Objects>Nonlinear>CopyByGroupScript.
Esso :
- crea una colonna "per", per il tuo esempio questa sarebbe la tua colonna :Sample
- Assegna un handle/riferimento al report, obj. Qui useresti il tuo script che cambia Dove( :Campione == "M301" ) A Da(:campione)
- dimostra come creare un elenco di risultati con istruzioni "get". Vedere JMP Scripting Index>Oggetti>Non lineare per i messaggi disponibili.
- In alternativa, puoi creare tabelle di risultati.I report JMP (obj) sono un elenco nidificato di caselle di visualizzazione. Ad esempio, dalla GUI se hai una determinata casella di tabella per uno per gruppo e fai clic con il pulsante destro del mouse e seleziona Crea tabella di dati combinati, quindi questo JSL sta facendo lo stesso.Xpath è un metodo generale per trovare le caselle di visualizzazione. Find è meno flessibile, ma sintatticamente più facile da leggere. L'istruzione Xpath riportata di seguito restituisce un handle/riferimento a ciascuna casella di contorno nel report obj che rappresenta una soluzione. Ogni riquadro di schema della soluzione ha 2 riquadri da tavolo, so che ny guardando la struttura.Tutto ciò di cui ho bisogno è la prima occorrenza ecah di queste caselle di tabella per inviare il messaggio per creare una tabella di dati combinata.
Questo dovrebbe darti un punto di partenza.Prima esegui lo script qui sotto per assicurarti che venga eseguito sulla tua versione di JMP, quindi modifica. Ecco un'immagine di una tabella di stime per questo script di esempio.
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>