Code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listeSalut tout le monde,
Cette question est en rapport avec un post ici qui génère bien une colonne non dynamique pour résumer une liste d'autres colonnes.
Le problème que j'ai est de savoir comment résumer les colonnes (en utilisant JSL) lorsque vous avez une liste de N autres colonnes et que ce soit une formule dynamique.
J'ai une liste de colonnes dans ma table de données, disons ColList, et je souhaite générer une nouvelle colonne avec une formule qui additionne simplement les éléments N de la ColList. Quelque chose que je pensais est comme ça:
Names Default to Here (1);
dt = Open("$Sample_Data/2D Gaussian Process Example.jmp");<BR />ColList = dt << Get Column Names;
dt << New Column("Sum", Formula(Sum(ColList)));Cela ne fonctionne clairement pas car ColList est une liste de colonnes : ColList = {"col1", "col2", ..., "colN"}. J'ai essayé de créer une chaîne et d'utiliser Eval(Parse()) et Eval Insert() comme ceci :
Names Default to Here (1);
dt = Current Data Table();
str = Eval Insert("dt << New Column(\!"Sum\!", Formula(Sum(Eval(ColList))));");
Eval(Parse(str));Mais toujours pas de chance. Le code JSL générera la colonne avec une formule, mais aura des valeurs de ligne vides car il affiche toujours Eval(ColList) dans la formule au lieu d'être la formule réelle, qui devrait ressembler à : Sum(:col1, :col2, : col3, ..., :colN).
Je n'arrive pas à comprendre ce que je fais de mal en passant de la liste {""} de colonnes à la référence aux colonnes avec les deux-points :.
Toute aide est très appréciée.
Merci!,
DS
Études de consommation et de marchéIngénierie de la qualité et des procédésRe : code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listeSalut @SP ,
Merci beaucoup pour votre solution. Cela fonctionne très bien pour mes tables de données avec lesquelles je travaille. J'ai eu besoin de modifier un peu les choses pour tenir compte du fait que de nombreuses tables de données avec lesquelles je travaille ont d'autres types de données, donc je n'ai qu'à considérer les données continues numériques. Quoi qu'il en soit, cela fonctionne correctement et remplit correctement les moyennes multivariées, les développements standard et les corrélations X. J'utilise JMP 16 EA, si cela compte.
Merci pour votre aide! J'ai également posté dans l'autre fil de la demande d'origine concernant la matrice de corrélation afin que cette personne puisse, espérons-le, bénéficier du code pour passer à N dimensions.
Merci!,
DS
Re : code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listeVoici une approche. Construisez d'abord itérativement Factors(), puis dans une deuxième étape, créez l'expression Simulator() complète, y compris les arguments évalués pour X Correlations().
// Iteratively build the Factors expression
fs = Expr( Factors() );
For( i = 1, i <= N Items( ColList ), i++,
Insert Into(
fs,
Eval Expr( Expr( collist[i] ) << multivariate( Expr( MMean[i] ), Expr( MSD[i] ) ) )
)
);
// Make the complete Simulator expression
sim = Eval Expr(
sim_design << Simulator(
1,
Expr( Name Expr( fs ) ),
X Correlations( 1, Expr( ColList ), Expr( corr_mat ) ),
N Runs( 1e4 )
)
);
// Name Expr( sim ) // Run this line to show the expression in the log
// Launch Profiler and run the Simulator expression
sim_design = Profiler( Y( :Pred ) );
sim;
Cependant, la matrice des corrélations X semble (dans la plupart des cas) être ignorée. Seuls des zéros dans le rapport.
De plus, lorsque des corrélations sont saisies manuellement dans le profileur et que vous enregistrez et exécutez le script, les corrélations sont perdues. Même s'ils sont conservés dans le script enregistré. Pas certain de pourquoi.
Re : code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listeSalut @SP ,
J'ai une question connexe (donc pas un autre message) pour laquelle j'espère que votre méthode de script pourra vous aider. C'est lié à la poste ici . Ce que j'essaie de faire maintenant, c'est essentiellement de généraliser ce qui a été mis dans le message d'origine d'une matrice de corrélation 4x4 à une matrice NxN arbitraire lors de la "transmission" des informations au simulateur dans le profil.
À partir de l'autre message d'origine, il existe un script qui peut générer la matrice de corrélation NxN, et à partir de votre entrée, peut générer une colonne "prédiction" (la somme des autres N colonnes). Là où j'ai du mal c'est la suite : lors de l'appel de la fonction Simulator(), vous avez la chose suivante à lui passer :
Simulator(state=0|1, , )
Ainsi, à partir de l'autre message d'origine, la solution pour transmettre la liste correcte des facteurs ("tpListY") et la matrice de corrélation ("corr.mat"), le code JSL devait avoir le Eval Insert() enroulé autour de l'appel à envoyer Simulator() au rapport Profiler, puis exécutez un Eval(Parse()) autour de cela.
Le défi est maintenant de savoir comment généraliser correctement cela afin que lors de l'appel de Simulator() et de la définition des facteurs, vous puissiez le faire sur cette ColList.
ColList peut être quelque chose comme : ColList = {A, B, C, D, ...} et il y a une moyenne et un écart type associés pour chaque colonne A, B, C, ....
Quelle est la bonne syntaxe pour appeler le simulateur afin qu'il insère la bonne moyenne et le bon écart type pour chaque facteur ? Exemple:
sim_design = Profiler(Y(:Pred), Invisible);
new = Eval Insert(
"sim_design << Simulator(
1,
Factors(
:A << mutlivariate(Mmean[1], MSD[1])),
:B << mutlivariate(Mmean[2], MSD[2])),
:C << mutlivariate(Mmean[3], MSD[3])), //etc. for the N columns in the made up table.
),
X Correlations(
1,
Eval(ColList),
Eval(corr_mat)
),
NRuns(1e6)
);");
Eval(Parse(new));À partir de la table de données d'origine, une deuxième maquette est réalisée avec le nombre de colonnes (N) qui ont été utilisées pour générer la matrice de corrélation (corr_mat). Cette table maquette est celle qui additionne les colonnes pour créer la colonne :Pred qui est utilisée comme fonction factice à envoyer au profileur. Les variables Mmean et MSD sont des vecteurs qui contiennent la moyenne et l'écart type des N colonnes A à travers n'importe quoi.
Sans avoir à écrire explicitement dans chaque colonne et leur moyenne correspondante, j'aimerais que cela soit plus automatisé afin qu'il puisse gérer n'importe quel nombre de colonnes.
Quelle serait la bonne façon de procéder ?
J'ai également des problèmes avec Eval(corr_mat) entrant réellement les valeurs de la matrice de corrélation dans les entrées X Correlations.
La table de données et le script ci-joints devraient aider à comprendre ce que j'essaie.
Merci!,
DS
Mise à jour, désolé d'avoir ajouté le mauvais fichier, la table de données est maintenant correcte.
Re : code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listeSalut @SP ,
C'est une solution parfaite, merci! J'aime sa simplicité et son élégance.
J'ai dû modifier un peu mon code car le faire à votre façon pose toujours un problème lorsque la liste est structurée comme suit : {"A", "B", "C", ...}. Mais, si la liste est structurée comme {A, B, C, ...} alors elle évalue très bien l'expression. Les deux listes sont générées légèrement différemment et les citations dérangent vraiment Eval().
Merci!,
DS
Re : code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listeIl y a plusieurs moyens de le faire. Je préfère créer une variable pour l'expression souhaitée en utilisant EvalExpr(), puis utiliser NameExpr() pour transférer l'expression (non évaluée) dans l'argument Formula().
Names Default To Here( 1 );
dt = Open( "$Sample_Data/2D Gaussian Process Example.jmp" );
ColList = dt << Get Column Names;
F = Eval Expr( Sum( Expr( ColList ) ) );
dt << New Column( "Sum", Formula( Name Expr( F ) ) );