Automatisation des scripts : récupération des prédicteurs et définition du niveau sigmaBonjour,
On m'a confié un projet de scénarisation d'un flux de modélisation. Tous les prédicteurs et réponses sont numériques continus, et les réponses sont ajustées séparément. Après une préparation initiale des données…
- Validation K-fold par étapes <-- Automatisée
- Modèle de l'étape 1 exécuté dans SLS <-- Automatisé
- Profileur de prédiction SLS :
- Initialiser le simulateur <-- Automatisé
- Changer tous les types de facteurs en aléatoire <-- Non automatisé
- Changer tous les écarts-types à une valeur de 3 sigma pour chaque colonne <-- Non automatisé
Ce flux utilisera une boucle for. À chaque itération, il effectuera une batterie d'analyses sur une seule variable de réponse. Le script pour la version 3.2 est facile à obtenir, mais modifier la valeur de l'écart-type à 3 sigma ne l'est pas. Comment l'automatisation de la modification de l'écart-type pour la version 3.2 devrait-elle fonctionner avec une boucle for ? Existe-t-il une meilleure solution ? J'ai consulté Préférences > Plateformes > Ajuster le modèle > Moindres carrés et je ne vois pas d'option permettant de modifier la valeur de l'écart-type de 1 à 3.
Récemment mis à jour vers JMP 17, si cela peut aider.
Exploration et visualisation des donnéesRe : Automatisation des scripts : récupération des prédicteurs et définition du niveau sigmaQuelque chose comme ça?
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)
)
);
Modifié à partir de l'exemple dans Scripting Index

Re : Automatisation des scripts : récupération des prédicteurs et définition du niveau sigmaBonjour @jthi ,
Pas assez. Vous trouverez ci-dessous un extrait de code de ce que j'ai, je vais vous expliquer plus en détail dans un instant.
// 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;Une fois que je << Get Parameter Names, les erreurs param_SLS avec la référence d'objet supprimée.Cependant, j'ai besoin de cette liste de paramètres pour construire les arguments dans << Simulate to table, ce que je ferai en créant une fonction personnalisée qui s'en occupe.
Cet extrait de code se trouve dans une boucle for qui parcourt une liste de réponses, une à la fois.Est-ce que ça a du sens?
Re : Automatisation des scripts : récupération des prédicteurs et définition du niveau sigmaOu existe-t-il un moyen de récupérer les noms de paramètres à partir de l'outil de profilage, de sorte que je n'obtienne pas tous les termes d'interaction et que je doive trier tout cela ? J'aimerais une liste unique de noms de paramètres avec lesquels je peux travailler. Je dois supposer que le nombre de paramètres qui seront adaptés différera d'un modèle à l'autre.
Re : Automatisation des scripts : récupération des prédicteurs et définition du niveau sigmaVoici un exemple de script beaucoup plus détaillé.Notez que cela ne fonctionne PAS !
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" );
);Aider! Il y a plusieurs parties de cela qui ne fonctionnent pas !Voici ce qui fonctionne - Commentez la fonction personnalisée et tout ce qui se trouve en dessous (près du bas du script) où les états NE FONCTIONNENT PAS EN DESSOUS. Je peux passer à travers la génération de la modélisation SLS, mais une fois qu'il s'agit de modifier les paramètres de simulation et d'exécuter la simulation, qui sont toutes deux personnalisées (voir fonction personnalisée), je suis à court d'idées.
Re : Automatisation des scripts : récupération des prédicteurs et définition du niveau sigmaIl y a beaucoup de fautes de frappe sur cette fonction qui peuvent causer des problèmes. Je viens de corriger certaines choses, aucune idée si elle fait ce qu'elle est censée faire
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 : Automatisation des scripts : récupération des prédicteurs et définition du niveau sigma@jthi - Je vais devoir creuser un peu votre recommandation.J'ai vu Filter Each, Transform Each et Eval Insert, mais je n'ai aucune expérience avec eux et je ne sais pas encore comment ils fonctionnent.
Une autre question pour vous.Dans Eval Insert, vous avez des marques de carotte ^ que je n'ai jamais vues auparavant.Existe-t-il de la documentation pour en savoir plus sur leurs fonctionnalités ?Je pense que c'est assez clair d'après la façon dont vous l'utilisez, mais je suis intrigué et je veux m'assurer que j'interprète correctement votre utilisation.
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 : Automatisation des scripts : récupération des prédicteurs et définition du niveau sigma@jthi ,
Vous étiez sur la bonne voie ! D'autres manipulations d'expressions ont été nécessaires pour créer les arguments à insérer dans leurs fonctions respectives.Dans la fonction personnalisée mysim, les arguments insérés dans la modification de la distribution pour la simulation et la génération de l'argument à insérer dans Simulate to Table ont été expliqués en détail.C'est une opportunité d'apprentissage très excitante qui m'a ouvert les yeux sur ces types d'expressions avancées.
Si quelqu'un veut en savoir plus sur les manipulations d'expressions, voici un lien vers la documentation : https://www.jmp.com/support/help/en/17.0/#page/jmp/advanced-expressions-macros-and-lists.shtml#
Merci à ceux qui ont aidé!
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