Comment utiliser JSL pour économiser du T² depuis la plateforme PCA (ou comment le calculer)Salut tout le monde,
J'essaie de faire fonctionner du code JSL pour enregistrer T² à partir de la plate-forme Principal Component, comme vous pouvez le faire en appelant <
Je sais que l'appel << Save T Square fonctionnera avec la carte de contrôle multivariée, mais il ne semble pas fonctionner avec les plates-formes PCA ou multivariées. J'ai besoin d'utiliser la plate-forme PCA pour générer la formule T² car dans la plate-forme PCA, vous pouvez en fait spécifier le nombre de PC à utiliser dans le calcul, ce n'est pas la statistique T² normale, comme la distance de Mahalanobis au carré. Même l'appel << T²(1, Save T Square) envoyé à la fenêtre de rapport ne fonctionne pas.
1. Est-il possible d'utiliser des scripts pour spécifier le nombre de PC à utiliser et enregistrer la formule T² dans la table de données ? Jusqu'à présent, je n'ai pas trouvé d'option pour cela.
2. Si non, comment le calculer au mieux ? Je sais que le calcul est défini ici , mais la formule enregistrée dans la table de données à l'aide du bouton rouge semble un peu différente.
D'après la formule enregistrée (sauvegarde manuelle) T² = Vec Quadratic(S, X)= Diag(X*S*X`), où X est le vecteur standardisé de données, X` est sa transposée et S est la covariance inverse matrice. C'est le T² standard, le carré de la distance de Mahalanobis.
Cependant, selon le Documentation pour la ième valeur T² de la plateforme PCA, T_i² = [X_ci*P_a]*L-1*[P`_a*X`_ci], où X_ci est la ième observation normalisée, P_a est une matrice contenant le premier "a" valeurs propres (c'est-à-dire peut-être pas toutes), et L-1 est une matrice diagonale contenant les premières A valeurs propres. En principe, cela devrait être égal à Vec Quadratic(L-1, [X_ci*P_a]), sauf qu'au lieu d'utiliser la matrice de covariance inverse, S, il utilise la matrice de valeurs propres axa inverse des premiers "a" PC, et X est maintenant X_ci*P_a]. Ou alors, il semblerait.
Il semble plutôt compliqué et inutile de repenser ce problème afin d'économiser la composante n-principale T² alors que JMP calcule déjà tout cela pour vous. Je veux juste automatiser le processus de sauvegarde, mais je n'arrive pas à faire fonctionner l'option 1, ce qui signifie que l'option 2 est le meilleur pari suivant. Même dans ce cas, essayer de récupérer la formule afin de créer une nouvelle colonne avec une formule semble un peu excessif.
Je joins un tableau de données modifié du fichier Iris.jmp qui montre les formules T² enregistrées de la plate-forme multivariée (et comment T² = Mahal.Dist.²), puis T² de la plate-forme PCA où la formule est déterminée en utilisant tous 4 PC et ensuite uniquement aux PC. Comme vous pouvez le voir en regardant les formules, la matrice S dans le Vec Quadratic(S,X) est différente pour les T² calculés en utilisant 2 PC vs 4 PC.
Si quelqu'un a un aperçu de la façon de scripter l'obtention du T² avec un nombre différent de PC ou de la façon de formuler correctement la formule de colonne pour calculer le T², je lui serais reconnaissant de cet aperçu.
Merci pour vos commentaires et vos idées !,
DS
AnalytiqueTableau de donnéesScriptRe : Comment utiliser JSL pour enregistrer le T² de la plateforme PCA (ou comment le calculer)La possibilité d'enregistrer le carré T n'est disponible qu'à partir de la plate-forme de carte de contrôle, votre première approche n'est donc pas possible pour le moment.
Vous pouvez effectuer une recherche dans la liste de souhaits ici dans la communauté JMP pour voir si quelqu'un l'a déjà demandé. Si c'est le cas, votez pour lui (kudo). Sinon, saisissez une nouvelle demande.
Re : Comment utiliser JSL pour enregistrer le T² de la plateforme PCA (ou comment le calculer)Veuillez consulter le script ci-joint pour savoir comment calculer le carré T. Il a été fourni par le développeur JMP de ces plateformes.
Re : Comment utiliser JSL pour enregistrer le T² de la plateforme PCA (ou comment le calculer)salut @markbailey ,
Merci pour vos commentaires et notamment la JSL du développeur de la plate-forme. Eh bien, il s'avère que la solution à ce que je recherchais (option 1) est effectivement possible avec JSL !! Et tellement plus simple aussi. J'avais juste besoin de le voir dans le code que vous avez envoyé.La partie critique est ici :
Outlier Analysis( 1, Number of Components( N ), Save T Square ),
En modifiant "N" dans l'entrée Nombre de composants et en ajoutant le carré Enregistrer T, cela enregistrera en fait la formule T² dans le tableau de données pour les N composants que vous définissez. Je ne savais pas que dans l'appel Outlier Analysis(), vous pouviez lui envoyer la demande à "Save T Square". Faire cela avec les composants N fait exactement ce que j'espérais faire, merci pour l'aide ! Pas besoin de mettre une liste de souhaits ou quoi que ce soit, JMP peut déjà le faire pour vous !
Je joins la table de données Iris_mod.jmp avec des scripts pour calculer la valeur T² pour 2, 3 et 4 PC. Il est bon de savoir comment calculer efficacement la valeur T² si jamais j'en avais besoin. Le code que je venais d'écrire maintenant pour faire le calcul était plutôt long et lourd, bien que je pense qu'il aurait fonctionné une fois que tout aurait été arrangé. Cependant, je préfère la solution ci-dessus - ce ne sont que quelques caractères de code supplémentaires !
En regardant de plus près le code que vous avez envoyé, j'ai remarqué que le T² calculé à partir de la plateforme PCA et le calcul "manuel" dans le code sont différents pour le même nombre de PC. Une idée du pourquoi ? Soit le calcul « manuel » est « mauvais » ou effectué différemment de la façon dont le PCA le fait, ou quelque chose d'autre se passe. Je joins également un autre tableau de données Iris_mod_different_T2.jmp qui montre que les résultats T² pour le même nombre de PC sont différents de la plate-forme PCA et du calcul "manuel". Jusqu'à nouvel ordre, je préfère utiliser la formule T² de la plateforme PCA. J'aimerais savoir s'il y a quelque chose de différent dans le calcul "manuel" et pourquoi les valeurs ne sont pas les mêmes.
Merci encore!,
DS
PS Si quelqu'un est intéressé, le code sur lequel j'ai travaillé est ci-dessous. Il s'agit d'un code interactif qui permet à l'utilisateur de sélectionner les colonnes sur lesquelles effectuer l'ACP, puis de sélectionner dynamiquement le nombre de PC à utiliser pour extraire les formules DModX et T². Vous pouvez même enregistrer le nombre de PC sélectionné dans le tableau de données si vous le souhaitez pour d'autres analyses.
Un grand merci à @jthi pour obtenir de l'aide sur d'autres aspects de ce code afin de faire fonctionner les choses comme prévu, comme <
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 : Comment utiliser JSL pour économiser le T² de la plate-forme PCA (ou comment le calculer)Je n'ai pas compris comment forcer la sélection d'une seule colonne avec une méthode "simple". Vous pouvez "forcer" la mise à jour de la zone de tableau si l'utilisateur a sélectionné plus d'une ligne. Cela rendra au moins un peu plus clair, quelle ligne sera analysée.
Cela utilisera toujours la première ligne sélectionnée, mais vous pouvez la modifier pour utiliser la ligne avec la plus grande valeur d'une 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);
)
);