Char () sur un effet d'interactionJ'ai du mal à croire que cela n'a pas été demandé auparavant et que je dois chercher les mauvais mots clés.
Arrière-plan: je suppose qu'un utilisateur a exécuté Fit Model et enregistré un résultat intéressant en tant que script dans la table de données. J'ai écrit JSL pour extraire l'argument Effects () du script enregistré. Supposons que nous ayons des effets (: A,: B:,: A *:
.
J'ai déjà écrit JSL qui obtient ce résultat (tant que je n'utilise PAS Transform Column () dans la liste des effets du modèle - cela créerait une nouvelle boîte de Pandore):
testList = {:A, :B, :A*:B};Ma tâche actuelle: je veux écrire JSL pour permettre à mon utilisateur de sélectionner l'un de ces trois effets.
Statut actuel: Voici ce que j'ai fait jusqu'à présent:
win = New Window( "Test", Panel Box( "Choose an Effect", Radio Box( testList ) ) );
Si je lance ceci, je reçois une Radio Box avec les effets "A", "B" et "Multiplier". Clairement, la zone d’affichage choisit de retirer la tête () du troisième effet, plutôt que de simplement afficher "A * B".
Solution possible: Je pense pouvoir résoudre ce problème en écrivant une boucle pour vérifier Head (testList [i]) == "Multiply ()" et si c'est le cas, codez une autre boucle pour extraire chacun des Arg j), convertissez-les en caractères, mettez-les dans une autre liste, puis concattez-les () avec un séparateur "*".
Question: Existe-t-il un itinéraire plus direct que celui-ci qui me donnera une Radio Box avec les effets "A", "B" et "A * B"?
Re: Char () sur un effet d'interactionVoici ce que je suis venu avec. J'ai décidé de créer des moindres carrés standard nus, plutôt que de substituer la personnalité, car je ne sais pas si certaines personnalités du modèle Fit pourraient inclure des messages qui ne fonctionneraient pas dans les moindres carrés standard.
script = (Current Data Table() << Get Property("Fit Model"));
scriptAsStandardLeastSquares = Expr(Fit Model());
nFitModelArgs = N Arg( script );
For( k = 1, k <= nFitModelArgs, k++,
headString = Char( Head( Arg( script, k ) ) );
If(
headString == "Y" | headString == "Effects", Insert Into(scriptAsStandardLeastSquares, Arg(script, k))
);
);
Insert Into(scriptAsStandardLeastSquares, Expr(Run()));
Insert Into(scriptAsStandardLeastSquares, Expr(Personality("Standard Least Squares")));
Insert Into(scriptAsStandardLeastSquares, Expr(invisible));
fm = Eval(scriptAsStandardLeastSquares);
effectList = (fm << Get Effect Names);
fm << Close Window;Re: Char () sur un effet d'interactionC'est le genre de code que j'utilise:
// s = model script
// easier to manipulate strings
str = Char(NameExpr(s));
// ensure there is a variable to store a reference to the model object
str = "mwin=" || str;<BR /><BR /><BR />// run in the background
SubstituteInto(str,"Fit Model(","Fit Model(Invisible,");
// change emphasis (could also change personality)
pattern = "Emphasis(" + PatArb() + ")" + PatRem();
replace = "Emphasis( Minimal Report ), Run)";
Pat Match(strScript, pattern, replace);
// execute and retrieve results
Eval(Parse(str));
effects = mwin << Get Effect Names;Re: Char () sur un effet d'interactionNon, ça ne marchera pas. Supposons que j'ai un scientifique qui utilise délibérément un colon dans le nom de la colonne (peut-être pour représenter un rapport). Puis la JSL de @txnelson pourrait ressembler à ceci:
testList = {:Name("A:total"), :Name("B:total"), :Name("A:total") * :Name("B:total")};
newtestlist = testList;
For( i = 1, i <= N Items( testlist ), i++,
newtestlist[i] = Substitute(Char( testlist[i] ), ":", "")
);
win = New Window( "Test", Panel Box( "Choose an Effect", Radio Box( newtestList ) ) );La radio émet alors Atotal, Btotal et le très vilain Nom ("Atotal") * Nom ("Btotal").
Non, je pense que je préférerais le message Obtenir les noms d’effets tant que je peux le faire fonctionner. Je pense que je suis sur le point de réécrire le script enregistré dans la table de données pour forcer les moindres carrés standard afin que je puisse obtenir les noms.
Re: Char () sur un effet d'interactionUne fois qu'ils sont "charés", vous pouvez faire un S ubstituteInto enlever les deux points
Re: Char () sur un effet d'interactionBien que je puisse peut-être simplement réécrire le script Fit Model pour forcer la personnalité Standard des moindres carrés et exécuter le (mauvais) modèle juste assez loin pour que je puisse obtenir les noms des effets?
Re: Char () sur un effet d'interactionC'est en fait très prometteur pour mon application, mais cela ne fonctionne qu'avec la personnalité Fit Least Squares. Malheureusement, j'ai besoin de quelque chose qui fonctionne dans les moindres carrés, mais aussi avec la régression généralisée et généralisée.
Re: Char () sur un effet d'interactionCela fonctionne mais laisse les deux points derrière. De plus, cela devient vraiment moche si les noms de colonnes contiennent des caractères qui forcent JMP à envelopper le nom de la colonne dans la fonction Name ().
Re: Char () sur un effet d'interactionJ'ai résolu ce problème de la manière suivante par le passé
testList = {:A, :B, :A * :B};
newtestlist = testList;
For( i = 1, i <= N Items( testlist ), i++,
newtestlist[i] = Char( testlist[i] )
);
win = New Window( "Test", Panel Box( "Choose an Effect", Radio Box( newtestList ) ) );Re: Char () sur un effet d'interactionParfois, un itinéraire indirect est plus facile. Puisque vous avez le script, exécutez-le en arrière-plan, envoyez les noms d'effet à l'objet de modèle d'ajustement, puis vous avez la liste que vous pouvez utiliser pour vos boutons radio.