データ列からサブセットの平均を引く式は?指定した条件に一致する行のみを使用するデータテーブルのサブセットを取得し、それらの行の平均を列から減算する方法を探しています。
たとえば、Big Class データ セットを使用して、次のような新しい列を作成したいとします。 「この生徒と同性の平均的な14歳との身長差。」
これを行う方法を知るには、「表」→「概要」→「統計: 平均(身長)、グループ: 性別、サブグループ: 年齢」を使用して 2 番目の表を追加します。 次に、「表」→「更新: Big Class By (sex)」、「列の一致: sex = sex」を実行すると、Mean(height, [age]) の列がいくつか追加されます。 次に、「デルタ身長 vs 14 歳の同性」という新しい列、つまり :height - :Mean(height, 14) を作成できます。
私の質問: 追加のテーブルと追加の列 (例: "Mean(height, 14)") を作成せずに処理する方法はありますか? Col Mean(x, byVar) はこの機能の提供に近づいているようですが、別のグループを選択する機能が欠けています。たとえば、:height - Col Mean(:height, :age, :sex) を使用して、生徒 X と、自分の性別および身長の平均的な生徒との差分を見つけることができますが、指定する方法があるかどうかはわかりません。 in Col つまり、その行に関連付けられた年齢の値を使用するのではなく、age=14 の行のみを考慮したいということです。
私はこの種の正規化を頻繁に行うので、それをより速く簡単にするために何かあれば、非常に感謝されます。
データのブレンディングとクリーンアップRe: データ列からサブセットの平均を引く式は何ですか?美しい! ありがとう!!!
Re: データ列からサブセットの平均を引く式は何ですか?こんにちは@MarkJSchwab 、
はい、多くの場合、これを条件文で囲むことがいかに理想的でないことがわかります。 ここに変更があります@brady_bradyうまくいくはずの解決策(表を添付):

testVal = :sex;
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 & :sex == testVal )] );
この場合、現在の行の :sex の値を取得し、それを変数 testVal に保存します。 次に、センタリング関数を評価するときに、その値を get rows where() 関数で使用してテストできます。
以下は、この Get Rows Where() 関数によって選択された行のみの列を含むテーブルです。

ご覧のとおり、すべての行でサブセットとして年齢 14 が使用されていますが、性別のサブセットは現在の行の性別の値によって決まります。 さまざまなレベルの複雑さに簡単に適応できる必要があります。
@ジュリアン
Re: データ列からサブセットの平均を引く式は何ですか?男性と女性の両方を処理できるように式を拡張するだけです
If( :sex == "F",
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 & :sex == "F" )] ),
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 & :sex == "M" )] )
)
Re: データ列からサブセットの平均を引く式は何ですか?こんにちは@ジュリアン助けてくれてありがとう!
最後にもう 1 つ注意してください。理想的には、14 歳の少女の平均年齢を少女から減算し、14 歳の少年の平均年齢を少年から減算したいと考えています。 (この例では、男の子と女の子の両方から 14 歳の女の子の年齢を差し引いています。)
(この特定のケースでは、M/F だけを使用する場合、条件文を使用して、「If :sex == 'F' then use this Formula, if :sex == 'M' then the式を次のように変更するのが簡単だと思います」 {mean(:height[(:height << get datatable) << get rows where( :age == 14 & :sex == "M" )])}" と言いますが、より一般的なユースケースでは多数のグループとネストされた条件文は扱いにくくなります。)
これを達成する簡単な方法はありますか?
Re: データ列からサブセットの平均を引く式は何ですか?こんにちは@MarkJSchwab 、
<
jmpウィザードによる解決策は次のとおりです@brady_brady :
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 )] )

