JSLを使用してPCAプラットフォームからT²を保存する方法(またはその計算方法)こんにちは、みんな、
<< Save DModX(n)を呼び出すことでT²を保存する方法のように、いくつかのJSLコードを機能させて主成分分析プラットフォームからT²を保存しようとしています。ここで、nは使用するPCの数です。
<< Save T Squareの呼び出しは多変量管理図で機能することは知っていますが、PCAまたは多変量プラットフォームでは機能しないようです。 PCAプラットフォームでは、計算に使用するPCの数を実際に指定できるため、PCAプラットフォームを使用してT²式を生成する必要があります。これは、マハラノビス距離の2乗のような通常のT²統計ではありません。 レポートウィンドウに送信された<
1.スクリプトを使用して、使用するPCの数を指定し、T²式をデータテーブルに保存することはできますか? これまでのところ、私はこれに対するオプションを見つけていません。
2.そうでない場合、それを最もよく計算する方法は? 私は計算が定義されていることを知っていますここ、しかし、赤いホットボタンを使用してデータテーブルに保存される式は少し異なっているようです。
保存された式(手動保存)によると、T²= Vec Quadratic(S、X)= Diag(X * S * X`)、ここでXはデータの標準化されたベクトル、X`はその転置、Sは逆共分散です。マトリックス。 これは標準のT²、マハラノビス距離の2乗です。
しかし、によるとドキュメンテーションPCAプラットフォームからのi番目のT²値の場合、T_i²= [X_ci * P_a] * L-1 * [P`_a * X`_ci]、ここでX_ciはi番目の標準化された観測値、P_aは最初の「a」を含む行列です。固有値(つまり、すべてではない可能性があります)であり、L-1は最初のA固有値を含む対角行列です。 原則として、これはVec Quadratic(L-1、[X_ci * P_a])と等しくなければなりません。ただし、逆共分散行列Sを使用する代わりに、最初の「a」PCの逆アクサ固有値行列とXを使用します。 X_ci * P_a]になりました。 またはそう、それが表示されます。
JMPがすでにこれらすべてを計算している場合、n主成分T²を保存するためにこの問題を再設計することはかなり複雑で不必要に思えます。 保存プロセスを自動化したいのですが、オプション1を機能させることができないようです。つまり、オプション2が次善の策です。 それでも、数式を含む新しい列を作成するために数式を復元しようとすると、少し大変なようです。
多変量プラットフォームから保存されたT²式(およびT²=Mahal.Dist.²)を示すIris.jmpファイルの変更されたデータテーブルを添付し、次にすべてを使用して式が決定されるPCAプラットフォームからのT²を添付します4台のPC、次にPCのみ。 式を見るとわかるように、Vec Quadratic(S、X)のS行列は、2台のPCと4台のPCを使用して計算されたT²で異なります。
異なる数のPCでT²を取得するスクリプトを作成する方法や、列の数式を適切に定式化してT²を計算する方法について誰かが洞察を持っている場合は、その洞察に感謝します。
フィードバックと考えをありがとう!、
DS
分析データ表スクリプティングRe:JSLを使用してPCAプラットフォームからT²を保存する方法(またはそれを計算する方法)Tスクエアを保存する機能は、管理図プラットフォームからのみ利用できるため、現時点では最初のアプローチは不可能です。
ここJMPコミュニティでウィッシュリストを検索して、誰かがすでにそれを要求しているかどうかを確認することができます。 もしそうなら、それに投票してください(kudo)。 そうでない場合は、新しいリクエストを入力してください。
Re:JSLを使用してPCAプラットフォームからT²を保存する方法(またはそれを計算する方法)T二乗の計算方法については、添付のスクリプトを参照してください。 これらのプラットフォームのJMP開発者によって提供されました。
Re:JSLを使用してPCAプラットフォームからT²を保存する方法(またはそれを計算する方法)やあ@markbailey 、
プラットフォームの開発者からのフィードバックとJSLを含めていただきありがとうございます。 実は、私が求めていた解決策(オプション1)はJSLで実際に可能!! そして、とても簡単です。 私はあなたが送ったコードでそれを見る必要がありました。重要な部分はここにあります:
Outlier Analysis( 1, Number of Components( N ), Save T Square ),
[コンポーネント数]入力の「N」を変更し、[Tスクエアの保存]を追加すると、定義したNコンポーネントのデータテーブルにT²式が実際に保存されます。 Outlier Analysis()呼び出し内で、「SaveTSquare」にリクエストを送信できることを知りませんでした。 N個のコンポーネントと一緒にそれを行うと、私が望んでいたことを正確に実行できます。助けてくれてありがとう! ウィッシュリストなどを入力する必要はありません。JMPはすでにそれを実行できます。
2、3、および4台のPCのT²値を計算するスクリプトを含むIris_mod.jmpデータテーブルを添付しています。 必要になったときにT²値を効率的に計算する方法を知っておくとよいでしょう。 計算を行うために今書いているコードはかなり長くて面倒でしたが、すべてをまっすぐにすればうまくいくと思います。 しかし、私は上記の解決策を好みます-それはコードのほんの数文字です!
送信したコードを詳しく調べてみると、PCAプラットフォームから計算されたT²とコード内の「手動」計算が同じ数のPCで異なることに気付きました。 理由について何か手がかりはありますか? 「手動」計算が「間違っている」か、PCAの計算とは異なる方法で実行されているか、または他の何かが起こっています。 また、同じ数のPCのT²結果がPCAプラットフォームおよび「手動」計算とは異なることを示す別のデータテーブルIris_mod_different_T2.jmpを添付しています。 追って通知があるまで、私はPCAプラットフォームのT²式を使用することを好みます。 「手動」計算に何か違いがあるのか、なぜ値が同じでないのか知りたいのですが。
再度、感謝します!、
DS
PS 興味のある方は、私が取り組んできたコードを以下に示します。 これは、ユーザーがPCAを実行する列を選択し、DModXおよびT²式を抽出するために使用するPCの数を動的に選択できるようにするインタラクティブなコードです。 他の分析が必要な場合は、選択した数のPCをデータテーブルに保存することもできます。
おかげさまで@jthi Plot Col Box()の<< Lower()やTable Box()表示ボックスの<< Set Selectable Rows(1)など、意図したとおりに機能させるために、このコードの他のいくつかの側面についてサポートします。 私が理解できなかった唯一のことは、Table Box()の行の選択を1つに制限する方法です。 Col List Box()環境では、Max Items(1)を1に設定できます。これにより、ユーザーは一度に1つのアイテムしか選択できなくなります。 以下のコードでそれを行う方法についてのヒントは大歓迎です。 現在、ユーザーがTable Box()で複数の行を選択した場合、最大PC番号が必要になります。
Names Default To Here( 1 );
//Clear Symbols();
//Function to choose the data table to model
choose_data_table = Function( {},
list = {};
For( i = 1, i <= N Table(), i++,
list[i] = Data Table( i ) << get name
);
win = New Window( "Select a data table",
<<MODAL></MODAL> PCRptOutlier << Save DModX( N_PCs );
If( savePCs == 1,
PCRptOutlier << Save Principal Components( N_PCs )
);
PCRptOutlier<<CLOSEWINDOW> 0, Try( choose_data_table, Throw( "No data found" ) )
);
ModMetrics;
);
Firstwin;</CLOSEWINDOW>Re:JSLを使用してPCAプラットフォームからT²を保存する方法(または計算方法)いくつかの「単純な」方法で1つの列のみを強制的に選択する方法がわかりません。 ユーザーが複数の行を選択している場合は、テーブルボックスを「強制的に」更新できます。 少なくとも、どの行が分析されるかがもう少し明確になります。
これは常に最初に選択された行を使用しますが、ある列から最大値を持つ行を使用するように変更できます。
Names Default To Here(1);
New Window("Mountains",
tb = Table Box(
String Col Box("Mountain", {"K2", "Delphi", "Kilimanjaro", "Grand Teton"}),
Number Col Box("Elevation (meters)", {8611, 681, 5895, 4199}),
Plot Col Box("", {8611, 681, 5895, 4199})
)
);
tb << Set Selectable Rows();
tb << set row change function(
Function({this}, {selRows},
selRows = this << get selected rows;
If(N Items(selRows) > 1,
this << Set Selected Rows(Matrix(selRows[1]));
);
Print(this << get selected rows);
)
);