Automatización de scripts: recuperación de predictores y establecimiento del nivel sigmaHola,
Me asignaron un proyecto para crear un flujo de modelado. Todos los predictores y respuestas son numéricos continuos, y las respuestas se ajustan por separado. Tras una preparación inicial de los datos...
- Validación K-fold paso a paso <-- Automatizada
- Ejecución del modelo del paso 1 en SLS <-- Automatizado
- Perfilador de predicción SLS:
- Inicializar simulador <-- Automatizado
- Cambiar todos los tipos de factores a aleatorios <-- No automatizado
- Cambiar todas las desviaciones estándar a un valor de 3 sigma para cada columna <-- No automatizado
Este flujo usará un bucle for. Durante cada iteración, realizará una serie de análisis sobre una única variable de respuesta. El script para la versión 3.2 es fácil de obtener, pero cambiar el valor de la desviación estándar (DE) al valor de 3 sigma no lo es. ¿Cómo debería funcionar la automatización para modificar el valor de la DE en la versión 3.2 al usar un bucle for? ¿Hay alguna mejor manera? He revisado en Preferencias > Plataformas > Ajustar modelo > Mínimos cuadrados y no veo ninguna opción para cambiar el valor de la DE de 1 DE a 3 DE.
Recientemente actualizado a JMP 17, si eso ayuda en algo.
Exploración y visualización de datosRe: Automatización de secuencias de comandos: recuperación de predictores y configuración del nivel sigma¿Algo como esto?
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Tiretread.jmp");
obj = Profiler(
Y(
:Pred Formula ABRASION, :Pred Formula MODULUS, :Pred Formula ELONG,
:Pred Formula HARDNESS
)
);
val = 3;
obj << Simulator(
1,
Factors(
SILICA << Random(Normal(1.25, 0.3266)), SILANE << Random(Normal weighted(50, 6.532)),
SULFUR << Fixed(2.25)
),
Responses(
Pred Formula ABRASION << Add Random Noise(1), Pred Formula MODULUS << Add Random Noise(2),
Pred Formula ELONG << Add Random Noise(val), Pred Formula HARDNESS << Add Random Noise(val*2)
)
);
Modificado del ejemplo en Scripting Index

