Skriptautomatisierung: Abrufen von Prädiktoren und Festlegen des Sigma-LevelsHallo,
Ich erhielt die Aufgabe, einen Modellierungsablauf zu skripten. Alle Prädiktoren und Antworten sind numerisch kontinuierlich und die Antworten werden separat angepasst. Nach einer ersten Datenvorbereitung...
- Schrittweise K-fache Validierung <-- Automatisiert
- Modelllauf von Schritt 1 in SLS <-- Automatisiert
- SLS-Vorhersageprofiler:
- Simulator initialisieren <-- Automatisiert
- Ändern Sie alle Faktortypen auf zufällig <-- Nicht automatisiert
- Ändern Sie alle SDs in 3-Sigma-Werte für jede Spalte <-- Nicht automatisiert
Dieser Ablauf verwendet eine For-Schleife. Während jeder Iteration wird eine Reihe von Analysen für eine einzelne Antwortvariable durchgeführt. Das Skript für 3.2 ist leicht zu bekommen, die Änderung des SD-Werts auf den 3-Sigma-Wert jedoch nicht. Wie soll die Automatisierung der SD-Wert-Änderung für 3.2 bei Verwendung einer For-Schleife funktionieren? Gibt es eine bessere Möglichkeit? Ich habe unter Einstellungen > Plattformen > Modell anpassen > Methode der kleinsten Quadrate nachgesehen und finde keine Option, den SD-Wert von 1 SD auf 3 SD zu ändern.
Neu auf JMP 17 aktualisiert, falls das hilft.
Datenexploration und -visualisierungBetreff: Skriptautomatisierung: Abrufen von Prädiktoren und Festlegen des Sigma-LevelsEtwas wie das?
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)
)
);
Geändert vom Beispiel im Scripting Index

Betreff: Skriptautomatisierung: Abrufen von Prädiktoren und Festlegen des Sigma-LevelsHallo @jthi ,
Nicht ganz. Unten ist ein Code-Snippet von dem, was ich habe, ich werde in Kürze mehr erklären.
// 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;Sobald ich << Get Parameter Names, param_SLS-Fehler mit gelöschter Objektreferenz.Allerdings benötige ich diese Liste von Parametern, um die Argumente in << In Tabelle simulieren aufzubauen, was ich tun werde, indem ich eine benutzerdefinierte Funktion erstelle, die sich darum kümmert.
Dieses Code-Snippet befindet sich in einer for-Schleife, die eine Liste von Antworten nacheinander durchläuft.Macht das Sinn?
Betreff: Skriptautomatisierung: Abrufen von Prädiktoren und Festlegen des Sigma-LevelsOder gibt es eine Möglichkeit, die Parameternamen aus dem Profiler-Tool abzurufen, sodass ich nicht alle Interaktionsbedingungen erhalte und das alles sortieren muss? Ich möchte eine eindeutige Liste von Parameternamen, mit denen ich arbeiten kann. Ich muss davon ausgehen, dass die Anzahl der Parameter, die angepasst werden, je nach Modell unterschiedlich sein wird.
Betreff: Skriptautomatisierung: Abrufen von Prädiktoren und Festlegen des Sigma-LevelsHier ist ein viel ausführlicheres Beispielskript.Beachten Sie, dass dies NICHT funktioniert!
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" );
);Hilfe! Es gibt mehrere Teile davon, die nicht funktionieren!Hier ist, was funktioniert - Kommentieren Sie die benutzerdefinierte Funktion und alles unten (nahe dem Ende des Skripts) aus, wo steht, dass UNTEN NICHT FUNKTIONIERT. Ich komme durch die Generierung der SLS-Modellierung, aber wenn es darum geht, die Simulationsparameter zu ändern und die Simulation auszuführen, die beide angepasst sind (siehe benutzerdefinierte Funktion), gehen mir die Ideen aus.
Betreff: Skriptautomatisierung: Abrufen von Prädiktoren und Festlegen des Sigma-LevelsEs gibt viele Tippfehler bei dieser Funktion, die Probleme verursachen können. Ich habe gerade einige Dinge repariert, keine Ahnung, ob es tut, was es tun soll
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");
);Betreff: Skriptautomatisierung: Abrufen von Prädiktoren und Festlegen des Sigma-Levels@jthi - Ich muss Ihrer Empfehlung ein wenig auf den Grund gehen.Ich habe Filter Each, Transform Each und Eval Insert gesehen, aber ich habe keine Erfahrung damit und weiß noch nicht, wie sie funktionieren.
Noch eine Frage an dich.In Eval Insert hast du Karotten-^-Markierungen, die ich noch nie zuvor gesehen habe.Gibt es eine Dokumentation, in der ich mehr über ihre Funktionalität erfahren kann?Ich denke, es ist ziemlich klar, wie Sie es verwenden, aber ich bin fasziniert und möchte sicherstellen, dass ich Ihre Verwendung richtig interpretiere.
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))^");
);Betreff: Skriptautomatisierung: Abrufen von Prädiktoren und Festlegen des Sigma-Levels@jthi ,
Du warst auf dem richtigen Weg! Andere Ausdrucksmanipulationen waren notwendig, um die Argumente zum Einfügen in ihre jeweiligen Funktionen zu erstellen.In der benutzerdefinierten mysim-Funktion wurden die Argumente, die in die Änderung der Verteilung für die Simulation eingefügt werden, und die Generierung des Arguments zum Einfügen in Simulate to Table ausführlich erläutert.Dies ist eine sehr aufregende Lerngelegenheit und hat mir die Augen für diese Art von fortgeschrittenen Ausdrücken geöffnet.
Wenn jemand mehr über Ausdrucksmanipulationen wissen möchte, ist hier ein Link zur Dokumentation: https://www.jmp.com/support/help/en/17.0/#page/jmp/advanced-expressions-macros-and-lists.shtml#
Vielen Dank an die Helfer!
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