Come utilizzare JSL per risparmiare T² dalla piattaforma PCA (o come calcolarlo)Ciao a tutti,
Sto cercando di far funzionare del codice JSL per salvare T² dalla piattaforma del componente principale, ad esempio come puoi farlo chiamando <
So che la chiamata << Save T Square funzionerà con il grafico di controllo multivariato, ma non sembra funzionare con le piattaforme PCA o Multivariate. Ho bisogno di usare la piattaforma PCA per generare la formula T² perché nella piattaforma PCA puoi effettivamente specificare il numero di PC da utilizzare nel calcolo, non è la normale statistica T², come la distanza di Mahalanobis al quadrato. Anche la chiamata << T²(1, Save T Square) inviata alla finestra del report non funziona.
1. È possibile utilizzare degli script per specificare il numero di PC da utilizzare e salvare la formula T² nella tabella dati? Finora, non ho trovato un'opzione per questo.
2. In caso negativo, come calcolarlo al meglio? So che il calcolo è definito qui , ma la formula salvata nella tabella dati utilizzando il pulsante di scelta rapida rosso sembra leggermente diversa.
Secondo la formula salvata (salvataggio manuale) T² = Vec Quadratic(S, X)= Diag(X*S*X`), dove X è il vettore standardizzato dei dati, X` è la sua trasposta e S è la covarianza inversa matrice. Questa è la T² standard, il quadrato della distanza di Mahalanobis.
Tuttavia, secondo il documentazione per l'i-esimo valore di T² dalla piattaforma PCA, T_i² = [X_ci*P_a]*L-1*[P`_a*X`_ci], dove X_ci è l'i-esima osservazione standardizzata, P_a è una matrice contenente la prima "a" autovalori (cioè forse non tutti), e L-1 è una matrice diagonale contenente i primi autovalori A. In linea di principio, questo dovrebbe essere uguale a Vec Quadratic(L-1, [X_ci*P_a]), eccetto che invece di usare la matrice di covarianza inversa, S, sta usando la matrice di autovalori axa inversa dei primi PC "a" e X ora è X_ci*P_a]. O così, sembrerebbe.
Sembra piuttosto complicato e inutile riprogettare questo problema per salvare il componente n-principale T² quando JMP ha già calcolato tutto questo per te. Voglio solo automatizzare il processo di salvataggio, ma non riesco a far funzionare l'opzione 1, il che significa che l'opzione 2 è la migliore scommessa successiva. Anche allora, provare a recuperare la formula per creare una nuova colonna con una formula sembra un po' eccessivo.
Allego una tabella dati modificata del file Iris.jmp che mostra le formule T² salvate dalla piattaforma multivariata (e come T² = Mahal.Dist.²), e poi T² dalla piattaforma PCA dove la formula è determinata utilizzando tutti 4 PC e poi solo ai PC. Come puoi vedere guardando le formule, la matrice S nella Vec Quadratic(S,X) è diversa per i T² calcolati usando 2 PC contro 4 PC.
Se qualcuno ha informazioni su come eseguire lo script per ottenere il T² con un numero diverso di PC o su come formulare correttamente la formula della colonna per calcolare il T², sarei grato per tale intuizione.
Grazie per il tuo feedback e pensieri!,
DS
AnalisiTabella datiScriptingRe: Come utilizzare JSL per salvare T² dalla piattaforma PCA (o come calcolarlo)La capacità di salvare il quadrato T è disponibile solo dalla piattaforma della carta di controllo, quindi il tuo primo approccio non è possibile al momento.
Puoi cercare nella Wish List qui nella community JMP per vedere se qualcuno l'ha già richiesto. Se è così, votalo (kudo). In caso contrario, inserisci una nuova richiesta.
Re: Come utilizzare JSL per salvare T² dalla piattaforma PCA (o come calcolarlo)Si prega di consultare lo script allegato per il modo di calcolare T quadrato. È stato fornito dallo sviluppatore JMP di queste piattaforme.
Re: Come utilizzare JSL per salvare T² dalla piattaforma PCA (o come calcolarlo)Ciao @markbailey ,
Grazie per il tuo feedback e per aver incluso il JSL dallo sviluppatore della piattaforma. Bene, a quanto pare, la soluzione a quello che stavo cercando (opzione 1) è effettivamente possibile con JSL!! E anche molto più semplice. Avevo solo bisogno di vederlo nel codice che mi hai inviato.La parte critica è qui:
Outlier Analysis( 1, Number of Components( N ), Save T Square ),
Modificando "N" nell'input Numero di componenti e aggiungendo Save T Square, verrà effettivamente salvata la formula T² nella tabella dati per gli N componenti definiti. Non sapevo che all'interno della chiamata Outlier Analysis(), avresti potuto inviare la richiesta a "Save T Square". Farlo insieme ai componenti N fa esattamente quello che speravo di fare, grazie per l'aiuto! Non c'è bisogno di inserire una lista dei desideri o altro, JMP può già farlo per te!
Allego la tabella dati Iris_mod.jmp con script per calcolare il valore T² per 2, 3 e 4 PC. È utile sapere come calcolare in modo efficiente il valore T² se dovessi mai averne bisogno. Il codice che stavo scrivendo ora per fare il calcolo era piuttosto lungo e macchinoso, anche se credo che avrebbe funzionato una volta che avessi sistemato tutto. Tuttavia, preferisco la soluzione di cui sopra: sono solo pochi caratteri extra di codice!
Ad un esame più attento del codice che hai inviato, ho notato che il T² calcolato dalla piattaforma PCA e il calcolo "manuale" nel codice sono diversi per lo stesso numero di PC. Qualche indizio sul perché? O il calcolo "manuale" è "sbagliato" o viene eseguito in modo diverso da come lo fa la PCA, oppure sta succedendo qualcos'altro. Allego anche un'altra tabella dati Iris_mod_different_T2.jmp che mostra i risultati T² per lo stesso numero di PC è diversa dalla piattaforma PCA e dal calcolo "manuale". Fino a nuovo avviso, preferisco utilizzare la formula T² dalla piattaforma PCA. Vorrei sapere se c'è qualcosa di diverso nel calcolo "manuale" e perché i valori non sono gli stessi.
Grazie ancora!,
DS
PS Se qualcuno è interessato, il codice su cui ho lavorato è qui sotto. È un codice interattivo che consente all'utente di selezionare le colonne su cui eseguire la PCA e quindi selezionare dinamicamente il numero di PC da utilizzare per estrarre le formule DModX e T². Puoi anche salvare il numero selezionato di PC nella tabella dati se lo desideri per altre analisi.
Un grande grazie a @jthi per aiuto con alcuni altri aspetti di questo codice al fine di far funzionare le cose come previsto, come <
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: Come utilizzare JSL per risparmiare T² dalla piattaforma PCA (o come calcolarlo)Non ho capito come forzare la selezione di una sola colonna con un metodo "semplice". È possibile "forzare" l'aggiornamento della casella della tabella se l'utente ha selezionato più di 1 riga. Almeno renderà un po' più chiaro quale riga verrà analizzata.
Questo utilizzerà sempre la prima riga selezionata, ma puoi modificarla per utilizzare la riga con il valore più grande da alcune colonne:
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);
)
);