JSL-Code, der zum Generieren einer dynamischen Formelspalte benötigt wird, die Spalten aus einer Liste summiertHallo alle,
Diese Frage bezieht sich auf einen Beitrag Hier Dadurch wird eine nicht dynamische Spalte zum Zusammenfassen einer Liste anderer Spalten generiert.
Das Problem, das ich habe, ist, wie man die Spalten zusammenfasst (mit JSL), wenn man eine Liste von N anderen Spalten hat und es sich um eine dynamische Formel handelt.
Ich habe eine Liste von Spalten in meiner Datentabelle, sagen wir 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 so:
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)));Dies funktioniert eindeutig nicht, da ColList eine Liste von Spalten ist: ColList = {"col1", "col2", ..., "colN"}. Ich habe versucht, eine Zeichenfolge 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 aber leere Zeilenwerte, da in der Formel immer noch Eval(ColList) angezeigt wird, anstatt dass es sich um die eigentliche Formel handelt, 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.
Danke!,
DS
Verbraucher- und MarktforschungQualitäts- und VerfahrenstechnikBetreff: JSL-Code zum Generieren einer dynamischen Formelspalte erforderlich, die Spalten aus einer Liste summiertHallo @MS ,
Vielen Dank für Ihre Lösung. Es funktioniert einwandfrei für meine Datentabellen, mit denen ich arbeite. Ich musste die Dinge ein wenig ändern, um der Tatsache Rechnung zu tragen, dass viele der Datentabellen, mit denen ich arbeite, andere Datentypen haben, sodass ich nur die numerischen kontinuierlichen Daten berücksichtigen muss. Wie dem auch sei, es funktioniert korrekt und trägt die multivariaten Mittelwerte, Standard-Entwickler und die X-Korrelationen korrekt ein. Ich verwende JMP 16 EA, falls das wichtig ist.
Vielen Dank für Ihre Hilfe! Ich habe auch im anderen Thread der ursprünglichen Anfrage etwas über die Korrelationsmatrix gepostet, damit die Person hoffentlich vom Code profitieren kann, um auf N-Dimensionen zu skalieren.
Danke!,
DS
Betreff: JSL-Code zum Generieren einer dynamischen Formelspalte erforderlich, die Spalten aus einer Liste summiertHier ist ein Ansatz. Erstellen Sie zunächst iterativ die Faktoren() und erstellen Sie dann in einem zweiten Schritt den vollständigen Simulator()-Ausdruck einschließlich der ausgewerteten Argumente für die X-Korrelationen().
// 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;
Allerdings scheint die X-Korrelationsmatrix (in den meisten Fällen) ignoriert zu werden. Im Bericht stehen nur Nullen.
Auch wenn Korrelationen manuell im Profiler eingegeben werden und das Skript gespeichert und ausgeführt wird, gehen die Korrelationen verloren. Auch wenn sie im gespeicherten Skript erhalten bleiben. Nicht sicher warum.
Betreff: JSL-Code zum Generieren einer dynamischen Formelspalte erforderlich, die Spalten aus einer Liste summiertHallo @MS ,
Ich habe eine verwandte Frage (daher kein weiterer Beitrag), bei der ich hoffe, dass Ihre Skriptmethode hilfreich sein kann. Es hat mit dem Beitrag zu tun Hier . Was ich jetzt versuche, ist im Wesentlichen, das, was im ursprünglichen Beitrag enthalten war, von einer 4x4-Korrelationsmatrix auf eine beliebige NxN-Matrix zu verallgemeinern, wenn Informationen an den Simulator im Profil „gespeist“ werden.
Aus dem anderen Originalbeitrag gibt es ein Skript, das die NxN-Korrelationsmatrix generieren und aus Ihrer Eingabe eine „Vorhersage“-Spalte (die Summe der anderen N Spalten) generieren kann. Was mir schwer fällt, ist Folgendes: Wenn Sie die Funktion Simulator() aufrufen, müssen Sie Folgendes übergeben:
Simulator(state=0|1, , )
Aus dem anderen Originalbeitrag, der Lösung zur Übergabe der korrekten Liste von Faktoren („tpListY“) und der Korrelationsmatrix („corr.mat“), musste der JSL-Code über die Eval Insert()-Funktion um den zu sendenden Aufruf verfügen Simulator() zum Profiler-Bericht und führen Sie dann eine Eval(Parse())-Operation aus.
Die Herausforderung besteht nun darin, dies korrekt zu verallgemeinern, sodass Sie dies beim Aufruf von Simulator() und beim Definieren der Faktoren für diese ColList tun können.
ColList könnte etwa 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 die richtige Standardabweichung 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 zum Generieren der Korrelationsmatrix (corr_mat) verwendet wurden. Diese Modelltabelle ist diejenige, die die Spalten summiert, um die :Pred-Spalte zu bilden, 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 ihren entsprechenden Mittelwert schreiben zu müssen, würde ich dies gerne automatisierter gestalten, damit eine beliebige Anzahl von Spalten verarbeitet werden kann.
Was wäre ein guter Weg, dies zu erreichen?
Ich habe auch Probleme damit, dass Eval(corr_mat) die Werte der Korrelationsmatrix tatsächlich in die X-Korrelationseinträge eingibt.
Die beigefügte Datentabelle und das Skript sollten helfen, zu verstehen, was ich versuche.
Danke!,
DS
Update, leider habe ich die falsche Datei hinzugefügt, die Datentabelle ist jetzt korrekt.
Betreff: JSL-Code zum Generieren einer dynamischen Formelspalte erforderlich, die Spalten aus einer Liste summiertHallo @MS ,
Das ist eine perfekte Lösung, danke! Mir gefällt, wie schlicht und elegant es ist.
Ich musste meinen Code ein wenig ändern, da es immer noch ein Problem darstellt, wenn die Liste wie folgt strukturiert ist: {"A", "B", "C", ...}. Wenn die Liste jedoch wie {A, B, C, ...} strukturiert ist, wird der Ausdruck einwandfrei ausgewertet. Die beiden Listen werden etwas unterschiedlich generiert und die Zitate bringen Eval() wirklich durcheinander.
Danke!,
DS
Betreff: JSL-Code zum Generieren einer dynamischen Formelspalte erforderlich, die Spalten aus einer Liste summiertDafür gibt es mehrere Möglichkeiten. Ich bevorzuge es, mit EvalExpr() eine Variable für den gewünschten Ausdruck zu erstellen und dann NameExpr() zu verwenden, um den (nicht ausgewerteten) Ausdruck in das Argument Formula() 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 ) ) );