JSL-Code, der zum Generieren einer dynamischen Formelspalte benötigt wird, die Spalten aus einer Liste summiertHi an alle,
Diese Frage bezieht sich auf einen Beitrag Hier Dadurch wird eine nicht dynamische Spalte zum Aufsummieren einer Liste anderer Spalten generiert.
Das Problem, das ich habe, ist, wie man die Spalten (unter Verwendung von JSL) zusammenfasst, wenn Sie eine Liste von N anderen Spalten haben und es sich um eine dynamische Formel handelt.
Ich habe eine Liste von Spalten in meiner Datentabelle, z. B. ColList, und ich möchte eine neue Spalte mit einer Formel generieren, die einfach die N Elemente in der ColList summiert. Etwas, was ich dachte, ist wie folgt:
Names Default to Here (1);
dt = Current Data Table();
dt << New Column("Sum", Formula(Sum(ColList)));Dies funktioniert eindeutig nicht, da ColList eine Liste von Spalten ist: ColList = {"col1", "col2", ..., "colN"}. Ich habe versucht, einen String zu erstellen und Eval (Parse ()) und Eval Insert () wie folgt zu verwenden:
Names Default to Here (1);
dt = Current Data Table();
str = Eval Insert("dt << New Column(\!"Sum\!", Formula(Sum(Eval(ColList))));
Eval(Parse(str));Aber immer noch kein Glück. Der JSL-Code generiert die Spalte mit einer Formel, hat jedoch leere Zeilenwerte, da in der Formel immer noch Eval (ColList) angezeigt wird, anstatt die eigentliche Formel zu sein, die wie folgt aussehen sollte: Sum (: col1 ,: col2 ,: col3, ...,: colN).
Ich kann nicht herausfinden, was ich falsch mache, wenn ich von der Liste {""} der Spalten zum Verweis auf die Spalten mit dem Doppelpunkt gehe :.
Jede Hilfe wird sehr geschätzt.
Vielen Dank!,
DS
AnalytikDatentabelleSkriptingBetreff: JSL-Code, der zum Generieren einer dynamischen Formelspalte benötigt wird, die Spalten aus einer Liste summiertEs gibt verschiedene Möglichkeiten, dies zu tun. Ich bevorzuge es, eine Variable für den gewünschten Ausdruck mit EvalExpr () zu erstellen und dann NameExpr () zu verwenden, um die (nicht ausgewertete) Expession in das Formula () -Argument zu übertragen.
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 ) ) );
Betreff: JSL-Code, der zum Generieren einer dynamischen Formelspalte benötigt wird, die Spalten aus einer Liste summiertHallo @Frau ,
Das ist eine perfekte Lösung, danke! Mir gefällt, wie einfach und elegant es ist.
Ich musste meinen Code ein wenig ändern, da es immer noch ein Problem gibt, wenn die Liste wie folgt aufgebaut ist: {"A", "B", "C", ...}. Wenn die Liste jedoch wie folgt aufgebaut ist: {A, B, C, ...}, wird der Ausdruck einwandfrei ausgewertet. Die beiden Listen werden leicht unterschiedlich generiert und die Zitate werfen Eval () wirklich ab.
Vielen Dank!,
DS
Betreff: JSL-Code, der zum Generieren einer dynamischen Formelspalte benötigt wird, die Spalten aus einer Liste summiertHallo @Frau ,
Ich habe eine verwandte Frage (daher kein weiterer Beitrag), bei der ich hoffe, dass Ihre Skriptmethode helfen kann. Es hat mit der Post zu tun Hier . Was ich jetzt versuche, ist im Grunde zu verallgemeinern, was im ursprünglichen Beitrag von einer 4x4-Korrelationsmatrix auf eine beliebige NxN-Matrix gesetzt wurde, wenn dem Simulator im Profil Informationen "zugeführt" werden.
Aus dem anderen ursprünglichen Beitrag gibt es ein Skript, das die NxN-Korrelationsmatrix generieren kann, und aus Ihrer Eingabe kann eine "Vorhersage" -Spalte (die Summe der anderen N Spalten) generiert werden. Wenn es mir schwer fällt, ist Folgendes: Wenn Sie die Simulator () -Funktion aufrufen, müssen Sie Folgendes übergeben:
Simulator (state = 0 | 1, , )
Aus dem anderen ursprünglichen Beitrag, der Lösung zum Übergeben der korrekten Liste von Faktoren ("tpListY") und Korrelationsmatrix ("corr.mat"), musste der JSL-Code das Eval Insert () um den zu sendenden Anruf gewickelt haben Simulator () zum Profiler-Bericht und führen Sie dann eine Eval (Parse ()) um.
Die Herausforderung besteht nun darin, dies korrekt zu verallgemeinern, sodass Sie dies beim Aufrufen von Simulator () und beim Definieren der Faktoren in dieser ColList tun können.
ColList könnte ungefähr so aussehen: ColList = {A, B, C, D, ...} und es gibt einen zugehörigen Mittelwert und eine Standardabweichung für jede Spalte A, B, C, ....
Was ist die richtige Syntax, um den Simulator aufzurufen, damit er für jeden Faktor den richtigen Mittelwert und Std Dev einfügt? Beispiel:
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));Aus der ursprünglichen Datentabelle wird ein zweites Modell mit der Anzahl der Spalten (N) erstellt, die zur Erzeugung der Korrelationsmatrix (corr_mat) verwendet wurden. Diese Mock-up-Tabelle summiert die Spalten, um die Spalte: Pred zu erstellen, die als Dummy-Funktion zum Senden an den Profiler verwendet wird. Die Variablen Mmean und MSD sind Vektoren, die den Mittelwert und die Standardabweichung der N Spalten A durch was auch immer enthalten.
Ohne explizit in jede Spalte und den entsprechenden Mittelwert schreiben zu müssen, möchte ich dies automatisierter machen, damit es eine beliebige Anzahl von Spalten verarbeiten kann.
Was wäre ein guter Weg, um dies zu tun?
Ich habe auch Probleme damit, dass Eval (corr_mat) tatsächlich die Werte der Korrelationsmatrix in die X-Korrelationseinträge eingibt.
Die angehängte Datentabelle und das Skript sollen helfen, zu verstehen, was ich versuche.
Vielen Dank!,
DS
Update, leider die falsche Datei hinzugefügt, hat jetzt die richtige Datentabelle.
Betreff: JSL-Code, der zum Generieren einer dynamischen Formelspalte benötigt wird, die Spalten aus einer Liste summiertHier ist ein Ansatz. Erstellen Sie zuerst iterativ die Factors () und erstellen Sie dann in einem zweiten Schritt den vollständigen Simulator () -Ausdruck einschließlich der ausgewerteten Argumente für die 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;
Die X-Korrelationsmatrix scheint jedoch (in den meisten Fällen) ignoriert zu werden. Nur Nullen im Bericht.
Auch wenn Korrelationen manuell im Profiler eingegeben und das Skript gespeichert und ausgeführt werden, gehen die Korrelationen verloren. Auch wenn sie im gespeicherten Skript erhalten bleiben. Nicht sicher warum.
Betreff: JSL-Code, der zum Generieren einer dynamischen Formelspalte benötigt wird, die Spalten aus einer Liste summiertHallo @Frau ,
Vielen Dank für Ihre Lösung. Es funktioniert gut für meine Datentabellen, mit denen ich arbeite. Ich musste einige Änderungen vornehmen, um der Tatsache Rechnung zu tragen, dass viele der Datentabellen, mit denen ich arbeite, andere Datentypen haben. Daher muss ich nur die numerischen fortlaufenden Daten berücksichtigen. Wie auch immer, es funktioniert korrekt und füllt die multivariaten Mittelwerte, Standardentwickler und die X-Korrelationen korrekt aus. Ich verwende JMP 16 EA, wenn das wichtig ist.
Danke für Ihre Hilfe! Ich habe auch im anderen Thread der ursprünglichen Anfrage bezüglich der Korrelationsmatrix gepostet, damit die Person hoffentlich vom Code profitieren kann, um auf N Dimensionen zu skalieren.
Vielen Dank!,
DS