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 seguente. Il modello è descritto come simile a una curva sigmoidale con due fasi definite per la quale ho tre parametri che caratterizzano ciascuna fase. Una fase iniziale descritta dai parametri K1, Y1 e P1 ed una seconda fase descritta dai parametri K2, Y2 e P2. Inoltre, per ogni parametro ho creato una nuova colonna e ho 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 alla soluzione migliore. L'adattamento migliore che vorrei misurare in base all'RMSE minimo o al R2 massimo. 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 questo 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 ciascuna colonna verranno aggiornati automaticamente?
Grazie
Ivo
Re: Come adattare un modello non lineare personalizzato utilizzando più parametriGrazie.Re: Come adattare un modello non lineare personalizzato utilizzando più parametriLa funzione di perdita predefinita è quella dei 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 Non lineare in modo interattivo prima di provare ad automatizzarlo con uno script.
Potrebbe essere necessario contattare il supporto tecnico JMP in merito a questo problema. (support@jmp.com)
Re: Come adattare un modello non lineare personalizzato utilizzando più parametrisì, questo è il modello che sto usando. quale funzione dovrei usare quindi per specificare la funzione di perdita?Re: Come adattare un modello non lineare personalizzato utilizzando più parametriÈ questo il modello che stai cercando di adattare:

La funzione di perdita non deve utilizzare la funzione SSQ(). La piattaforma non lineare combinerà automaticamente la perdita in ciascuna riga.
Re: Come adattare un modello non lineare personalizzato utilizzando più parametriI valori iniziali sono stati utilizzati in base ai 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 fatica a eseguire le iterazioni utilizzando la funzione Loss e alla fine si blocca. Quando lo si esegue senza la funzione Loss non si ottiene alcuna convergenza.
Re: Come adattare un modello non lineare personalizzato utilizzando più parametriUn altro commento: consiglio di lavorare con Non lineare in modo interattivo finché non si determina la migliore configurazione. Probabilmente sarà più veloce e più semplice in questo modo rispetto al tentativo di far funzionare lo script allo stesso tempo. È quindi possibile salvare lo script per continuare lo sviluppo.
Re: 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 Passaggio nell'interfaccia utente. Continua finché non viene raggiunta una delle regole (criterio) di arresto. Il limite predefinito del numero di iterazioni è 60. Puoi eseguire di nuovo per rendere Non lineare più difficile da ottenere una buona soluzione. Puoi anche modificare (allentare o rafforzare) gli altri criteri, se necessario.
In secondo luogo, la lenta convergenza potrebbe essere un’indicazione di scelte sbagliate per i valori iniziali. Come hai determinato questi valori per i tuoi dati?
Re: 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 fornisce le stime ma non esegue le iterazioni fino a "infinito" come penso che il comando :Finish richiederebbe. È corretto? Dura solo fino ai 60. Pertanto, l'adattamento dell'output non è eccezionale e le stime dei parametri sono troppo elevate o negative, il che significa che potrebbe essere necessario impostare vincoli sui 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>Re: Come adattare un modello non lineare personalizzato utilizzando più parametriPer quanto riguarda la modellazione non lineare, ho familiarità solo con la definizione di un criterio di convergenza, di 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é le tue conoscenze di scripting. Per comprendere questo script è necessario conoscere la sintassi di base. Di seguito è riportata una modifica dello script da JMP Scripting Index>Objects>Nonlinear>CopyByGroupScript.
Esso :
- crea una colonna "by", per il tuo esempio questa sarebbe la colonna :Sample
- Assegna un handle/riferimento al report, obj. Qui utilizzeresti la modifica dello script Dove( :Esempio == "M301" ) A Per(:Campione)
- dimostra come creare un elenco di risultati con le istruzioni "get". Vedere Indice JMP Scripting>Oggetti>Non lineare per 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 si dispone di una determinata casella di tabella per uno per gruppo e si fa clic con il pulsante destro del mouse e si seleziona Crea tabella dati combinata, questo JSL sta facendo lo stesso.XPath è un metodo generale per trovare caselle di visualizzazione. Find è meno flessibile, ma sintatticamente più facile da leggere. L'istruzione Xpath seguente restituisce un handle/riferimento a ciascuna casella di struttura nel report obj che rappresenta una soluzione. Ogni casella di struttura della soluzione ha 2 caselle di tabella, lo so guardando la struttura.Tutto ciò di cui ho bisogno è la prima occorrenza di queste caselle di tabella per inviare il messaggio per creare una tabella di dati combinata.
Questo dovrebbe darti un punto di partenza.Per prima cosa esegui lo script seguente per assicurarti che funzioni sulla tua versione di JMP, quindi modificalo. 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>