Wie man JSL verwendet, um T² von der PCA-Plattform zu speichern (oder wie man es berechnet)Hallo alle,
Ich versuche, einen JSL-Code zum Laufen zu bringen, um T² von der Principal Component-Plattform zu speichern, beispielsweise wie Sie dies tun können, indem Sie <
Ich weiß, dass der Aufruf << Save T Square mit multivariaten Kontrollkarten 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. Dabei handelt es sich nicht um die normale T²-Statistik wie die Mahalanobis-Distanz im Quadrat. Selbst 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 hierfür keine Option gefunden.
2. Wenn nicht, wie berechnet man es am besten? Ich weiß, dass die Berechnung definiert ist Hier , aber die Formel, die mit dem roten Hot-Button in der Datentabelle gespeichert wird, scheint etwas anders zu sein.
Gemäß der gespeicherten Formel (manuelles Speichern) ist T² = Vec Quadratic(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 laut der Dokumentation für den i-ten T²-Wert von 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 ist, die das erste „a“ enthält. 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]. Zumindest scheint es so.
Es erscheint ziemlich kompliziert und unnötig, dieses Problem neu zu konstruieren, um die n-Hauptkomponente T² zu sparen, wenn JMP dies bereits alles für Sie berechnet. Ich möchte nur den Speichervorgang automatisieren, aber Option 1 funktioniert scheinbar nicht, was bedeutet, dass Option 2 die nächstbeste Lösung ist. Selbst dann erscheint der Versuch, die Formel wiederherzustellen, um eine neue Spalte mit einer Formel darin zu erstellen, etwas zu viel.
Ich füge eine geänderte Datentabelle der Iris.jmp-Datei bei, die die gespeicherten T²-Formeln der multivariaten Plattform zeigt (und wie T² = Mahal.Dist.²) und dann T² der PCA-Plattform, wo die Formel unter Verwendung von all bestimmt wird 4 PCs und dann nur noch an PCs. Wie Sie anhand der Formeln sehen können, unterscheidet sich die S-Matrix im Vec Quadratic(S,X) für die mit 2 PCs berechneten T²s im Vergleich zu 4 PCs.
Wenn jemand Einblick hat, wie man per Skript den T² mit einer anderen Anzahl von PCs ermittelt oder wie man die Spaltenformel zur Berechnung des T² richtig formuliert, wäre ich für diesen Einblick dankbar.
Vielen Dank für Ihr Feedback und Ihre Gedanken!,
DS
AnalytikDatentabelleSkripterstellungBetreff: Wie man JSL verwendet, um T² von der PCA-Plattform zu speichern (oder wie man es berechnet)Hallo @ich h ,
Sehr cool, danke für die Info, wie man Zugang zum roten Dreieck bekommt, ich wusste vorher nicht, wie man das macht.
Danke!,
DS
Betreff: Wie man JSL verwendet, um T² von der PCA-Plattform zu speichern (oder wie man es berechnet)Hallo @SDF1 ,
Sie können zum Ausreißeranalyseteil der PCA-Plattform gelangen, um T2 zu speichern und alles andere über das Menü mit dem roten Dreieck erledigen. Sie müssen lediglich zum skriptfähigen Objekt für die Ausreißeranalyse gelangen.Hier ist ein Beispiel:
Names default to here(1);
dt = Open( "$Sample_data/iris.jmp" );
pca = Principal Components(
Y( :Sepal length, :Sepal width, :Petal length, :Petal width ),
Estimation Method( "Default" ),
"on Correlations"
);
pca << Outlier Analysis();
//Get a reference to the outlier analysis itself
oa = (pca << XPath("//OutlineBox[text()='Outlier Analysis']"))[1] << Get Scriptable Object;
//Now you can access that red triangle menu and more
oa << Number of Components(1);
oa << Save T²;
oa << Save T² Contribution;
Betreff: Wie man JSL verwendet, um T² von der PCA-Plattform zu speichern (oder wie man es berechnet)Hallo @Mark_Bailey Und @jthi ,
Vielen Dank an beide für Ihr Feedback. Dies hilft bei dem Problem, mehr als eine Zeile auswählen zu können. Tatsächlich habe ich es ein wenig geändert, um den Benutzer zu warnen, dass er zu viele Elemente ausgewählt hat. Vielen Dank für all Ihre Eingaben und Ihre Hilfe, damit dieser Code so funktioniert, wie ich es bevorzuge.
Mount = Expr(
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} ),
<<SET selectable="" rows=""> 1, Throw( "Too many items selected!\!rOnly one selection possible." ),
N Items( selRows ) == 1,
N = selrows;
);
)
)
)
)
);
Mount;</SET>Wenn Sie jemals etwas darüber erfahren, warum die T² unterschiedliche Werte ermittelt haben, würde mich der Grund dafür interessieren.
Danke!,
DS
Betreff: Wie man JSL verwendet, um T² von der PCA-Plattform zu speichern (oder wie man es berechnet)Übrigens müssen Sie keine Anzeigereferenz speichern und diese dann zum Senden einer Nachricht verwenden, nachdem das Fenster geöffnet wurde. Sie können die Nachricht send als weiteres Argument im Funktionsaufruf verwenden, um ein Anzeigefeld zu erstellen. Diese Methode ist besonders nützlich, wenn das Fenster modal ist.
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} ),
<< Set Selectable Rows(1),
<< 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( selRows );
);
);
)
)
);Betreff: Wie man JSL verwendet, um T² von der PCA-Plattform zu speichern (oder wie man es berechnet)Ich habe nicht herausgefunden, wie ich mit einer „einfachen“ Methode die Auswahl nur einer Spalte erzwingen kann. Sie können die Aktualisierung des Tabellenfelds „erzwingen“, wenn der Benutzer mehr als eine Zeile ausgewählt hat. Dadurch wird zumindest etwas klarer, welche Zeile analysiert wird.
Dabei wird immer die erste ausgewählte Zeile verwendet, Sie können sie jedoch ä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);
)
);Betreff: Wie man JSL verwendet, um T² von der PCA-Plattform zu speichern (oder wie man es berechnet)Hallo @Mark_Bailey ,
Vielen Dank für Ihr Feedback und die Einbeziehung der JSL vom Entwickler der Plattform. Nun, wie sich herausstellte, die Lösung für das, was ich gesucht habe (Option 1) Ist mit JSL tatsächlich möglich!! Und auch viel einfacher. Ich musste es nur in dem Code sehen, den Sie gesendet haben.Der entscheidende 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 der Option „T-Quadrat speichern“ wird die T²-Formel tatsächlich in der Datentabelle für die von Ihnen definierten N-Komponenten gespeichert. Ich wusste nicht, dass man innerhalb des Outlier Analysis()-Aufrufs die Anfrage an „Save T Square“ senden kann. Das zusammen mit den N-Komponenten zu machen, macht genau das, was ich mir erhofft hatte, danke für die Hilfe! Sie müssen keine Wunschliste oder ähnliches anlegen, JMP kann das bereits für Sie erledigen!
Ich hänge die Datentabelle Iris_mod.jmp mit Skripten an, um den T²-Wert für 2, 3 und 4 PCs zu berechnen. Es ist gut zu wissen, wie ich den T²-Wert bei Bedarf effizient berechnen kann. Der Code, den ich gerade geschrieben habe, um die Berechnung durchzuführen, war ziemlich lang und umständlich, obwohl ich glaube, dass er funktioniert hätte, wenn ich alles geklärt hätte. Allerdings bevorzuge ich die obige Lösung – es sind nur ein paar zusätzliche Codezeichen!
Bei näherer Betrachtung des von Ihnen gesendeten Codes ist mir aufgefallen, dass der von 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 durchgeführt als die PCA, oder es liegt etwas anderes vor. Ich füge auch eine weitere Datentabelle Iris_mod_different_T2.jmp bei, die zeigt, dass sich die T²-Ergebnisse für die gleiche Anzahl von PCs von der PCA-Plattform und der „manuellen“ Berechnung unterscheiden. Bis auf Weiteres verwende ich lieber die T²-Formel der PCA-Plattform. Ich würde gerne wissen, ob bei der „manuellen“ Berechnung etwas anders ist und warum die Werte nicht gleich sind.
Danke noch einmal!,
DS
PS Wenn es jemanden interessiert, finden Sie unten den Code, an dem ich gearbeitet habe. 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 die ausgewählte Anzahl von PCs sogar in der Datentabelle speichern, wenn Sie dies für andere Analysen wünschen.
Ein großes Dankeschön an @jthi für Hilfe bei einigen anderen Aspekten dieses Codes, damit die Dinge wie vorgesehen funktionieren, wie z. B. <
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: Wie man JSL verwendet, um T² von der PCA-Plattform zu speichern (oder wie man es berechnet)Informationen zur Berechnung des T-Quadrats finden Sie im beigefügten Skript. Es wurde vom JMP-Entwickler dieser Plattformen bereitgestellt.
Betreff: Wie man JSL verwendet, um T² von der PCA-Plattform zu speichern (oder wie man es berechnet)Die Möglichkeit, T-Quadrat zu speichern, ist nur auf der 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 (ein großes Lob). Wenn nicht, geben Sie eine neue Anfrage ein.