Ajustez un modèle avant d'exécuter le modèle d'ajustement, la zone de liste ne respecte pas les noms de colonnes spéciauxJe cherche à créer une copie de cette boîte de dialogue d'effets de modèle à partir du modèle d'ajustement :

L'objectif est de créer un script qui lira cette expression d'effets à partir du script de modèle que le DOE enregistre dans le tableau, permettra aux utilisateurs de modifier l'expression d'effet, puis d'exécuter une analyse en utilisant le modèle d'ajustement avec la nouvelle expression d'effets.
Si vous exécutez la boîte de dialogue dans le script ci-dessous, vous verrez qu'elle lit l'expression des effets du script de modèle stocké dans la table. Place cela dans la zone de liste qui ressemble à Ajuster le modèle, vous permet de le modifier, puis lorsque vous appuyez sur ok, il tente d'analyser la zone de liste dans une nouvelle expression d'effets et de démarrer une boîte de dialogue de modèle d'ajustement personnalisé avec cette nouvelle expression.
Le problème/la différence se trouve dans la colonne de nom spécial : dans l'expression d'origine, elle est stockée sous la forme :name("Height-") mais lors de la récupération de cette expression dans la zone de liste, elle est stockée sous la forme "Height-", ce qui devient un résultat mathématique incomplet. opération au lieu d’un nom de colonne. Alors, comment puis-je appliquer les règles spéciales de nom de colonne aux éléments de cette zone de liste ? Il en va de même pour les termes croisés et imbriqués avec la colonne de nom spéciale.
dt=Open("$SAMPLE_DATA/Big Class.jmp");
dt:height << Set Name( "Height-" );
FitModelScript = dt << Get table variable( "Fit Model" );
i = 1;
try(
While( !Is Empty( arg_i = Arg( parse(FitModelScript), i ) ),
If( Starts With( Char( Name Expr( arg_i ) ), "Effects" ),
EffectsExpr = Name Expr( arg_i );
Break();
,
i++
)
);
);
New Window( "Test",
Border Box( Left( 3 ), top( 2 ),
v list box(
H List Box(
Panel Box( "Select Columns",
v list box(
colListData = Col list box( All, width( 253 ), grouped, nLines( 20 ) ),
Spacer box(size(1,2))
)
),
Panel Box( "Cast Selected Columns into Roles",
Lineup Box( N Col( 2 ), Spacing( 3 ),
Button Box( "Response columns", colListYbox << Append( colListData << GetSelected ) ),
colListYbox = Col List Box( width( 200 ), nLines( 20 ), numeric, MinItems( 1 ) ),
)
),
Panel Box( "Model effects",
H List Box(
V List Box(
Button Box( "Main", LB << Append( colListData << GetSelected ) ),
Button Box( "Interact",
SelectedColumns = colListData << GetSelected();
For( i = 1, i <= N Items( SelectedColumns ), i++,
For( k = 1, k <= N Items( SelectedColumns ) - i, k++,
LB << Append( concat(SelectedColumns[i], " * ", SelectedColumns[i + k] ) )
)
);
),
Button Box( "Quadratic",
SelectedColumns = colListData << GetSelected();
For( i = 1, i <= N Items( SelectedColumns ), i++,
LB << Append( concat(SelectedColumns[i], " * ", SelectedColumns[i] ) )
);
),
Button Box( "Nest",
colListX = colListData << GetSelected();
For( i = 1, i <= N Items( colListX ), i++,
If(Column(colListX[i]) << Get Modeling Type() != "Nominal",
New window("Error",<<MODAL>0,
For( i = 1, i <= N Items( MainNest ), i++,
If(Contains(colListX, MainNest[i])==0,
LB << Append(concat(MainNest[i], "[", concat items(colListX, ", "), "]"));
LB << Remove Item(contains(LB << Get items( ),MainNest[i]));
,
New window("Error", <<MODAL></MODAL></MODAL>
Modélisation statistique avancéeÉtudes de consommation et de marchéPersonnalisation de masseIngénierie Qualité et ProcédésRe : Ajuster un modèle avant d'exécuter le modèle d'ajustement, la zone de liste ne respecte pas les noms de colonnes spéciauxMerci!
Oui, j'essaie de prendre en charge chaque nom de colonne car je ne les crée pas. Renommer est la seule solution que j'ai trouvée et qui fonctionne vraiment, mais je n'aime pas changer les tableaux de données des gens, même temporairement. Au lieu de cela, je vais voir si je peux y arriver en intégrant le modèle Ajuster directement dans la nouvelle boîte de dialogue de la fenêtre et en laissant cela gérer la création de l'expression des effets. Je perds ainsi certaines fonctionnalités (rappel et autres zones de colonnes pouvant être remplies) mais cela vaut la peine d'avoir un générateur d'expression d'effets robuste.
Re : Ajuster un modèle avant d'exécuter le modèle d'ajustement, la zone de liste ne respecte pas les noms de colonnes spéciauxSi les noms de colonnes contiennent les mêmes caractères que ceux utilisés pour les termes croisés ou imbriqués...
Le moyen le plus simple consiste à empêcher que cela se produise. Si votre script crée de telles colonnes, envisagez, par exemple, d'utiliser \{ \} à la place de [ ] et \# à la place de *. Si, d'un autre côté, vous essayez de prendre en charge n'importe quel nom de colonne possible, vous pouvez parcourir les noms de colonnes, en effectuant des substitutions comme celles mentionnées ci-dessus, après avoir affiché une fenêtre d'avertissement modale informant l'utilisateur que les noms de colonnes doivent être temporairement modifiés. Vous pourrez ensuite les modifier une fois le script terminé.
Aussi : existe-t-il un équivalentwords() pour extraire tous les arguments d’un type d’expression ? Maintenant, je finis par devoir écrire des boucles pour extraire tous les arguments d'une expression.
Je ne connais pas de fonction analogue aux mots pour les arguments d'expression. Si vous créez souvent de telles listes, peut-être qu'une fonction pourrait vous aider ? Notez que vous devez envelopper l'expression dans nameexpr() lorsque vous la transmettez à la fonction.
Acclamations,
Brady
exp = Expr( note( a, b, c ) );
argList = function({ex},
{aList = {}, i=1},
While( i <= N Arg( ex ), Insert Into( aList, Arg( ex, i++ ) ) );
aList
);
argList(nameexpr(exp));
Re : Ajuster un modèle avant d'exécuter le modèle d'ajustement, la zone de liste ne respecte pas les noms de colonnes spéciauxSalut,
Je me demande s'il serait possible d'ajouter ":Name(ColumnName)" autour de chaque nom de colonne et si cela résoudrait le problème.Une façon de procéder pourrait consister à utiliser Regex().J'ai écrit quelque chose qui, je pense, pourrait être un pas dans cette direction, mais ce n'est toujours pas parfait.Peut-être que quelqu'un avec plus de connaissances sur Regex pourrait vous aider ? :
colnames=dt<<GET column="" names=""></GET>
Re : Ajuster un modèle avant d'exécuter le modèle d'ajustement, la zone de liste ne respecte pas les noms de colonnes spéciaux@brady_brady Je l'ai presque résolu, mais il me reste encore un problème : si les noms de colonnes contiennent les mêmes caractères que ceux utilisés pour les termes croisés ou imbriqués, comment les diviser en colonnes lorsque vous revenez d'une zone de liste ?
dt = New Table( "Test",
Add Rows( 3 ),
Compress File When Saved( 1 ),
New Column( "SCR[12]*34",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3] )
),
New Column( "SCR5[a]*",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [3, 2, 3] )
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [4, 1, 4] )
)
);
new window("test", LB = list box());
LB << append((Column(1) << get name()) || " * " || (Column(2) << get name()));
LB << append((Column(1) << get name()) || "[" || (Column(2) << get name()) || "]");
LB << get items();Vous remarquerez que les éléments provenant de la zone de liste ne sont que des chaînes. Si j'utilise des mots() avec le séparateur "*" ou "[]", j'obtiens trop de fractionnements et les résultats ne sont plus des références de colonne. Je dois diviser chaque élément en ses constituants afin de pouvoir les envelopper dans le :Name(" ") et les ré-imbriquer/croiser et les ajouter à l'expression des effets pour ajuster le modèle. J'ai également besoin d'une liste de toutes les colonnes impliquées dans l'un des termes d'une autre partie du script.
Si vous connaissez une solution, veuillez considérer que la boîte de dialogue Ajuster le modèle permet l'imbrication et le croisement avec plus de 2 variables.
Dans l'autre sens, en analysant l'expression des effets du script de modèle, je pourrais utiliser la fonction Arg() pour extraire les colonnes et remplir la zone de liste, mais en revenant en arrière, cela ne fonctionne pas car il s'agit d'un type de chaîne.
Aussi : existe-t-il un équivalentwords() pour extraire tous les arguments d’un type d’expression ? Maintenant, je finis par devoir écrire des boucles pour extraire tous les arguments d'une expression.
Re : Ajuster un modèle avant d'exécuter le modèle d'ajustement, la zone de liste ne respecte pas les noms de colonnes spéciauxMerci Brady, je vais examiner cela. Je me demande surtout comment il gérera les termes croisés, interactifs et imbriqués, mais je devrai jouer un peu avec cela pour vérifier.
J'ai également besoin de voir si je peux faire quelque chose de similaire lors de l'importation d'un modèle existant avec ces termes dans la zone de liste, car cela affiche actuellement le contenu "Nom(". Je ferai un retour une fois que j'aurai eu le temps de creuser.
En y réfléchissant, il serait peut-être préférable d'appeler/réutiliser l'élément Construct Model Effects à partir de la boîte de dialogue Ajuster le modèle en envoyant l'utilisateur interagir avec cette fenêtre, puis en relisant l'expression des effets de cette fenêtre. Pas aussi joli cependant.
Re : Ajuster un modèle avant d'exécuter le modèle d'ajustement, la zone de liste ne respecte pas les noms de colonnes spéciauxUne façon d’y parvenir consiste à créer des expressions. L’un des principaux avantages de cette approche est que, contrairement aux approches basées sur des chaînes, le code reste coloré, facile à lire et nécessite un minimum de caractères d’échappement. Le flux dans ce cas particulier est le suivant :
- Définir et construire l'expression de la réponse,
- Définir et construire l'expression des effets,
- Définir une expression Ajuster le modèle avec des espaces réservés,
- Remplacez les expressions de réponse et d'effet par les espaces réservés dans l'expression Ajuster le modèle, et
- Exécutez l’expression Ajuster le modèle.
Remarque : j'ai commenté l'option "invisible" et j'ai enveloppé le changement de nom de colonne dans un try() pour permettre des exécutions répétées.
Pour essayer, remplacez votre code Buttonbox("OK" ... ) par le code ci-dessous. Une colonne doit être saisie dans la list box de la colonne Réponse avant de cliquer sur « OK ».
Acclamations,
Brady
Button Box( "OK",
respList = colListYbox << get items();
respExpr = expr(Y());
for(i=1, i<=nitems(respList), i++,
insertinto(respExpr, parse(evalinsert(":name(\!"^respList[i]^\!")")))
);
effectsList = lb << get Items;
effectsExpr = expr(Effects());
for(i=1, i<=nitems(effectsList), i++,
insertinto(effectsExpr, parse(evalinsert(":name(\!"^effectsList[i]^\!")")))
);
jslExpr = expr(
try(FitModelDialogWindow << closewindow());
FitModelDialogWindow = Fit Model(
//invisible,
_Y_,
_EFFECTS_,
Keep dialog open( 1 ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" )
);
);
substituteInto(jslExpr,
expr(_Y_), nameexpr(respExpr),
expr(_EFFECTS_), nameexpr(effectsExpr)
);
jslExpr;
)