Comment utiliser JSL pour économiser le T² de la plateforme PCA (ou comment le calculer)Salut tout le monde,
J'essaie de faire fonctionner du code JSL pour économiser T² à partir de la plate-forme du composant principal, comme la façon dont vous pouvez le faire en appelant <
Je sais que l'appel << Save T Square fonctionnera avec une carte de contrôle multivariée, mais cela ne semble pas fonctionner avec les plates-formes PCA ou multivariées. Je dois 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 le tableau 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.
Selon la formule sauvegardé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 de T² issue 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 remanier ce problème afin de sauver la composante n-principale T² alors que JMP calcule déjà tout cela pour vous. Je veux juste automatiser le processus d'enregistrement, 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 exagéré.
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, puis uniquement vers les PC. Comme vous pouvez le voir en regardant les formules, la matrice S dans le quadratique Vec (S, X) est différente pour les T² calculés en utilisant 2 PC contre 4 PC.
Si quelqu'un sait comment créer un script pour obtenir le T² avec un nombre différent de PC ou comment formuler correctement la formule de colonne pour calculer le T², je lui serais reconnaissant de cet aperçu.
Merci pour vos commentaires et réflexions !,
DS
AnalytiqueTableau de donnéesScriptRe : Comment utiliser JSL pour économiser le T² de la plate-forme PCA (ou comment le calculer)Salut @ih ,
Très cool, merci pour l'info sur la façon d'accéder au triangle rouge, je ne savais pas comment faire ça avant.
Merci!,
DS
Re : Comment utiliser JSL pour économiser le T² de la plate-forme PCA (ou comment le calculer)Salut @SDF1 ,
Vous pouvez accéder à la partie analyse des valeurs aberrantes de la plate-forme PCA pour enregistrer T2 et faire tout le reste dans le menu du triangle rouge, il vous suffit d'accéder à l'objet scriptable pour l'analyse des valeurs aberrantes.Voici un exemple:
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;
Re : Comment utiliser JSL pour économiser le T² de la plate-forme PCA (ou comment le calculer)Salut @Mark_Bailey et @jthi ,
Merci à tous les deux pour vos retours. Cela aide à résoudre le problème de la possibilité de sélectionner plusieurs lignes. En fait, je l'ai un peu modifié pour alerter l'utilisateur qu'il a sélectionné trop d'éléments. Merci pour toutes vos contributions et votre aide pour que ce code fonctionne comme je le préfère.
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>Si vous entendez un jour pourquoi le T² est venu avec des valeurs différentes, je serais intéressé de savoir pourquoi.
Merci!,
DS
Re : Comment utiliser JSL pour économiser le T² de la plate-forme PCA (ou comment le calculer)BTW, vous n'avez pas besoin d'enregistrer une référence d'affichage, puis de l'utiliser pour envoyer un message après l'ouverture de la fenêtre. Vous pouvez utiliser le message send comme autre argument dans l'appel de fonction pour créer une boîte d'affichage. Cette méthode est particulièrement utile si la fenêtre est 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 );
);
);
)
)
);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);
)
);Re : Comment utiliser JSL pour économiser le T² de la plate-forme PCA (ou comment le calculer)Salut @Mark_Bailey ,
Merci pour vos commentaires et notamment le JSL du développeur de la plate-forme. Eh bien, il s'avère que la solution à ce que je cherchais (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 composants N 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 Wish List 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² en cas de besoin. Le code que j'étais en train d'écrire maintenant pour faire le calcul était plutôt long et fastidieux, même si je pense que cela aurait fonctionné une fois que tout aurait été réglé. Cependant, je préfère la solution ci-dessus - ce ne sont que quelques caractères de code supplémentaires !
En examinant 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 de pourquoi? Soit le calcul "manuel" est "erroné" ou effectué différemment de la façon dont le PCA le fait, soit quelque chose d'autre se passe. Je joins également une autre table 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 sélectionné de PC 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 que les choses fonctionnent 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)Veuillez consulter le script ci-joint pour savoir comment calculer le carré T. Il a été fourni par le développeur JMP de ces plates-formes.
Re : Comment utiliser JSL pour économiser le T² de la plate-forme PCA (ou comment le calculer)La capacité d'enregistrer le carré T n'est disponible qu'à partir de la plate-forme de cartes 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 oui, votez pour (kudo). Si ce n'est pas le cas, saisissez une nouvelle demande.