Generalisierte Regression – Tuning-Parameter-Skript abrufenUnter Verwendung der Schrumpfungsmethoden der Generalized Regression-Plattform (Lasso, elastisches Netz usw.) mit logarithmischer Normalverteilung muss ich ein Streudiagramm des Abstimmungsparameters im Vergleich zu verschiedenen Anpassungsstatistiken (negative logarithmische Wahrscheinlichkeit, generalisiertes R2) erstellen. Ich hoffte, dies zu erreichen, indem ich die Werte des Tuning-Parameters voreinstellte und auch die Anzahl der Gitterpunkte auf 1 voreinstellte (die Anzahl der Punkte entlang des Gitters, die JMP für den Tuning-Parameter verwendet).
Das folgende Skript erkennt die unterschiedlichen Werte des Optimierungsparameters (^PEN^) nicht und meldet identische Werte für jede Iteration der Modellschätzungsschleife. Ich gehe davon aus, dass die erforderlichen Werte für diese beiden Zeilen im Skript nicht erkannt werden:
Lambda Penalty( ^PEN^ ),
Number of Grid Points( 1 ),
Jede Weisheit wäre sehr dankbar!
//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];
);
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenExzellent! Danke, Clay...
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenEtwas wie das? Die Strafen befinden sich in der ersten Reihe und die Vorhersagen in den folgenden Reihen.
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>
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenAh, ich verstehe, wohin du damit willst. Ich benötige aber den numerischen Wert des Lambda in der Datentabelle, damit ich ihn in einem nachfolgenden Diagramm verwenden kann. Wäre es möglich, eine neue Ausgabetabelle mit den Lambdas in der ersten Zeile und Vorhersagen in den nachfolgenden Zeilen zu erstellen?
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenWürde es funktionieren, den Lambda-Wert in den Namen der Vorhersageformel aufzunehmen?
Wenn ja, könnten Sie etwas wie unten tun. Das Skript gleicht die Strafwerte, die wir aus dem <
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>
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenDanke für die schnelle Antwort, Clay. Sehr geschätzt.
Das Problem, das ich jetzt habe, ist, dass ich nicht weiß, wie ich die Strafparameter für jede Iteration steuern soll. In einem früheren Skript hatten Sie Folgendes:
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>
Ich erhalte auch keine neue JMP-Tabelle mit den Ergebnissen.
Wäre es nur zum Zwecke der Doppelprüfung möglich, als erste Zeile in der Ausgabetabelle den Wert des Strafparameters aus dieser bestimmten Iteraktion hinzuzufügen?
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenHey,
Hier ist eine Möglichkeit, wie Sie das tun können. Ich habe unten ein kleines Beispiel geschrieben, das den Diabetes-Datensatz aus dem Beispieldatenordner verwendet. Der Schlüssel besteht darin, die Nachricht „Lösungs-ID festlegen“ an den Fit zu senden. Da Ihr Parameterraster 150 Punkte enthält, senden Sie ihm 0,1,2,...,149, um den Parametervektor für jede Lösung im Pfad festzulegen. Ich bedaure, dass die erste Lösung auf 0 statt auf 1 indiziert wurde, aber ich denke, wir bleiben vorerst bei dieser Syntax.
Lassen Sie mich wissen, wenn dies keinen Sinn ergibt oder nicht das tut, was Sie brauchen.
Danke,
Ton
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.
);
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenTut mir leid, das noch einmal zu lesen, Clay. Es ist eine Weile her... Sie haben mir freundlicherweise ein Skript zur Verfügung gestellt, mit dem ich den Wert des Penalty-/Tuning-Parameters für Lasso-Modelle variieren und für jeden Penalty-Wert verschiedene Informationen über das Modell abrufen kann. Jetzt muss ich noch etwas tun: Für jeden Strafwert den Vorhersagewert in einer Tabelle speichern und diese Spalten dann über alle Strafwerte hinweg zusammenfassen. Dies ist mir nicht gelungen. Für diese spezielle Situation wird die Strafe 150 Mal variiert und somit 150 Lasso-Modelle geschätzt.
Jede Hilfe wäre sehr dankbar.
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenIn der Dokumentation heißt es, dass wir die Tuning-Parameter nicht erhalten können, wenn wir K-fold CV verwenden.Ich kann das mit R glmnet und mit Matlabs Lasso hinbekommen.Ich mache Lasso mit logistischer Regression.Gibt es eine Möglichkeit, es abzurufen, da JMP eindeutig eine Methode zur Auswahl von Lambda verwenden muss?
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenKein Problem!
1 und 2 – siehe Beispiel unten zum Abrufen der AICc- und BIC-Werte.
3. Die Parameterschätzungen im Lösungspfad sind die Parameterschätzungen, die Sie von den zentrierten und skalierten Prädiktoren erhalten. Sie können sie mit dem Befehl <
4. Die Scaled-LogLikelihood-Werte sind lediglich die negativen Log-Likelihoods dividiert durch die Summe der Häufigkeiten. Wenn Ihr Validierungssatz beispielsweise 100 Beobachtungen enthält, würden Sie << Get Validation Negative LogLikelihood verwenden, um einen Vektor der Wahrscheinlichkeiten zu erhalten, und diesen Vektor dann durch 100 dividieren. Ich skaliere sie einfach anhand der Stichprobengröße, damit wir die Trainings- und Validierungssätze im gleichen Maßstab darstellen können.
5. Die horizontale Achse ist die L1-Norm der zentrierten und skalierten Parameterschätzungen (ohne den Achsenabschnitt). Sie möchten also <
Hier ist ein Beispiel, das die von Ihnen gesuchte Syntax zusammenstellt.
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 ) ) )
);
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenDanke, Clay. Das ist sehr hilfreich.
Ich bin froh zu wissen, dass ich nicht den Verstand verloren habe, als ich die Syntax für das Strafraster und andere nicht finden konnte. Könnte ich auch die Syntax für diese Elemente kennen?
Mit Dank und Anerkennung...
1. BIC
2. AICc
3. Das Maß „Parameterschätzungen“ – die vertikale Achse auf der äußersten linken Achse der beiden Diagramme in der Lösungspfad-Ausgabe.
4. Das Maß „Skalierte Loglikehood“ – die vertikale Achse im Diagramm ganz rechts in der Lösungspfad-Ausgabe.
5. Die „Größe der skalierten Parameterschätzungen“ – die horizontale Achse in beiden Lösungspfaddiagrammen.
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufen1. Könnten Sie einen Teil Ihres Skripts veröffentlichen, um bei der Fehlerbehebung zu helfen? Falls nicht, habe ich einige Kommentare zum Beispiel unten hinzugefügt.
2. Normalerweise finden Sie die Syntax für solche Dinge am besten im Object Scripting Index (Hilfe > Scripting Index). In diesem Fall erscheinen die Funktionen jedoch nicht im Index, da sie hauptsächlich zum internen Testen der Plattform hinzugefügt wurden. Wir werden sie jedoch in der nächsten Version an die Oberfläche bringen, damit sie leichter zu finden sind.
Ich habe mein früheres Beispiel aktualisiert, um die Wahrscheinlichkeiten anstelle der R^2-Werte zu verwenden.
// 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);
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenDanke, Clay. Das war sehr hilfreich. Einige weitere Fragen, wenn ich könnte ...
1. Wie rufe ich die Vektoren ab, die die Strafgitterwerte und Rsq-Werte enthalten? Ich habe viele Variationen des von Ihnen bereitgestellten Skripts ausprobiert und bin leer ausgegangen.
2. Wie kann ich die Syntax für Dinge wie „Strafraster“ in Ihrem Skript herausfinden? Ich frage, weil ich auch negative Log-Likeligkeiten abrufen möchte ...
Sehr geschätzt.
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenDie Plattform ist derzeit nicht dafür eingerichtet, dass Sie Strafwerte selbst festlegen können. Stattdessen versucht JMP ein Raster von Strafwerten und präsentiert dann den Strafwert, der Ihnen am besten passt. Sie haben eine gewisse Kontrolle darüber, wie das Raster definiert wird, indem Sie das Bedienfeld „Erweiterte Steuerelemente“ beim Modellstart verwenden.

Sobald Sie eine Anpassung gefunden haben, gibt es einige JSL-Funktionen, um das Raster der Strafwerte und R-Quadrate von der Plattform abzurufen. Sie können so etwas wie das folgende Beispiel tun
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
Betreff: Generalisierte Regression – Tuning-Parameter-Skript abrufenDie zweite Datentabelle, Penalties1.jmp, ist beigefügt.