Regresión generalizada: recuperación de secuencia de comandos de parámetros de ajusteUsando los métodos de reducción de la plataforma de regresión generalizada (lazo, red elástica, etc.) con distribución lognormal, necesito crear un diagrama de dispersión del parámetro de ajuste contra varias estadísticas de ajuste (verosimilitud logarítmica negativa, R2 generalizado). Esperaba hacerlo preestableciendo los valores del parámetro de ajuste y también preestableciendo el número de puntos de la cuadrícula en 1 (el número de puntos a lo largo de la cuadrícula que usa JMP para el parámetro de ajuste).
El siguiente script no reconoce los diferentes valores del parámetro de ajuste (^PEN^) e informa valores idénticos para cada iteración del ciclo de estimación del modelo. Mi mejor conjetura es que no reconoce los valores necesarios para estas dos líneas en el script:
Lambda Penalty( ^PEN^ ),
Number of Grid Points( 1 ),
¡Cualquier sabiduría sería muy apreciada!
//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];
);
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajuste¡Excelente! Gracias Clay...
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajuste¿Algo como esto? Los penales están en la primera fila y los pronósticos en las filas siguientes.
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>
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajusteAh, ya veo a dónde vas con esto. Pero necesito el valor numérico de la lambda en la tabla de datos para poder usarlo en un gráfico posterior. ¿Sería posible crear una nueva tabla de salida con las lambdas en la primera fila y las predicciones en las filas siguientes?
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajuste¿Funcionaría poner el valor lambda en el nombre de la fórmula de predicción?
Si es así, podrías hacer algo como lo siguiente. El script hace coincidir los valores de penalización que obtenemos de <
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>
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajusteGracias por la rápida respuesta, Clay. Muy apreciado.
El problema que tengo ahora es que no sé cómo controlar el parámetro de penalización para cada iteración. En un script anterior, tenías esto:
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>
Tampoco obtengo una nueva tabla JMP con los resultados.
Solo con el propósito de verificar dos veces, ¿sería posible agregar como primera fila en la tabla de salida el valor del parámetro de penalización de esa iteración en particular?
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajusteEy,
Aquí hay una forma en que podrías hacerlo. He escrito un pequeño ejemplo a continuación usando el conjunto de datos de diabetes de la carpeta de datos de muestra. La clave es enviar el mensaje Establecer ID de solución al ajuste. Dado que tiene 150 puntos en su cuadrícula de parámetros, le enviaría 0,1,2,...,149 para establecer el vector de parámetros para cada solución en la ruta. Lamento haber indexado la primera solución a 0 en lugar de 1, pero creo que por ahora nos quedamos con esa sintaxis.
Avíseme si esto no tiene sentido o si no hace lo que necesita que haga.
Gracias,
Arcilla
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.
);
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajusteLamento volver a visitar esto, Clay. Ha sido un tiempo... Amablemente me proporcionó un script que me permite variar el valor del parámetro de penalización/ajuste para los modelos de lazo y recuperar información diversa sobre el modelo para cada valor de la penalización. Ahora necesito hacer algo más: para cada valor de la penalización, guarde el valor de predicción en una tabla, luego concentre esas columnas en todos los valores de la penalización. No he tenido éxito en hacerlo. Para esta situación particular, la penalización variará 150 veces diferentes y, por lo tanto, se estimarán 150 modelos de lazo.
Cualquier ayuda sería enormemente apreciada.
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajusteEn la documentación dice que no podemos obtener el parámetro de ajuste si usamos K-fold CV.Puedo obtener eso con R glmnet y con el lazo de Matlab.Estoy haciendo lazo con regresión logística.¿Hay alguna forma de recuperarlo, ya que claramente JMP debe usar algún método para seleccionar lambda?
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajuste¡Ningún problema!
1 y 2: consulte el siguiente ejemplo para obtener los valores AICc y BIC.
3. Las estimaciones de parámetros en la ruta de la solución son las estimaciones de parámetros que obtiene de los predictores centrados y escalados. Puede obtenerlos usando el comando <
4. Los valores Scaled -LogLikelihood son solo las logverosimilitudes negativas divididas por la suma de las frecuencias. Entonces, si tiene 100 observaciones en su conjunto de validación, por ejemplo, usaría << Get Validation Negative LogLikelihood para obtener un vector de probabilidades y luego dividir ese vector por 100. Simplemente los escalo por el tamaño de la muestra para que podamos trazar los conjuntos de entrenamiento y validación en la misma escala.
5. El eje horizontal es la norma L1 de las estimaciones de parámetros centradas y escaladas (excluyendo la intersección). Por lo tanto, querrá llamar a <
Aquí hay un ejemplo que reúne la sintaxis que estaba buscando.
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 ) ) )
);
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajusteGracias, arcilla. Esto es muy útil.
Me alegra saber que no me había vuelto loco cuando no pude encontrar la sintaxis para la cuadrícula de penalización y otros. ¿Puedo conocer también la sintaxis de estos elementos?
Con agradecimiento y reconocimiento...
1. BIC
2. AICc
3. La medida "Estimaciones de parámetros": el eje vertical en el eje más a la izquierda de los dos gráficos en la salida de Solution Path.
4. La medida "Scaled -Loglikehood": el eje vertical en el gráfico más a la derecha en la salida de Solution Path.
5. La "Magnitud de las estimaciones de parámetros escaladas": el eje horizontal en ambos gráficos de ruta de solución.
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajuste1. ¿Podría publicar parte de su secuencia de comandos para ayudar a solucionar problemas? Si no, agregué algunos comentarios al ejemplo a continuación.
2. Por lo general, el mejor lugar para encontrar la sintaxis para este tipo de cosas es en el Índice de secuencias de comandos de objetos (Ayuda> Índice de secuencias de comandos). Sin embargo, en este caso, las funciones no aparecen en el índice porque se agregaron principalmente para probar la plataforma internamente. Sin embargo, los mostraremos en la próxima versión para que sean más fáciles de encontrar.
Actualicé mi ejemplo anterior para usar las probabilidades en lugar de los valores 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);
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajusteGracias, arcilla. Esto fue muy útil. Algunas preguntas de seguimiento, si se me permite...
1. ¿Cómo recupero los vectores que contienen los valores de cuadrícula de penalización y los valores Rsq? Probé muchas variaciones del guión que me proporcionó y me quedé con las manos vacías.
2. ¿Cómo puedo descubrir la sintaxis de elementos como "cuadrícula de penalizaciones" en su guión? Pregunto porque también me gustaría recuperar neg log-likehoods...
Muy apreciado.
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajusteActualmente, la plataforma no está configurada para permitirle especificar los valores de penalización usted mismo. En cambio, JMP está probando una cuadrícula de valores de penalización y luego presenta el valor de penalización que le brinda el mejor ajuste. Tiene cierto control sobre cómo se define la cuadrícula utilizando el panel Controles avanzados en el lanzamiento del modelo.

Una vez que tenga un ajuste, hay algunas funciones JSL para obtener la cuadrícula de valores de penalización y cuadrados r de la plataforma. Puedes hacer algo como el siguiente ejemplo
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
Re: Regresión generalizada: recuperar secuencia de comandos de parámetros de ajusteSe adjunta la segunda tabla de datos, Penalties1.jmp.