Automazione degli script: recupero dei predittori e impostazione del livello sigmaCiao,
Mi è stato assegnato il progetto di scrivere uno script per un flusso di modellazione. Tutti i predittori e le risposte sono numericamente continui e le risposte vengono adattate separatamente. Dopo una preparazione iniziale dei dati...
- Validazione K-fold graduale <-- Automatizzata
- Esecuzione del modello del passaggio 1 in SLS <-- Automatizzato
- Profiler di previsione SLS:
- Inizializza simulatore <-- Automatizzato
- Cambia tutti i tipi di fattore in casuali <-- Non automatizzato
- Cambia tutti gli SD in un valore 3 sigma per ogni colonna <-- Non automatizzato
Questo flusso utilizzerà un ciclo for. Durante ogni iterazione eseguirà una serie di analisi su una singola variabile di risposta. Lo script per la versione 3.2 è facile da ottenere, ma la modifica del valore SD al valore 3 sigma non lo è. Come dovrebbe funzionare l'automazione della modifica del valore SD per la versione 3.2 durante l'utilizzo di un ciclo for? Esiste un modo migliore? Ho cercato in Preferenze > Piattaforme > Modello di adattamento > Minimi quadrati e non vedo un'opzione per modificare il valore SD da 1 SD a 3 SD.
Aggiornato di recente a JMP 17, se può essere utile.
Esplorazione e visualizzazione dei datiRi: Automazione degli script: recupero di predittori e impostazione del livello sigmaQualcosa come questo?
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)
)
);
Modificato dall'esempio in Scripting Index

Ri: Automazione degli script: recupero di predittori e impostazione del livello sigmaCiao @jthi ,
Non proprio. Di seguito è riportato un frammento di codice di ciò che ho, spiegherò di più tra poco.
// 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 volta che << Ottengo i nomi dei parametri, errori param_SLS con riferimento all'oggetto eliminato.Tuttavia, ho bisogno di questo elenco di parametri per costruire gli argomenti in << Simulate to table, cosa che farò creando una funzione personalizzata che se ne occupi.
Questo frammento di codice si trova all'interno di un ciclo for che ripete un elenco di risposte, una alla volta.Ha senso ciò?
Ri: Automazione degli script: recupero di predittori e impostazione del livello sigmaO c'è un modo per recuperare i nomi dei parametri dallo strumento profiler, quindi non ottengo tutti i termini di interazione e devo ordinare tutto ciò? Vorrei un elenco univoco di nomi di parametri con cui posso lavorare. Il numero di parametri che saranno adatti devo presumere che differirà per modello.
Ri: Automazione degli script: recupero di predittori e impostazione del livello sigmaEcco uno script di esempio molto più approfondito.Nota che questo NON funziona!
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" );
);Aiuto! Ci sono più parti di questo che non funzionano!Ecco cosa funziona: commenta la funzione personalizzata e qualsiasi cosa sotto (vicino alla parte inferiore dello script) dove è indicato NON FUNZIONANTE SOTTO. Posso superare la generazione della modellazione SLS, ma una volta che si tratta di modificare i parametri di simulazione ed eseguire la simulazione, entrambi personalizzati (vedi funzione personalizzata), sono a corto di idee.
Ri: Automazione degli script: recupero di predittori e impostazione del livello sigmaCi sono molti errori di battitura su quella funzione che possono causare problemi. Ho appena sistemato alcune cose, non ho idea se fa quello che dovrebbe fare
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");
);Ri: Automazione degli script: recupero di predittori e impostazione del livello sigma@jthi - Dovrò scavare un po' nella tua raccomandazione.Ho visto Filter Each, Transform Each e Eval Insert, ma non ho esperienza con loro e non so ancora come funzionano.
Un'altra domanda per te.In Eval Insert, hai segni di carota ^ che non ho mai visto prima.C'è della documentazione che posso saperne di più sulla loro funzionalità?Penso che sia abbastanza chiaro da come lo stai usando, ma sono incuriosito e voglio assicurarmi di interpretare correttamente il tuo utilizzo.
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))^");
);Ri: Automazione degli script: recupero di predittori e impostazione del livello sigma@jthi ,
Eri sulla strada giusta! Altre manipolazioni di espressioni sono state necessarie per creare gli argomenti da inserire nelle rispettive funzioni.Nella funzione personalizzata mysim, gli argomenti inseriti nella modifica della distribuzione per la simulazione e la generazione dell'argomento da inserire in Simulate to Table sono stati spiegati in dettaglio.Questa è un'opportunità di apprendimento molto eccitante e mi ha aperto gli occhi su questi tipi di espressioni avanzate.
Se qualcuno vuole saperne di più sulla manipolazione delle espressioni, ecco un link alla documentazione: https://www.jmp.com/support/help/en/17.0/#page/jmp/advanced-expressions-macros-and-lists.shtml#
Grazie a coloro che hanno aiutato!
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