データ列からサブセットの平均を引く式?指定された条件に一致する行のみを使用するデータテーブルのサブセットを取得し、それらの行の平均を列から減算する方法を探しています。
たとえば、ビッグクラスのデータセットを使用して、次のような新しい列を作成するとします。 「この学生と同じ性別の平均的な14歳の身長の違い。」
これを行う方法を知る方法は、[テーブル]-> [要約]-> [統計:平均(高さ)]、[グループ:性別]、[サブグループ:年齢]を使用して、2番目のテーブルを追加することです。 次に、Table-> Update:Big Class By(sex)、Match columns:sex = sexを実行できます。これにより、Mean(height、[age])にいくつかの列が追加されます。 次に、「Delta height vs 14yo of same sex」という新しい列を作成できます。これは、:height-:Mean(height、14)です。
私の質問:追加のテーブルと追加の列(「Mean(height、14)」など)を作成せずに処理する方法はありますか? Col Mean(x、byVar)はこの機能を提供するのに近いようですが、別のグループを選択する機能がありません。たとえば、:height-Col Mean(:height、:age、:sex)を使用して、学生Xと自分の性別と身長の平均的な学生との間のデルタを見つけることができますが、指定する方法があるかどうかはわかりませんCol Meanでは、その行に関連付けられた年齢値を使用するのではなく、age = 14の行のみを検討したいと考えています。
私はこのタイプの正規化を非常に頻繁に行うので、それをより速く、より簡単にするために何かが非常にありがたいです!
データ表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を学ぶための素晴らしいリソースがいくつかあります!
がんばろう!
Re:データ列からサブセットの平均を引く式?こんにちは@MarkJSchwab 、
Col Mean()を使用してこれを行う簡単な方法がありますが、これは表示されるまでわかりません。 Col Mean()はFrequency列の引数を取ります:

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

これは戻ります:

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


これがお役に立てば幸いです。
@ジュリアン
Re:データ列からサブセットの平均を引く式?こんにちは@ジュリアン、提案をありがとう。 残念ながら、その正確な式を貼り付けると
Col Mean( :height, <<FREQ></FREQ>
私のビッグクラスでは、64.166の正しい値ではなく、62.55(つまり、age = 14を選択しない場合の全体的なColMean)が返されます。
添付ファイルをダウンロードすることもできます。適切な値は、「年齢の平均値を中心に== 14」の列に表示されます。 しかし、まったく同じ式でそのテーブルに新しい列を作成すると、異なる値が返されます([height]-[avg height of 14yos]を正しく表示する代わりに、[height]-[全体の平均高さ]を表示します)。
JMP Pro14.3.0を使用しています。 自分の出力をあなたの出力に一致させる方法について何かアイデアはありますか?
そしてもう1つ質問があります。シートに、:sexのbyVarを追加すると(合計式 ":height-(Col Mean(:height、:sex、<< Freq(:age == 14)))"がそれを行います。男の子から平均14歳の男の子の身長を引き、女の子から平均14歳の女の子の身長を引きますか?
Re:データ列からサブセットの平均を引く式?こんにちは@MarkJSchwab 、
<< FreqがJMP15のオプションの引数として追加されたように見えるため、以前のバージョンのJMPでは、別のことを行う必要があります。
これが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:データ列からサブセットの平均を引く式?こんにちは@ジュリアン助けてくれてありがとう!
最後のしわ:理想的には、女の子から14歳の女の子の平均年齢を差し引き、男の子から14歳の男の子の平均年齢を差し引いてほしい。 (あなたの例では、男の子と女の子の両方から14歳の女の子の年齢を引いています。)
(この特定のケースでは、M / Fだけで条件を使用するのは簡単であり、「:sex == 'F'の場合はこの式を使用し、:sex == 'M'の場合は式を次のように変更しますsay {mean(:height [(:height << get datatable)<< get rows where(:age == 14&:sex == "M")])} "しかし、私のより一般的なユースケースでは、多数のグループとネストされた条件は扱いにくくなります。)
これを達成するための簡単な方法はありますか?
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:データ列からサブセットの平均を引く式?こんにちは@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歳がサブセットとして使用されていますが、どの性別サブセットが現在の性別の行値によって決定されます。 さまざまなレベルの複雑さに簡単に適応させる必要があります。
@ジュリアン