Re: Automatización de secuencias de comandos: recuperación de predictores y configuración del nivel sigmaHola @jthi ,
No exactamente. A continuación se muestra un fragmento de código de lo que tengo, explicaré más en un momento.
// Iterating through responses - JMP 17
mymodel_sw = Fit Model( Y( response[i] ),
Effects( Factorial to degree( eval( predict ) ), Response Surface( eval( predict ) ) ),
Personality("Stepwise"),
Run( "K-Fold Crossvalidation"n(5) )
);
// Runs modeling
mymodel_sw << Go;
// Finishes predictor selection before proceeding
mymodel_sw << Finish;
// Makes model
mymodel_sls = mymodel_sw << Make Model;
// Runs SLS model
mymodel_sls << Run;
// Finishes modeling before proceeding
mymodel_sls << Finish;
// Gets list of predictors
param_SLS = mymodel_sls << Get Parameter Names;Una vez que << Obtener nombres de parámetros, errores de param_SLS con referencia de objeto eliminado.Sin embargo, necesito esta lista de parámetros para desarrollar los argumentos en << Simular en tabla, lo que haré creando una función personalizada que se encargue de eso.
Este fragmento de código está dentro de un ciclo for que itera a través de una lista de respuestas, una a la vez.¿Esto tiene sentido?
Re: Automatización de secuencias de comandos: recuperación de predictores y configuración del nivel sigma¿O hay alguna manera de recuperar los nombres de los parámetros de la herramienta de generación de perfiles, por lo que no obtengo todos los términos de interacción y tengo que ordenar todo eso? Me gustaría una lista única de nombres de parámetros con los que puedo trabajar. Debo asumir que la cantidad de parámetros que se ajustarán diferirá según el modelo.
Re: Automatización de secuencias de comandos: recuperación de predictores y configuración del nivel sigmaAquí hay una secuencia de comandos de muestra mucho más detallada.¡Tenga en cuenta que esto NO funciona!
Names default to here(1);
dt = open( "$SAMPLE_DATA/Body Fat.jmp" );
/////////////////////////// Custom function - Help!
mysim = function( {list, iteration, stddev, step},
// New list placeholder
unique_factors = {};
// Adds only unique factors to new list, uses "*" as identifier
for( i = 1, i <= N items( list ), i++,
if( list[i] << !contains( "*" ) , insert into( unique_factors, list[i] )
)
);
num_sim_factors = N Items( unique_factors );
// Modifies each factor in the simulator to normal distribution with 3 standard deviations
simfactor = {};
for( i = 1, i <= num_sim_factors, i++,
temp_1 = char( unique_factors[i] ) || " << Random( Normal( " || char( col mean( unique_factors[i] ) ) ||
", " || char( stddev * col std dev( unique_factors[i] ) ) || ") ),"
insert into( sim_factor, temp_1 )
);
// Inputs simfactor into simulator
mymodel_sls << Simulator( 1, eval( simfactor ) );
// Creates the arguments for Simulate to table
simtable_pt1 = "N Runs( " || char( iteration ) || "),"
simtable_pt2 = {};
// Creates an argument for each factor
for( i = 1, i <= num_sim_factors, i++,
temp_2 = char( unique_factor[i] ) || " << Sequence Location( " || char ( Col Minimum( unique_factor[i] ) ) || ", "
chart ( Col Maximum( unique_factor[i] ) ) || ", " || char( step ) || " ),";
insert into( simtable_pt2, temp_2 )
);
// Combines strings into a single argument for use for Simulate to Table
simarg = simtable_pt1 || simtable_pt2;
// Simuates data to table for further analysis
mymodel_sls << Get simulator;
mymodel_sls << Simulate to table( simarg );
);
/////////////////////////// Cols to use - user adjustable
predict = {:"Neck circumference (cm)"n, :"Chest circumference (cm)"n,
:"Abdomen circumference (cm)"n, :"Hip circumference (cm)"n,
:"Thigh circumference (cm)"n, :"Knee circumference (cm)"n,
:"Ankle circumference (cm)"n, :"Biceps (extended) circumference (cm)"n,
:"Forearm circumference (cm)"n, :"Wrist circumference (cm)"n};
response = {:"Age (years)"n, :"Weight (lbs)"n, :"Height (inches)"n};
/////////////////////////// User input
num_response = N Items( response );
num_predict = N Items( predict );
// How many simulations to run?
sim_no = 1000;
// How many standard deviations for each predictor in the simulation?
stddev = 3;
// Steps in simulation
steps = 4;
/////////////////////////// Changing col attribute
// In a later step, Simulate, the mean should be 0 due to this
for( i = 1, i <= num_response, i++,
response[i] << Set Property( "Coding", { col minimum( response[i] ), col maximum( response[i] ) } );
);
/////////////////////////// Modeling
/* Fit Model - Stepwise, w/ K-fold validation --> SLS --> Simulate */
for( i = 1, i <= num_response, i++,
// Names models for calling later
mymodel_sw = "FM_SW_" || char( i );
// Iterating through responses - JMP 17
mymodel_sw = Fit Model( Y( response[i] ),
Effects( Factorial to degree( eval( predict ) ), Response Surface( eval( predict ) ) ),
Personality("Stepwise"),
Run( "K-Fold Crossvalidation"n(5) )
);
// Runs modeling
mymodel_sw << Go;
// Finishes predictor selection before proceeding
mymodel_sw << Finish;
// Makes model
mymodel_sls = mymodel_sw << Make Model;
// Runs SLS model
mymodel_sls << Run;
// Finishes modeling before proceeding
mymodel_sls << Finish;
////////////////// NOT WORKING BELOW
// Gets list of predictors <--- This is first step
param_sls1 = mymodel_sls << Get Effect Names;
param_sls2 = mymodel_sls << Get Parameter Names;
show(param_sls1, param_sls2);
// Calls on custom function <--- This is second step
mysim( param_sls1, sim_no, stddev, steps );
// Names Simulate to table dataset by response variable in for loop
Current data table() << Set name( char( response[i] ) || "_report" );
);¡Ayuda! ¡Hay varias partes de esto que no funcionan!Esto es lo que está funcionando: comente la función personalizada y cualquier cosa a continuación (cerca de la parte inferior del script) donde se indica NO FUNCIONA A CONTINUACIÓN. Puedo pasar por la generación del modelado SLS, pero una vez que se trata de modificar los parámetros de simulación y ejecutar la simulación, ambos personalizados (ver función personalizada), me quedo sin ideas.
Re: Automatización de secuencias de comandos: recuperación de predictores y configuración del nivel sigmaHay muchos errores tipográficos en esa función que pueden causar problemas. Acabo de arreglar algunas cosas, no tengo idea si hace lo que se supone que debe hacer
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Body Fat.jmp");
mysim = function({input_list, iteration, stddev, step},
unique_factors = Filter Each({item}, input_list, !Contains(item, "*"));
num_sim_factors = N Items(unique_factors);
simfactor = {};
simfactor = Transform Each({uniq_factor}, unique_factors,
Eval Insert("^uniq_factor^ << Random(Normal(^col mean(column(dt, uniq_factor))^, ^stddev * col std dev(column(dt, uniq_factor))^");
);
// Inputs simfactor into simulator
mymodel_sls << Simulator( 1, eval(simfactor));
// Creates the arguments for Simulate to table
simtable_pt1 = "N Runs( " || char(iteration) || "),";
simtable_pt2 = {};
// Creates an argument for each factor
simtable_pt2 = Transform Each({uniq_factor}, unique_factors,
Eval Insert("^uniq_factor^ << Sequence Location(^Col Minimum(column(dt, uniq_factor))^, ^Col Maximum(column(dt, uniq_factor))^, ^step^)");
);
// Combines strings into a single argument for use for Simulate to Table
simarg = simtable_pt1 || Concat Items(simtable_pt2, ",");
// Simuates data to table for further analysis
mymodel_sls << Get simulator;
mymodel_sls << Simulate to table(simarg);
);
predict = {:"Neck circumference (cm)"n, :"Chest circumference (cm)"n,
:"Abdomen circumference (cm)"n, :"Hip circumference (cm)"n,
:"Thigh circumference (cm)"n, :"Knee circumference (cm)"n,
:"Ankle circumference (cm)"n, :"Biceps (extended) circumference (cm)"n,
:"Forearm circumference (cm)"n, :"Wrist circumference (cm)"n};
response = {:"Age (years)"n, :"Weight (lbs)"n, :"Height (inches)"n};
num_response = N Items(response);
num_predict = N Items(predict);
sim_no = 1000;
stddev = 3;
steps = 4;
For(i = 1, i <= num_response, i++,
response[i] << Set Property("Coding", {Col Minimum(response[i]), Col Maximum(response[i])})
);
For(i = 1, i <= num_response, i++,
mymodel_sw = "FM_SW_" || Char(i);
mymodel_sw = Fit Model(
Y(response[i]),
Effects(Factorial to degree(Eval(predict)), Response Surface(Eval(predict))),
Personality("Stepwise"),
Run("K-Fold Crossvalidation"n(5))
);
mymodel_sw << Go;
mymodel_sw << Finish;
mymodel_sls = mymodel_sw << Make Model;
mymodel_sls = mymodel_sls << Run;
mymodel_sls << Finish;
param_sls1 = mymodel_sls << Get Effect Names;
param_sls2 = mymodel_sls << Get Parameter Names;
Show(param_sls1, param_sls2);
mysim(param_sls1, sim_no, stddev, steps);
dt << Set name(Char(response[i]) || "_report");
);Re: Automatización de secuencias de comandos: recuperación de predictores y configuración del nivel sigma@jthi - Voy a tener que indagar un poco en tu recomendación.He visto Filter Each, Transform Each y Eval Insert, pero no tengo experiencia con ellos y aún no sé cómo funcionan.
Otra pregunta para ti.En Eval Insert, tienes marcas de zanahoria ^ que nunca antes había visto.¿Hay alguna documentación en la que pueda aprender más sobre su funcionalidad?Creo que está bastante claro por cómo lo estás usando, pero estoy intrigado y quiero asegurarme de que estoy interpretando tu uso correctamente.
simfactor = Transform Each({uniq_factor}, unique_factors,
Eval Insert("^uniq_factor^ << Random(Normal(^col mean(column(dt, uniq_factor))^, ^stddev * col std dev(column(dt, uniq_factor))^");
);Re: Automatización de secuencias de comandos: recuperación de predictores y configuración del nivel sigma@jthi ,
¡Estabas en el camino correcto! Fueron necesarias otras manipulaciones de expresión para crear los argumentos para insertar en sus respectivas funciones.En la función personalizada mysim, se han explicado en detalle los argumentos que se insertan para modificar la distribución de la simulación y generar el argumento para insertar en Simular en tabla.Esta es una oportunidad de aprendizaje muy emocionante y me abrió los ojos a este tipo de expresiones avanzadas.
Si alguien quiere saber más sobre la manipulación de expresiones, aquí hay un enlace a la documentación: https://www.jmp.com/support/help/en/17.0/#page/jmp/expresiones-avanzadas-macros-y-listas.shtml#
¡Gracias a los que ayudaron!
Names default to here(1);
dt = open( "$SAMPLE_DATA/Body Fat.jmp" );
mysim = function( {list, iteration, stddev, step},
// filter list of effects down to main effects. These are the effects whose name matches a column name
// take advantage of the speed of associative arrays to get the intersection set.
list << Intersect(Associative Array(dt<<GET column="" names=""> SLS --> Simulate */
for( k = 1, k <= num_response, k++,
// Names models for calling later
mymodel_sw = "FM_SW_" || char( k );
// Iterating through responses - JMP 17
mymodel_sw = Fit Model( Y( response[k] ),
Effects( Factorial to degree( eval( predict ) ), Response Surface( eval( predict ) ) ),
Personality("Stepwise"),
Run( "K-Fold Crossvalidation"n(5) )
);
// Runs modeling
mymodel_sw << Go;
// Finishes predictor selection before proceeding
mymodel_sw << Finish;
// Makes model
mymodel_sls = mymodel_sw << Make Model;
// Runs SLS model
mymodel_sls = mymodel_sls << Run; // this creates another object. assign your variable to that object
mymodel_sls << Profiler(1); // make sure profiler is on.
// Gets associative array of effect names.
// use this in the function to easily filter down to the main effect names
param_sls1 = Associative Array(mymodel_sls << Get Effect Names);
// Calls on custom function <--- This is second step
resultDT = mysim( param_sls1, sim_no, stddev, steps ); // assign variable to reference returned table
// Names Simulate to table dataset by response variable in for loop
resultDT << Set name( char( response[k] ) || "_report" );
);</GET>
ss