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 Principal Component, 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. Devo utilizzare 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 rapporto non funziona.
1. È possibile utilizzare degli script per specificare il numero di PC da utilizzare e salvare la formula T² nella tabella dei 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 tasto di scelta rapida 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 trasposizione e S è la covarianza inversa matrice. Questo è il T² standard, il quadrato della distanza di Mahalanobis.
Tuttavia, secondo il documentazione per l'i-esimo valore 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è possibilmente non tutti), e L-1 è una matrice diagonale contenente i primi A autovalori. In linea di principio, questo dovrebbe essere uguale a Vec Quadratic(L-1, [X_ci*P_a]), tranne che invece di utilizzare la matrice di covarianza inversa, S, utilizza la matrice di autovalori axa inversa dei primi PC "a" e X è ora X_ci*P_a]. O così, sembrerebbe.
Sembra piuttosto complicato e non necessario riprogettare questo problema per salvare il componente n-principale T² quando JMP calcola già 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 soluzione migliore successiva. Anche allora, provare a recuperare la formula per creare una nuova colonna con una formula sembra un po' troppo.
Allego una tabella dati modificata del file Iris.jmp che mostra le formule T² salvate dalla piattaforma multivariata (e come T² = Mahal.Dist.²), e quindi T² dalla piattaforma PCA dove la formula è determinata utilizzando tutti 4 PC e poi solo ai PC. Come puoi vedere osservando le formule, la matrice S in Vec Quadratic(S,X) è diversa per i T² calcolati utilizzando 2 PC vs 4 PC.
Se qualcuno ha un'idea di come scrivere lo script per ottenere il T² con un numero diverso di PC o come formulare correttamente la formula della colonna per calcolare il T², sarei grato per questa intuizione.
Grazie per il tuo feedback e pensieri!,
DS
AnaliticaTabella datiScriptingRi: Come utilizzare JSL per risparmiare T² dalla piattaforma PCA (o come calcolarlo)CIAO @ih ,
Molto bello, grazie per le informazioni su come accedere al triangolo rosso, non sapevo come farlo prima.
Grazie!,
DS
Ri: Come utilizzare JSL per risparmiare T² dalla piattaforma PCA (o come calcolarlo)CIAO @SDF1 ,
Puoi accedere alla parte di analisi dei valori anomali della piattaforma PCA per salvare T2 e fare tutto il resto nel menu del triangolo rosso, devi solo accedere all'oggetto con script per l'analisi dei valori anomali.Ecco un esempio:
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;
Ri: Come utilizzare JSL per risparmiare T² dalla piattaforma PCA (o come calcolarlo)CIAO @Mark_Bailey E @jthi ,
Grazie a entrambi per il vostro feedback. Questo aiuta con il problema di poter selezionare più di una riga. In effetti, l'ho leggermente modificato per avvisare l'utente che ha selezionato troppi elementi. Grazie per tutto il tuo contributo e aiuto per ottenere questa funzione di codice come preferisco.
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>Se hai mai sentito parlare del motivo per cui il T² stava arrivando con valori diversi, sarei interessato a sapere perché.
Grazie!,
DS
Ri: Come utilizzare JSL per risparmiare T² dalla piattaforma PCA (o come calcolarlo)A proposito, non è necessario salvare un riferimento di visualizzazione e quindi utilizzarlo per inviare un messaggio dopo l'apertura della finestra. È possibile utilizzare il messaggio send come altro argomento nella chiamata di funzione per creare una casella di visualizzazione. Questo modo è particolarmente utile se la finestra è modale.
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 );
);
);
)
)
);Ri: 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. Renderà almeno 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 qualche colonna:
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);
)
);Ri: Come utilizzare JSL per risparmiare T² dalla piattaforma PCA (o come calcolarlo)CIAO @Mark_Bailey ,
Grazie per il tuo feedback e per aver incluso il JSL dallo sviluppatore della piattaforma. Bene, a quanto pare, la soluzione a quello che cercavo (opzione 1) È effettivamente possibile con JSL!! E anche molto più semplice. Avevo solo bisogno di vederlo nel codice che hai inviato.La parte critica è qui:
Outlier Analysis( 1, Number of Components( N ), Save T Square ),
Modificando "N" nell'input Number of Components e aggiungendo Save T Square, salverà effettivamente la formula T² nella tabella dati per gli N componenti che definisci. Non sapevo che all'interno della chiamata Outlier Analysis(), potevi inviargli 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 Wish List o altro, JMP può già farlo per te!
Allego la tabella dati Iris_mod.jmp con gli script per calcolare il valore T² per 2, 3 e 4 PC. È bene sapere come calcolare in modo efficiente il valore T² se mai ne avessi bisogno. Il codice che stavo scrivendo ora per eseguire il calcolo era piuttosto lungo e macchinoso, anche se credo che avrebbe funzionato una volta 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 eseguito in modo diverso da come lo fa il PCA, o 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 è diverso 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 il PCA e quindi selezionare dinamicamente il numero di PC da utilizzare per estrarre le formule DModX e T². È anche possibile salvare il numero selezionato di PC nella tabella dei dati se lo si desidera 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>Ri: Come utilizzare JSL per risparmiare 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.
Ri: Come utilizzare JSL per risparmiare T² dalla piattaforma PCA (o come calcolarlo)La capacità di salvare T quadrato è 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 di JMP per vedere se qualcuno l'ha già richiesta. Se è così, votalo (kudo). In caso contrario, inserisci una nuova richiesta.