Regressione generalizzata: recupero dello script dei parametri di ottimizzazioneUtilizzando i metodi di restringimento della piattaforma di regressione generalizzata (lazo, rete elastica, ecc.) Con distribuzione lognormale, ho bisogno di creare un grafico a dispersione del parametro di ottimizzazione rispetto a varie statistiche di adattamento (probabilità logaritmica negativa, R2 generalizzato). Speravo di farlo preimpostando i valori del parametro di ottimizzazione e preimpostando anche il numero di punti della griglia su 1 (il numero di punti lungo la griglia che JMP utilizza per il parametro di ottimizzazione).
Lo script seguente non riconosce i diversi valori del parametro di ottimizzazione (^PEN^) e riporta valori identici per ogni iterazione del ciclo di stima del modello. La mia ipotesi migliore è che non riconosca i valori necessari per queste due righe nello script:
Lambda Penalty( ^PEN^ ),
Number of Grid Points( 1 ),
Qualsiasi saggezza sarebbe molto apprezzata!
//Script to retrieve parametrics negative logl and R2GEN
//Both data tables below must be open for script to run
dt = Data Table("JMP Test Data.jmp");
dt_pens = Data Table("Penalties1.jmp");
//Get copy of penalty table to store results
dt_results = dt_pens << Subset( All rows, Selected columns only( 0 ) );
dt_results << New Column("RsqGEN Training");
dt_results << New Column("RsqGEN Validation");
dt_results << New Column("RsqGEN Test");
dt_results << New Column("neglogl Training");
dt_results << New Column("neglogl Validation");
dt_results << New Column("neglogl Test");
dt_results << New Column("N Training");
dt_results << New Column("N Validation");
dt_results << New Column("N Test");
dt_results << New Column("Tuning Param");
for(i = 1, i<= N Row(dt_pens), i++,
PEN = dt_pens:Penalty[i];
str = Eval Insert("\[report = (dt << Fit Model(
Y( :Y1 ),
X( :X1, :X2, :X3, :X4),
Validation( :Name( "Train/Valid/Test" ) ),
Lambda Penalty( ^PEN^ ),
Number of Grid Points( 1 ),
Personality( "Generalized Regression" ),
Generalized Distribution( "LogNormal" ),
Run(
Fit(
Estimation Method( Lasso( Adaptive ) ),
Validation Method( Validation Column )
)
),
Go,
invisible
)) << Report;]\");
//Fit the model
Eval(Parse(str));
//Get the fit stats and insert them into the results table
Train = report["Model Summary"][NumberColBox(1)] << Get;
Valid = report["Model Summary"][NumberColBox(2)] << Get;
Test = report["Model Summary"][NumberColBox(3)] << Get;
report << Close Window;
dt_results:RsqGEN Training[i] = Train[7];
dt_results:RsqGEN Validation[i] = Valid[7];
dt_results:RsqGEN Test[i] = Test[7];
dt_results:neglogl Training[i] = Train[3];
dt_results:neglogl Validation[i] = Valid[3];
dt_results:neglogl Test[i] = Test[3];
dt_results:N Training[i] = Train[1];
dt_results:N Validation[i] = Valid[1];
dt_results:N Test[i] = Test[1];
// dt_results:Tuning Param[i] = Train[8];
);
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneEccellente! Grazie Clay...
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneQualcosa come questo? I rigori sono nella prima riga e i pronostici nelle righe successive.
dt = Open( "$SAMPLE_DATA/Diabetes.jmp" );
fm = Fit Model(
Y( :Y ),
Effects( :BMI, :BP, :Total Cholesterol, :LDL, :HDL ),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Run( Fit( Estimation Method( Lasso ), Validation Method( AICc ) ) )
);
lambdas = fm << (Fit[1] << get penalty grid);
lambdas = lambdas`;
nGridPoints = ncol(lambdas);
// loop through each solution and save the predictions
for(i=0, i<NGRIDPOINTS></NGRIDPOINTS>
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneAh, capisco dove vuoi arrivare con questo. Ma ho bisogno del valore numerico del lambda nella tabella dei dati in modo da poterlo utilizzare in un grafico successivo. Sarebbe possibile creare una nuova tabella di output con i lambda nella prima riga e le previsioni nelle righe successive?
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneFunzionerebbe inserire il valore lambda nel nome della formula di previsione?
In tal caso, potresti fare qualcosa come di seguito. Lo script abbina i valori di penalità che otteniamo da <
dt = Open( "$SAMPLE_DATA/Diabetes.jmp" );
fm = Fit Model(
Y( :Y ),
Effects( :BMI, :BP, :Total Cholesterol, :LDL, :HDL ),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Run( Fit( Estimation Method( Lasso ), Validation Method( AICc ) ) )
);
lambdas = fm << (Fit[1] << get penalty grid);
// loop through each solution and save the predictions
for(i=0, i<150, i++, // the first solution is solution 0
fm << (Fit[1] << set solution ID(i));
fm << (Fit[1] << save prediction formula);
newc =column(dt, ncol(dt));
newc << set name( newc<<GET name=""></GET>
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneGrazie per la rapida risposta, Clay. Molto apprezzato.
Il problema che sto riscontrando ora è che non so come controllare il parametro della penalità per ogni iterazione. In uno script precedente, avevi questo:
penaltyVector <SPAN class="token operator">=</SPAN> fm <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN> <SPAN class="token punctuation">(</SPAN>fit<SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> get penalty grid</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
Inoltre non ricevo una nuova tabella JMP con i risultati.
Solo ai fini del doppio controllo, sarebbe possibile aggiungere come prima riga nella tabella di output il valore del parametro di penalità da quella particolare iterazione?
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneEHI,
Ecco un modo per farlo. Di seguito ho scritto un piccolo esempio utilizzando il set di dati sul diabete dalla cartella dei dati di esempio. La chiave è inviare il messaggio Set Solution ID all'adattamento. Dato che hai 150 punti nella griglia dei parametri, invierai 0,1,2,...,149 per impostare il vettore dei parametri per ogni soluzione nel percorso. Mi dispiace che la prima soluzione sia stata indicizzata a 0 anziché a 1, ma penso che per ora siamo bloccati con quella sintassi.
Fammi sapere se questo non ha senso o se non fa quello che ti serve.
Grazie,
Argilla
dt = Open( "$SAMPLE_DATA/Diabetes.jmp" );
fm = Fit Model(
Y( :Y ),
Effects( :BMI, :BP, :Total Cholesterol, :LDL, :HDL ),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Run( Fit( Estimation Method( Lasso ), Validation Method( AICc ) ) )
);
// loop through each solution and save the predictions
for(i=0, i<150, i++, // the first solution is solution 0
fm << (Fit[1] << set solution ID(i));
fm << (Fit[1] << save prediction formula);
// if you want to give the column a different name, send a message here.
);
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneMi dispiace rivisitarlo, Clay. È passato un po 'di tempo... Mi hai gentilmente fornito uno script che mi permette di variare il valore del parametro penalty/tuning per i modelli lazo e recuperare varie informazioni sul modello per ogni valore della penalità. Ora devo fare qualcosa di più: per ogni valore della penalità, salva il valore di previsione in una tabella, quindi concentra quelle colonne su tutti i valori della penalità. Non sono riuscito a farlo. Per questa particolare situazione, la penalità sarà variata 150 volte diverse e, quindi, saranno stimati 150 modelli lazo.
Qualsiasi aiuto sarebbe enormemente apprezzato.
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneNella documentazione si dice che non possiamo ottenere il parametro di sintonizzazione se usiamo K-fold CV.Sono in grado di ottenerlo con R glmnet e con il lazo di Matlab.Sto facendo il lazo con la regressione logistica.C'è un modo per recuperarlo poiché chiaramente JMP deve utilizzare un metodo per selezionare lambda.
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneNessun problema!
1 e 2: vedere l'esempio seguente per ottenere i valori AICc e BIC.
3. Le stime dei parametri nel percorso della soluzione sono le stime dei parametri ottenute dai predittori centrati e scalati. Puoi ottenerli usando il comando <
4. I valori Scaled -LogLikelihood sono solo le probabilità logaritmiche negative divise per la somma delle frequenze. Quindi, se hai 100 osservazioni nel tuo set di convalida, ad esempio, dovresti usare << Get Validation Negative LogLikelihood per ottenere un vettore delle probabilità e quindi dividere quel vettore per 100. Li ridimensiono solo in base alla dimensione del campione in modo da poter tracciare i set di addestramento e convalida sulla stessa scala.
5. L'asse orizzontale è la norma L1 delle stime dei parametri centrate e scalate (esclusa l'intercetta). Quindi vorresti chiamare <
Ecco un esempio che mette insieme la sintassi che stavi cercando.
dt = Open("$SAMPLE_DATA/Diabetes.jmp");
fm = Fit Model(
Y( :Y ),
Effects( :Age, :Gender, :BMI ),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Run( Fit( Estimation Method( Lasso ), Validation Method( AICc ) ) )
);
penaltyVector = fm << (fit[1] << get penalty grid);
bics = fm << (fit[1] << get BIC path);
aiccs = fm << (fit[1] << get aicc path);
solutionPath = fm << (fit[1] << get solution path);
solutionPath = solutionPath`; // transpose for convenience
summaryTable = as table( penaltyVector || aiccs || bics || solutionPath);
column(1) << set name("Lambda");
column(2) << set name("aicc");
column(3) << set name("bic");
column(4) << set name("Intercept");
column(5) << set name("Age parm");
column(6) << set name("Gender parm");
column(7) << set name("BMI parm");
column(8) << set name("sigma parm");
summaryTable << new column("L1 norm", Formula(abs(:Age Parm) + abs(:Gender Parm) + abs(:BMI parm)));
// run this to recreate the solution path
Graph Builder(
Show Control Panel( 0 ),
Variables(
X( :L1 norm ),
Y( :Age parm ),
Y( :Gender parm, Position( 1 ) ),
Y( :BMI parm, Position( 1 ) )
),
Elements( Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ) )
);
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneGrazie, Clay. Questo è molto utile.
Felice di sapere che non avevo perso la testa quando non riuscivo a trovare la sintassi per la griglia di rigore e altri. Potrei conoscere anche la sintassi di questi elementi?
Con ringraziamenti e apprezzamenti...
1. BIC
2. AICc
3. La misura "Parameter Estimates" -- l'asse verticale sull'asse più a sinistra dei due grafici nell'output Solution Path.
4. La misura "Scaled -Loglikehood": l'asse verticale sul grafico più a destra nell'output del percorso della soluzione.
5. La "Magnitude of Scaled Parameter Estimates" -- l'asse orizzontale su entrambi i grafici del percorso della soluzione.
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazione1. Saresti in grado di pubblicare parte del tuo script per aiutare a risolvere i problemi? In caso contrario, ho aggiunto alcuni commenti all'esempio seguente.
2. Di solito il posto migliore per trovare la sintassi per questo genere di cose è nell'indice di scripting degli oggetti (Aiuto > Indice di scripting). In questo caso, però, le funzioni non compaiono nell'indice perché sono state aggiunte principalmente per testare internamente la piattaforma. Li faremo emergere nella prossima versione, in modo che siano più facili da trovare.
Ho aggiornato il mio esempio precedente per utilizzare le verosimiglianze invece dei valori R^2.
// dt is a reference to the data table
dt = Open( "$SAMPLE_DATA/Diabetes.jmp" );
// fm is a reference to this instance of Fit Model
fm = dt << Fit Model(
Y( :Y ),
Effects(
:Age,
:Gender,
:BMI,
:BP
),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Validation( :Validation ),
Run(
Fit(
Estimation Method( Lasso( Adaptive ) ),
Validation Method( Validation Column )
)
)
);
// take the first model in the platform and store the penalty values in a vector
penaltyVector = fm << (fit[1] << get penalty grid);
// so on for training and validation likelihoods
trainingnll = fm <<(fit[1] << Get Training Negative LogLikelihood);
validationnll = fm << (fit[1] << Get Validation Negative LogLikelihood);
as table(penaltyVector || trainingnll || validationnll);
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneGrazie, Clay. Questo è stato molto utile. Alcune domande di follow-up, se posso...
1. Come posso recuperare i vettori contenenti i valori della griglia di penalità e i valori Rsq? Ho provato molte variazioni sulla sceneggiatura che hai fornito e ne sono uscito a mani vuote.
2. Come posso scoprire la sintassi per cose come "penalty grid" nel tuo script? Chiedo perché mi piacerebbe anche recuperare le similitudini neg log...
Molto apprezzato.
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneLa piattaforma attualmente non è configurata per consentirti di specificare tu stesso i valori di penalità. Invece JMP sta provando una griglia di valori di penalità e quindi presenta il valore di penalità che ti offre la soluzione migliore. Hai un certo controllo su come viene definita la griglia utilizzando il pannello Controlli avanzati nel lancio del modello.

Una volta che hai un adattamento, ci sono alcune funzioni JSL per ottenere la griglia dei valori di penalità e r-quadrati dalla piattaforma. Puoi fare qualcosa come l'esempio qui sotto
dt = Open( "$SAMPLE_DATA/Diabetes.jmp" );
fm = dt << Fit Model(
Y( :Y ),
Effects(
:Age,
:Gender,
:BMI,
:BP
),
Personality( "Generalized Regression" ),
Generalized Distribution( "Normal" ),
Validation( :Validation ),
Run(
Fit(
Estimation Method( Lasso( Adaptive ) ),
Validation Method( Validation Column )
)
)
);
penaltyVector = fm << (fit[1] << get penalty grid);
trainingR2 = fm <<(fit[1] << get training rsquare path);
validationR2 = fm << (fit[1] << get validation rsquare path);
//testR2 = fm << (fit[1] << get test rsquare path); // this example doesn't have a test set
Ri: Regressione generalizzata: recupera lo script dei parametri di ottimizzazioneLa seconda tabella di dati, Penalties1.jmp, è allegata.