後で使用する価値があると思われるメソッドがいくつかあるため、少し時間をとってこの式を解き明かす価値があります。
(:height << get datatable) << get rows where( :age == 14 )
:age==14 である行エントリの行列を返します。 重要なのは、get rows where() 関数を変更して、別の変数を含めた 2 番目の問い合わせを含め、希望する検索に一致させることができることです。 例えば:
(:height << get datatable) << get rows where( :age == 14 & :sex == "F"

条件に一致する行の行列ができたので、Brady はこの行列を使用して :height を添字付けします。
height[(:height << get datatable) << get rows where( :age == 14 & :sex == "F" )]

これにより、これらの各行の :height の値の行列が返されます。この場合は、14 歳の女子学生の身長です: [61, 62, 65, 63, 62]
最後に、Mean() 関数がこの行列の周囲にラップされ、中心の変数を計算するために必要な平均を返します。
mean(:height[(:height << get datatable) << get rows where( :age == 14 & :sex == "F" )])

このソリューションはより柔軟で、欠落データに耐性があり、jmp の以前のバージョンでも機能するため、総合するとより良いソリューションだと思います。 ありがとう、 @brady_brady !
@ジュリアン
Re: データ列からサブセットの平均を引く式は何ですか?こんにちは@ジュリアン、ご提案ありがとうございます。 残念ながら、その正確な数式を貼り付けると、
Col Mean( :height, <<FREQ></FREQ>
私の Big Class に入力すると、表示されている正しい値 64.166 ではなく、62.55 (つまり、age=14 を選択していない全体の Col 平均) が返されます。
添付ファイルをダウンロードすることもできます。適切な値が「年齢 ==14 の平均を基準に中心化」列に表示されます。 しかし、まったく同じ数式でそのテーブルに新しい列を作成すると、異なる値が返されます([身長] - [14歳の平均身長]が正しく表示されるのではなく、[身長] - [全体の平均身長]が表示されます)。
JMP Pro 14.3.0を使用しています。 私の出力をあなたの出力と一致させる方法について何かアイデアはありますか?
そしてもう 1 つの質問です。シートに :sex の byVar を追加すると (合計式 ":height - (Col Mean( :height, :sex, <Re: データ列からサブセットの平均を引く式は何ですか?
こんにちは@MarkJSchwab 、
Col Mean() を使用してこれを行う簡単な方法がありますが、実際に見てみるまではわかりません。 Col Mean() は、Frequency 列の引数を受け取ります。

通常、これは別の列を使用して重み付けする必要がある場合に使用されます。 しかし、あなたの例では、Age==14 の値を 1 として重み付けし、他のすべての値を 0 として重み付けできたらどうなるでしょうか? これにより、年齢 == 14 の個人のみの平均が得られます。 これは次の式で直接行うことができます。
Col Mean( :height, <<FREQ></FREQ>

これは以下を返します:

さて、あなたの特定の質問について、身長からのこの特定の平均を中心として、それを通常の方法で式にラップできます。
:height - (Col Mean( :height, <<FREQ></FREQ>


これがお役に立てば幸いです!
@ジュリアン
Re: データ列からサブセットの平均を引く式は何ですか?こんにちは、MarkJSchwab!
もちろん、あなたの望むことを実現する方法はあります。JSL があなたを自由にします!
私は、スクリプトを作成するために主に JSL の機能を使用する簡単なスクリプトを作成しました。それを試してみてください:
// Title: Bigclass Normalization Script for JMP User Community discussion
// Purpose: Demonstrate how to write a very basic script to do "normalizations"
Names Default To Here( 1 );
Bigclass_dt = Open( "$SAMPLE_DATA\Big Class.jmp" );
BigclassSummary_dt = bigclass_dt << Summary( Group( :age, :sex ), Mean( :height ) );
BigclassSummary_dt << Select Where( :Age != 14 ) << Delete Rows;
Bigclass_dt << Join(
With( BigclassSummary_dt ),
Select( :name, :age, :sex, :height ),
SelectWith( :Name( "Mean(height)" ) ),
By Matching Columns( :sex = :sex ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 ),
Output Table( "NormedBigclass by AgeGender" )
);
BigclassJoin_dt = Data Table( "NormedBigclass by AgeGender" ) << New Column( "Normalized",
numeric,
continuous,
Formula( :Name( "height" ) - :Name( "Mean(height)" ) ),
evalFormula
);
Close( BigclassSummary_dt, NoSave );
別途集計表を作成して閉じましたが、そのようにする必要はありません。
もちろん、このようなスクリプトを記述するためのより洗練された方法はあります。特に、すべての「where」句がハードコーディングされており、データ テーブルが大きい場合はこのスクリプトで問題が発生する可能性がありますが、それでも、JSLそれが生産性への道になります。JSL を学習するための素晴らしいリソースがいくつかあります。
幸運を!