Salut tout le monde,
Vous rencontrez des problèmes avec le référencement correct d'une colonne lors du passage de la commande << Simuler dans une fenêtre de rapport à l'aide de JSL.
La section de code avec laquelle j'ai du mal est la suivante :
report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( Eval( YCols ) ),
In( :Simulated Y )
);
L’exécution de cette section de code génère l’erreur suivante : Colonne à désactiver introuvable. puis apparaît la fenêtre dans laquelle vous êtes censé sélectionner les colonnes à activer et désactiver.
Le report_of_interest est la fenêtre de rapport dans laquelle j'envoie la commande Simulate. Plus précisément au NumberColBox(8), qui est la colonne Estimation du rapport. NBSnum et RSnum correspondent au nombre d'échantillons bootstrap à exécuter et à une variable de départ aléatoire. Le problème vient du nom de la colonne dans Out( ) de la commande Simulate( ). La colonne In() ne pose aucun problème car je peux nommer la colonne de données simulée comme je veux, mais la colonne de l'option Out() n'est pas une colonne que je veux vraiment renommer ou quoi que ce soit. Dans ce cas, j'enregistre les données simulées dans la table de données et je renomme la colonne "Simulated Y" afin de pouvoir la référencer selon les besoins dans la commande Simulate comme In(:Simulated Y).
Plus tôt dans le code, l'utilisateur est invité à sélectionner la colonne qui sera la colonne de réponse pour la modélisation, il s'agit de YCols, et souvent, lorsqu'il s'agit d'une colonne dans une plateforme, vous pouvez simplement l'avoir sous la forme Eval(YCols), et il l'accepte très bien, par exemple :
fm = avdt << Fit Model(
Y( Eval( YCols ) ),
Validation( :Validation ),
Effects( :Null Factor, Eval( XCols ) ),
Personality( "Generalized Regression" ),
Run( Fit( Estimation Method( Forward Selection ), Validation Method( Validation Column ) ) )
);
Exécutera correctement un modèle d’ajustement sur la colonne Y( ). Cependant, la commande Simulate( ) souhaite que la colonne soit référencée comme une colonne de portée, je crois, comme elle le souhaite, :My Column To Model, par exemple.
Disons que la colonne porte le nom "Ma colonne à modéliser", donc les variables YCols et Eval(YCols) renverront toutes deux le {"Ma colonne à modéliser"} suivant. Lors de l'envoi de la commande de simulation au rapport, il souhaite que le nom de la colonne soit étendu, comme suit :
report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( :My Column To Model ),
In( :Simulated Y )
);
Le problème est que la colonne que je modélise peut changer, donc son nom change, et je ne veux pas renommer la colonne pour qu'elle soit toujours un nom fixe comme :YData. Je veux travailler avec une variable comme YCols, mais je ne sais pas comment travailler avec l'opérateur infixe deux-points (:) et une variable comme YCols pour avoir la référence de colonne correcte pour la commande Simulate().
J'ai essayé As Column(dt, name), Column(dt, name), Column(number), Parse(":"||char(Column(avdt, Eval(YCols)))), Parse(":" ||Eval(YCols)[1]), et aucun de ceux-ci ne fonctionne. Ils entraînent tous la même erreur mentionnée ci-dessus et ouvrent une nouvelle fenêtre pour sélectionner les colonnes à échanger In/Out, ce qui annule l'automatisation que j'essaie de faire.
Toute aide est très appréciée.
Merci!,
DS
J'ai trouvé une solution possible, mais elle n'est certainement pas efficace et plutôt lourde. J'imagine qu'il existe de meilleures solutions et j'espère que quelqu'un pourra m'aider.
J'ai trouvé que si vous construisez la chaîne d'envoi de la commande en JSL et utilisez Eval(Parse()) pour le faire, alors cela fonctionne. Encore une fois, c'est fastidieux et peu efficace, mais cela fonctionne.
str = Eval Insert(
"report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out("
);
str2 = Eval Insert( " ),
In( :Simulated Y )
)" );
Eval( Parse( str || ":" || Char( Eval( YCols )[1] ) || str2 ) );Solution étrange, et j'espère que quelqu'un en aura une meilleure à partager.
Merci!,
DS
J'ai aussi des problèmes avec des choses comme ça.Ce n'est peut-être pas la meilleure solution, mais le code suivant devrait faire ce que vous voulez.*modifier* Je vois que vous avez déjà trouvé une méthode similaire.=)
Eval(
Parse(
"\[report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( ]\"
|| YCols[1] || "\[ ),
In( :Simulated Y )
);]\"
)
);
Si je dois créer une liste de références de colonnes et qu'Eval ne fonctionne pas, je crée généralement les expressions, puis j'utilise Eval(Substitute())
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
cols = {"height", "weight"};
obj = Fit Model(
Y(:weight),
Effects(:age, :sex, :height),
Personality("Generalized Regression"),
Generalized Distribution("Normal"),
Run(
Fit(
Estimation Method(Lasso(Adaptive)),
Validation Method(AICc)
)
)
);
obj << (fit[1] << Save Simulation Formula);
rpt = Report(obj);
out_expr = Expr(Out());
For Each({colname}, cols,
Insert Into(out_expr, Name Expr(AsColumn(dt, colname)));
);
show(out_expr);
Eval(Substitute(
Expr(dtlst = rpt["Parameter Estimates for Original Predictors"][Number Col Box("Prob > ChiSquare")] <<SIMULATE></SIMULATE>Salut @mmarchandTSI et @jthi ,
Merci pour vos commentaires et vos idées sur la façon de résoudre ce problème. Je ne devrais pas être trop surpris qu'il existe plusieurs façons différentes de résoudre le même problème avec JMP/JSL. L'un des avantages du logiciel. Pourtant, je trouve intéressant qu’une solution « plus simple » ne soit pas possible. J'apprécie l'aide!
Merci,
DS