JSL: „Und“-Bedingung zum Datenfilter hinzufügenHallo JMP-Community
Ich habe mich gefragt, ob es eine Möglichkeit gibt, einem Datenfilter in JSL eine „und“-Bedingung hinzuzufügen.
Als Beispiel habe ich einen Datensatz erstellt

Wenn wir ein einfaches Modell über nur den Mittelwert erstellen,
model = Fit Model( Y( :Data ), Run);
Mit einem Datenfilter können wir das Modell auf nur eine Gruppe beschränken
dtf = model << Local Data Filter(Columns(:Group), where(:Group == "A"));

Wenn ich jetzt jedoch einen weiteren Filter hinzufügen möchte, scheinen die einzigen JSL-Optionen, die ich finden konnte („Filter hinzufügen“, „Spalten filtern“ und ähnliches), nur eine „Oder“-Bedingung hinzuzufügen.
dtf << Add Filter(columns(:Outlier), where(:outlier == 0));
dtf << Filter Columns(:Outlier);

Die einzige Möglichkeit scheint zu sein, den Datenfilter zu entfernen und dann einen neuen Filter mit allen Bedingungen hinzuzufügen
model << Remove Local Data Filter;
dtf = model << Local Data Filter(Columns(:Group, :Outlier), where(:Group == "A"), where(Outlier == 0));

