JSL データ フィルターに「And」条件を追加するこんにちは、JMPコミュニティの皆様
JSL のデータ フィルターに「and」条件を追加する方法があるかどうか知りたいです。
例としてデータセットを作成した

平均値のみの単純なモデルを作ると、
model = Fit Model( Y( :Data ), Run);
データフィルターを使用してモデルを1つのグループだけに制限することができます
dtf = model << Local Data Filter(Columns(:Group), where(:Group == "A"));

ただし、別のフィルターを追加したい場合、見つけることができる唯一の JSL オプション (「フィルターの追加」、「フィルター列」など) は、「または」条件としてのみ追加されるようです。
dtf << Add Filter(columns(:Outlier), where(:outlier == 0));
dtf << Filter Columns(:Outlier);

唯一の選択肢は、データフィルターを削除してから、すべての条件を含む新しいフィルターを追加することのようです。
model << Remove Local Data Filter;
dtf = model << Local Data Filter(Columns(:Group, :Outlier), where(:Group == "A"), where(Outlier == 0));

「And」条件を追加する方法がわからないのでしょうか、それともこれは不可能なのでしょうか。
br.
カスパー・シュロッサー
自動化とスクリプトRe: JSL データ フィルターに「And」条件を追加するJMPでフィルターを作成し、スクリプトをコピーします
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)
)
)
);
これは、スクリプトを記述する上で良いアイデアを与えてくれる。
dt = Current Data Table();
model = Fit Model(Y(:Data), Run);
dtf = model << Local Data Filter(
Columns(:Group, :Outlier),
Where(:Group == "A"),
Where(:Outlier == 1)
);
Re: JSL データ フィルターに「And」条件を追加するはい、またはスクリプト インデックスには、データ フィルターが受け入れるメッセージの概要も表示されます (ただし、すべて受け入れるとは限りません)。
これらは両方とも、jsl を介してデータ フィルターに「and」条件を追加する方法はないことを示しているようです。
つまり、jsl で「and」条件を追加する唯一の方法は、フィルター コードを抽出し、コードを変更してから解析して評価することです。これは面倒で、エラーが発生しやすくなります。
Re: JSL データ フィルターに「And」条件を追加するこの公開された制限を JMP ウィッシュ リストに必ず追加してください。
また、あなたがおっしゃった解析と評価については、私は別の見方をしていると思います。制限に直面した場合でも、JMP がこの基本レベルの機能を提供し、ほとんどの場合に解決への道筋を示してくれるので安心です。
Re: JSL データ フィルターに「And」条件を追加するフィルターに新しい列を追加すると、基本的に新しいフィルターグループが作成され、デフォルトではORで区切られます。ユースケースによっては、グループ化とANDを使用できる場合があります。
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);
UI では、AND を押すと「選択したグループに追加」できますが、そのための簡単なスクリプト オプションはありません。
Re: JSL データ フィルターに「And」条件を追加する
@jthi は次のように書きました:
しかし、そのための簡単なスクリプト オプションはありません。
次のようなものがあると思います:
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));
Re: JSL データ フィルターに「And」条件を追加するこれは効果があるようだ
簡単なテストにより、このメソッドは最初のフィルターに影響することがわかります。つまり、2 つの「または」条件がある場合、最初のフィルターにのみ影響します。
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));
しかし、私の使用例ではこれが最適です。
Re: JSL データ フィルターに「And」条件を追加する素晴らしい発見です!
これは、フィルター列を含む where メッセージも送信する場合にのみ機能するようです。これは意図的でない、またはバグか何かかもしれませんが、幸運なことに、これがあります (JMP が更新されるといつでも壊れる可能性があります)。
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
おそらく、新しいフィルター OR グループだけでなく、既存のグループ内に AND フィルターを追加できれば、はるかに良いでしょう。
@Craige_Halesなぜこのようなことが起きているのか、また JMP 側から誰をタグ付けすればよいのか、何かご存知ですか?
Re: JSL データ フィルターに「And」条件を追加する@jthi が以前指摘したように、フィルターは「グループ」と「項目」で構成されており、フィルター グループはスクリプト可能なオブジェクトとして JSL に直接公開されていません。構文df << (Filter Column(:col) << Msg()) は、メッセージをグループに「転送」する元の方法でしたが、十分に文書化されていません。この構文は、スクリプト インデックスで文書化されている単純なメッセージ df << Filter Column(:col) とはまったく異なるパスであることを指摘しておきます。前者の構文には、処理用の組み込み JSL ルールはありませんが、Bivariate などの他のオブジェクトで同様の方法で使用されます。基本的に、フィルターに送信されるメッセージは式であり、サポートされる構文はフィルターごとに異なります。
メッセージを転送するための特別な構文についてもう少し説明します。オプションの 2 番目の引数には、メッセージを受信するフィルター グループのインデックスを指定します。これは、同じ列を含む可能性のある複数のグループがある場合に重要になります。これがない場合、コマンドは最初に一致する列に送信されるか、最初のグループに追加されます。
また、フィルター項目に送信されるMsg() は単純なメッセージのみであることがわかります。ここでの処理では、処理するコマンドのリストの送信はサポートされていません。これも、内部の<<がカスタム実行であり、コア JSL ルールを直接使用していないことが原因です。
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));