Wie man JSL verwendet, um T² von der PCA-Plattform zu sparen (oder wie man es berechnet)Hallo zusammen,
Ich versuche, etwas JSL-Code zum Speichern von T² von der Principal Component-Plattform zu erhalten, wie Sie dies tun können, indem Sie <
Ich weiß, dass der Aufruf << Save T Square mit multivariaten Regelkarten funktioniert, aber er scheint nicht mit den PCA- oder Multivariate-Plattformen zu funktionieren. Ich muss die PCA-Plattform verwenden, um die T²-Formel zu generieren, da Sie in der PCA-Plattform tatsächlich die Anzahl der PCs angeben können, die in der Berechnung verwendet werden sollen. Auch der an das Berichtsfenster gesendete Aufruf << T²(1, Save T Square) funktioniert nicht.
1. Ist es möglich, Skripte zu verwenden, um die Anzahl der zu verwendenden PCs anzugeben und die T²-Formel in der Datentabelle zu speichern? Bisher habe ich dafür keine Möglichkeit gefunden.
2. Wenn nicht, wie berechnet man es am besten? Ich weiß, die Berechnung ist definiert Hier , aber die Formel, die mit dem roten Hot-Button in der Datentabelle gespeichert wird, sieht etwas anders aus.
Gemäß der gespeicherten Formel (manuelles Speichern) T² = Vec Quadratisch(S, X)= Diag(X*S*X`), wobei X der standardisierte Datenvektor, X` seine Transponierte und S die inverse Kovarianz ist Matrix. Dies ist das Standard-T², das Quadrat der Mahalanobis-Distanz.
Allerdings nach den Dokumentation für den i-ten T²-Wert der PCA-Plattform, T_i² = [X_ci*P_a]*L-1*[P`_a*X`_ci], wobei X_ci die i-te standardisierte Beobachtung ist, P_a eine Matrix mit dem ersten "a" Eigenwerte (dh möglicherweise nicht alle) und L-1 ist eine Diagonalmatrix, die die ersten A-Eigenwerte enthält. Im Prinzip sollte dies gleich Vec Quadratic(L-1, [X_ci*P_a]) sein, außer dass anstelle der inversen Kovarianzmatrix S die inverse axa-Eigenwertmatrix der ersten "a" PCs und X . verwendet wird ist jetzt X_ci*P_a]. So oder so würde es erscheinen.
Es erscheint ziemlich kompliziert und unnötig, dieses Problem neu zu entwickeln, um die n-Hauptkomponente T² zu sparen, wenn JMP dies alles bereits für Sie berechnet. Ich möchte nur den Speichervorgang automatisieren, aber ich kann Option 1 nicht zum Laufen bringen, was bedeutet, dass Option 2 die nächstbeste Option ist. Selbst dann erscheint der Versuch, die Formel wiederherzustellen, um eine neue Spalte mit einer Formel zu erstellen, etwas viel.
Ich hänge eine modifizierte Datentabelle der Datei Iris.jmp an, die die gespeicherten T²-Formeln von der multivariaten Plattform zeigt (und wie T² = Mahal.Dist.²), und dann T² von der PCA-Plattform, wo die Formel mit all bestimmt wird 4 PCs und dann nur noch PCs. Wie Sie anhand der Formeln sehen können, unterscheidet sich die S-Matrix in der Vec Quadratic (S,X) für die T²s, die mit 2 PCs im Vergleich zu 4 PCs berechnet wurden.
Wenn jemand einen Einblick hat, wie man den T² mit einer anderen Anzahl von PCs skripten kann oder wie man die Spaltenformel zur Berechnung des T² richtig formuliert, wäre ich für diesen Einblick dankbar.
Danke für dein Feedback und deine Gedanken!,
DS
AnalytikDatentabelleSkriptingBetreff: Wie man JSL verwendet, um T² von der PCA-Plattform zu sparen (oder wie man es berechnet)Die Möglichkeit zum Speichern von T-Quadrat ist nur über die Kontrollkartenplattform verfügbar, daher ist Ihr erster Ansatz derzeit nicht möglich.
Sie können die Wunschliste hier in der JMP-Community durchsuchen, um zu sehen, ob bereits jemand danach gefragt hat. Wenn ja, stimmen Sie dafür (Kudo). Wenn nicht, geben Sie eine neue Anfrage ein.
Betreff: Wie man JSL verwendet, um T² von der PCA-Plattform zu sparen (oder wie man es berechnet)Bitte beachten Sie das beigefügte Skript, um das T-Quadrat zu berechnen. Es wurde vom JMP-Entwickler dieser Plattformen bereitgestellt.
Betreff: Wie man JSL verwendet, um T² von der PCA-Plattform zu sparen (oder wie man es berechnet)Hi @markbailey ,
Vielen Dank für Ihr Feedback und die Einbeziehung der JSL vom Entwickler der Plattform. Nun, wie sich herausstellt, ist die Lösung für das, wonach ich suchte (Option 1) ist mit JSL eigentlich möglich!! Und auch so viel einfacher. Ich musste es nur in dem Code sehen, den Sie gesendet haben.Der kritische Teil ist hier:
Outlier Analysis( 1, Number of Components( N ), Save T Square ),
Durch Ändern von "N" in der Eingabe "Anzahl der Komponenten" und Hinzufügen des T-Quadrats speichern wird die T²-Formel tatsächlich in der Datentabelle für die von Ihnen definierten N-Komponenten gespeichert. Ich wusste nicht, dass Sie beim Aufruf von Outlier Analysis() die Anfrage an "Save T Square" senden können. Das zusammen mit den N-Komponenten macht genau das, was ich mir erhofft hatte, danke für die Hilfe! Sie müssen keine Wunschliste oder ähnliches erstellen, JMP kann dies bereits für Sie tun!
Ich hänge die Datentabelle Iris_mod.jmp mit Skripten an, die den T²-Wert für 2, 3 und 4 PCs berechnen. Es ist gut zu wissen, wie man den T²-Wert effizient berechnet, sollte ich es jemals brauchen. Der Code, den ich gerade schrieb, um die Berechnung durchzuführen, war ziemlich lang und umständlich, obwohl ich glaube, dass es funktioniert hätte, wenn ich alles in Ordnung gebracht hätte. Ich bevorzuge jedoch die obige Lösung - es sind nur ein paar zusätzliche Codezeichen!
Bei genauerer Betrachtung des von Ihnen gesendeten Codes ist mir aufgefallen, dass die aus der PCA-Plattform berechnete T² und die "manuelle" Berechnung im Code bei gleicher Anzahl von PCs unterschiedlich sind. Irgendeine Ahnung warum? Entweder ist die "manuelle" Berechnung "falsch" oder wird anders ausgeführt als die PCA, oder es passiert etwas anderes. Ich hänge auch eine weitere Datentabelle an, Iris_mod_different_T2.jmp, die zeigt, dass sich die T²-Ergebnisse für die gleiche Anzahl von PCs von der PCA-Plattform und der "manuellen" Berechnung unterscheiden. Ich verwende bis auf Weiteres lieber die T²-Formel der PCA-Plattform. Ich würde gerne wissen, ob an der "manuellen" Berechnung etwas anders ist und warum die Werte nicht gleich sind.
Danke noch einmal!,
DS
PS Wenn jemand interessiert ist, der Code, an dem ich gearbeitet habe, ist unten. Es handelt sich um einen interaktiven Code, der es dem Benutzer ermöglicht, die Spalten auszuwählen, an denen die PCA durchgeführt werden soll, und dann dynamisch die Anzahl der PCs auszuwählen, die zum Extrahieren der DModX- und T²-Formeln verwendet werden sollen. Sie können sogar die ausgewählte Anzahl von PCs in der Datentabelle speichern, wenn Sie für andere Analysen möchten.
Ein großes Dankeschön an @jthi um Hilfe bei einigen anderen Aspekten dieses Codes zu erhalten, damit die Dinge wie beabsichtigt funktionieren, wie <
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>Betreff: So verwenden Sie JSL, um T² von der PCA-Plattform zu speichern (oder wie man es berechnet)Ich habe nicht herausgefunden, wie man die Auswahl nur einer Spalte mit einer "einfachen" Methode erzwingt. Sie können das Tabellenfeld "erzwingen", wenn der Benutzer mehr als eine Zeile ausgewählt hat. Es wird zumindest etwas klarer, welche Zeile analysiert wird.
Dadurch wird immer die erste ausgewählte Zeile verwendet, aber Sie können sie ändern, um die Zeile mit dem größten Wert aus einer Spalte zu verwenden:
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);
)
);