Übersehe ich eine Möglichkeit zum Hinzufügen von „Und“-Bedingungen oder ist das einfach nicht möglich?
br.
Kasper Schlosser
Automatisierung und SkriptingBetreff: JSL: „Und“-Bedingung zum Datenfilter hinzufügenErstellen Sie den Filter in JMP und kopieren Sie das Skript
Fit Model(
Y(:Data),
Effects,
Personality("Standard Least Squares"),
Emphasis("Effect Leverage"),
Run(
:Data << {Summary of Fit(1), Analysis of Variance(1), Parameter Estimates(1),
Lack of Fit(0), Plot Actual by Predicted(1), Plot Regression(0),
Plot Residual by Predicted(1), Plot Studentized Residuals(0),
Plot Effect Leverage(1), Plot Residual by Normal Quantiles(0),
Box Cox Y Transformation(0)}
),
Local Data Filter(
Add Filter(
columns(:Group, :Outlier),
Where(:Group == "A"),
Where(:Outlier == 1)
)
)
);
Dies gibt im Allgemeinen eine gute Vorstellung davon, was Sie dann skripten können
dt = Current Data Table();
model = Fit Model(Y(:Data), Run);
dtf = model << Local Data Filter(
Columns(:Group, :Outlier),
Where(:Group == "A"),
Where(:Outlier == 1)
);
Betreff: JSL: „Und“-Bedingung zum Datenfilter hinzufügenJa bzw. der Scripting-Index gibt auch einen Überblick darüber, welche Nachrichten ein Datenfilter akzeptiert (allerdings nicht immer alle).
Beides scheint darauf hinzudeuten, dass es keine Möglichkeit gibt, einem Datenfilter über JSL eine „und“-Bedingung hinzuzufügen.
Dies würde bedeuten, dass die einzige Möglichkeit zum Hinzufügen einer „und“-Bedingung in JSL darin besteht, den Filtercode zu extrahieren, den Code zu ändern und ihn dann zu analysieren und auszuwerten. Dies ist chaotisch und fehleranfällig.
Betreff: JSL: „Und“-Bedingung zum Datenfilter hinzufügenDenken Sie unbedingt daran, diese Einschränkung zur JMP-Wunschliste hinzuzufügen.
Außerdem habe ich eine andere Meinung zu Ihrem erwähnten Parsen und Auswerten. Es beruhigt mich, dass JMP diese grundlegende Funktion bietet, die mir in den meisten Fällen einen Lösungsweg aufzeigt, wenn ich auf eine Einschränkung stoße.
Betreff: JSL: „Und“-Bedingung zum Datenfilter hinzufügenWenn Sie Filtern neue Spalten hinzufügen, erstellen Sie grundsätzlich neue Filtergruppen und diese sind standardmäßig ODER-getrennt. Abhängig vom Anwendungsfall können Sie manchmal Gruppiert nach Und verwenden.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cities.jmp");
obj = dt << Data Filter(
Add Filter(columns(:Region, :POP), Where(:Region == {"C", "N"})),
Mode(Select(0), Show(0), Include(1))
);
obj << Add Filter Columns(:State);
obj << Grouped by AND(1);
Auf der Benutzeroberfläche haben wir die Option „Zur ausgewählten Gruppe hinzufügen“, wenn Sie UND drücken, aber wir haben dafür keine einfache Skriptoption.
Betreff: JSL: „Und“-Bedingung zum Datenfilter hinzufügen
@jthi schrieb:
aber wir haben dafür keine einfache Skriptoption.
Ich glaube, wir haben:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
gb = dt << Graph builder();
dtf = gb << Local Data Filter(
Columns(:sex),
Where(:sex == "F")
);
dtf << (Filter Column(:age) << Where(:age == 14));
Betreff: JSL: „Und“-Bedingung zum Datenfilter hinzufügenDas scheint zu funktionieren
Ein kurzer Test zeigt, dass diese Methode den ersten Filter beeinflusst. Wenn wir also zwei „oder“-Bedingungen haben, können wir nur die erste beeinflussen.
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
gb = dt << Graph builder();
dtf = gb << Local Data Filter(
Columns(:sex),
Where(:sex == "F")
);
// adds or condition
dtf << Add Filter(Columns(:sex), Where(:sex == "M"))
// Only affects the female filter
dtf << (Filter Column(:age) << Where(:age == 14));
aber für meinen Anwendungsfall ist es perfekt.
Betreff: JSL: „Und“-Bedingung zum Datenfilter hinzufügenSchöner Fund!
Dies scheint nur zu funktionieren, wenn Sie auch die Where-Nachricht mit der Filterspalte senden. Dies könnte unbeabsichtigt/ein Fehler oder so etwas sein, aber wir sind froh, dass wir es haben (es könnte einfach jederzeit kaputtgehen, wenn JMP aktualisiert wird).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cities.jmp");
obj = dt << Data Filter(
Add Filter(
columns(:Region, :POP),
Where(:Region == {"C", "N"})
),
Mode(Select(0), Show(0), Include(1))
);
obj << Filter Column(:State); // creates OR group
obj << (Filter Column(:State) << Where()); // Adds AND filter to first filter group
obj << (Filter Column(:CO) << Where()); // Adds AND filter to first filter group
Wahrscheinlich wäre es viel besser, wenn wir einfach UND-Filter innerhalb bestehender Gruppen hinzufügen könnten und nicht nur neue Filter-ODER-Gruppen.
@Craige_Hales, irgendeine Idee, warum das passiert / irgendeine Idee, wen man von JMPs Seite aus taggen sollte?
Betreff: JSL: „Und“-Bedingung zum Datenfilter hinzufügenWie @jthi bereits erwähnt hat, bestehen Filter aus „Gruppen“ und „Elementen“, und die Filtergruppe wird JSL nicht direkt als skriptfähiges Objekt zur Verfügung gestellt. Die Syntax df << (Filter Column(:col) << Msg()) war die ursprüngliche Methode, Nachrichten an eine Gruppe „weiterzuleiten“, obwohl sie nicht gut dokumentiert ist. Ich möchte darauf hinweisen, dass diese Syntax ein ganz anderer Weg ist als die einfache Nachricht df << Filter Column(:col), die im Scripting Index dokumentiert ist . Die frühere Syntax verfügt nicht über integrierte JSL-Regeln für die Verarbeitung, wird jedoch in anderen Objekten wie Bivariate auf ähnliche Weise verwendet. Im Wesentlichen ist die an den Filter gesendete Nachricht ein Ausdruck, und die unterstützte Syntax ist auf den Filter zugeschnitten.
Noch etwas zur speziellen Syntax für die Weiterleitung der Nachrichten. Es gibt ein optionales zweites Argument, um den Index der Filtergruppe anzugeben, die die Nachricht erhalten soll. Dies kann wichtig sein, wenn Sie mehrere Gruppen haben, die möglicherweise sogar dieselben Spalten enthalten. Ohne dieses Argument wird der Befehl an die erste passende Spalte gesendet oder der ersten Gruppe hinzugefügt.
Möglicherweise stellen Sie auch fest, dass die an das Filterelement gesendete Msg() nur eine einfache Nachricht sein kann. Die Verarbeitung hier unterstützt nicht das Senden einer Liste von zu verarbeitenden Befehlen. Dies liegt wiederum daran, dass das innere << eine benutzerdefinierte Ausführung ist und nicht direkt die Kern-JSL-Regeln verwendet.
dt = Open( "$SAMPLE_DATA/Cities.jmp" );
df = dt << Data Filter(
Location( {1001, 218} ),
Add Filter( columns( :POP ), Where( :POP >= 4461 ) ),
Add Filter( columns( :OZONE ), Where( :OZONE <= 0.12581 ) )
);
// add a filter item to the first group
df << (Filter Column(:Region, 1) << Check Box Display);
// add a filter item to the second group
df << (Filter Column(:NO, 2) << Where(:NO <= 0.05));