Cómo usar JSL para ahorrar T² desde la plataforma PCA (o cómo calcularlo)Hola a todos,
Estoy tratando de hacer que funcione un código JSL para guardar T² de la plataforma de componentes principales, por ejemplo, cómo puede hacerlo llamando a <
Sé que la llamada << Guardar T Square funcionará con el gráfico de control multivariante, pero no parece funcionar con las plataformas PCA o Multivariante. Necesito usar la plataforma PCA para generar la fórmula T² porque en la plataforma PCA, en realidad puede especificar la cantidad de PC para usar en el cálculo, no es la estadística T² normal, como la distancia de Mahalanobis al cuadrado. Incluso la llamada << T²(1, Save T Square) enviada a la ventana de informe no funciona.
1. ¿Es posible usar scripts para especificar la cantidad de PC a usar y guardar la fórmula T² en la tabla de datos? Hasta ahora, no he encontrado una opción para esto.
2. Si no, ¿cómo calcularlo mejor? Sé que el cálculo está definido. aquí , pero la fórmula que se guarda en la tabla de datos usando el botón rojo parece un poco diferente.
De acuerdo con la fórmula guardada (guardado manual) T² = Vec Quadratic(S, X)= Diag(X*S*X`), donde X es el vector estandarizado de datos, X` es su transpuesta y S es la covarianza inversa matriz. Este es el T² estándar, el cuadrado de la distancia de Mahalanobis.
Sin embargo, según el documentación para el i-ésimo valor de T² de la plataforma PCA, T_i² = [X_ci*P_a]*L-1*[P`_a*X`_ci], donde X_ci es la i-ésima observación estandarizada, P_a es una matriz que contiene la primera "a" valores propios (es decir, posiblemente no todos ellos), y L-1 es una matriz diagonal que contiene los primeros valores propios de A. En principio, esto debería ser igual a Vec Quadratic (L-1, [X_ci*P_a]), excepto que en lugar de usar la matriz de covarianza inversa, S, está usando la matriz de valores propios axa inversa de las primeras PC "a", y X ahora es X_ci*P_a]. O eso, parecería.
Parece bastante complicado e innecesario rediseñar este problema para salvar el componente n-principal T² cuando JMP ya calcula todo esto por usted. Solo quiero automatizar el proceso de guardado, pero parece que no puedo hacer que la opción 1 funcione, lo que significa que la opción 2 es la siguiente mejor opción. Incluso entonces, tratar de recuperar la fórmula para hacer una Nueva columna con una fórmula parece demasiado.
Adjunto una tabla de datos modificada del archivo Iris.jmp que muestra las fórmulas T² guardadas de la plataforma multivariante (y cómo T² = Mahal.Dist.²), y luego T² de la plataforma PCA donde la fórmula se determina usando todos 4 PC y luego solo a PC. Como puede ver al observar las fórmulas, la matriz S en Vec Quadratic (S,X) es diferente para los T² calculados con 2 PC frente a 4 PC.
Si alguien tiene una idea de cómo hacer un script para obtener el T² con una cantidad diferente de PC o cómo formular correctamente la fórmula de la columna para calcular el T², estaría agradecido por esa información.
¡Gracias por sus comentarios y pensamientos!,
SD
AnalíticaTabla de datossecuencias de comandosRe: Cómo usar JSL para ahorrar T² desde la plataforma PCA (o cómo calcularlo)Hola @ih ,
Muy bueno, gracias por la información sobre cómo acceder al triángulo rojo, no sabía cómo hacerlo antes.
¡Gracias!,
SD
Re: Cómo usar JSL para ahorrar T² desde la plataforma PCA (o cómo calcularlo)Hola @SDF1 ,
Puede acceder a la parte de análisis de valores atípicos de la plataforma PCA para guardar T2 y hacer todo lo demás en el menú del triángulo rojo, solo necesita acceder al objeto programable para el análisis de valores atípicos.Aquí hay un ejemplo:
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: Cómo usar JSL para ahorrar T² desde la plataforma PCA (o cómo calcularlo)Hola @Mark_Bailey y @jthi ,
Gracias a ambos por sus comentarios. Esto ayuda con el problema de poder seleccionar más de una fila. De hecho, lo cambié un poco para enviar una alerta al usuario de que ha seleccionado demasiados elementos. Gracias por todos sus aportes y ayuda para que este código funcione como prefiero.
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 alguna vez escuchas por qué el T² estaba presentando valores diferentes, me interesaría saber por qué.
¡Gracias!,
SD
Re: Cómo usar JSL para ahorrar T² desde la plataforma PCA (o cómo calcularlo)Por cierto, no necesita guardar una referencia de visualización y luego usarla para enviar un mensaje después de que se abra la ventana. Puede usar el envío de mensajes como otro argumento en la llamada de función para hacer un cuadro de visualización. Esta forma es especialmente útil si la ventana es modal.
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: Cómo usar JSL para ahorrar T² desde la plataforma PCA (o cómo calcularlo)No he descubierto cómo forzar la selección de una sola columna con algún método "simple". Puede "forzar" la actualización del cuadro de la tabla si el usuario tiene más de 1 fila seleccionada. Al menos dejará un poco más claro qué fila se analizará.
Esto siempre usará la primera fila seleccionada, pero puede modificarlo para usar la fila con el valor más grande de alguna columna:
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: Cómo usar JSL para ahorrar T² desde la plataforma PCA (o cómo calcularlo)Hola @Mark_Bailey ,
Gracias por sus comentarios e incluir el JSL del desarrollador de la plataforma. Bueno, resulta que la solución a lo que buscaba (opción 1) es realmente posible con JSL!! Y mucho más simple, también. Solo necesitaba verlo en el código que enviaste.La parte crítica está aquí:
Outlier Analysis( 1, Number of Components( N ), Save T Square ),
Al cambiar "N" en la entrada Número de componentes y agregar Guardar T Cuadrado, en realidad se guardará la fórmula T² en la tabla de datos para los N componentes que defina. No sabía que dentro de la llamada de Análisis de valores atípicos(), podría enviar la solicitud a "Guardar T Square". Hacer eso junto con los componentes N hace exactamente lo que esperaba hacer, ¡gracias por la ayuda! No es necesario poner una lista de deseos ni nada, ¡JMP ya puede hacerlo por usted!
Adjunto la tabla de datos Iris_mod.jmp con scripts para calcular el valor T² para 2, 3 y 4 PC. Es bueno saber cómo calcular de manera eficiente el valor de T² en caso de que lo necesite. El código que estaba escribiendo ahora para hacer el cálculo era bastante largo y engorroso, aunque creo que habría funcionado una vez que lo hubiera aclarado todo. Sin embargo, prefiero la solución anterior: ¡son solo unos pocos caracteres adicionales de código!
Tras una inspección más detallada del código que envió, noté que el T² calculado desde la plataforma PCA y el cálculo "manual" en el código son diferentes para la misma cantidad de PC. ¿Alguna pista de por qué? O el cálculo "manual" es "incorrecto" o se realizó de manera diferente a como lo hace el PCA, o algo más está sucediendo. También adjunto otra tabla de datos Iris_mod_ different_T2.jmp que muestra que los resultados de T² para la misma cantidad de PC son diferentes de la plataforma PCA y el cálculo "manual". Hasta nuevo aviso, prefiero usar la fórmula T² de la plataforma PCA. Me gustaría saber si hay algo diferente en el cálculo "manual" y por qué los valores no son los mismos.
¡Gracias de nuevo!,
SD
PD Si alguien está interesado, el código en el que he estado trabajando está abajo. Es un código interactivo que permite al usuario seleccionar las columnas para realizar el PCA y luego seleccionar dinámicamente la cantidad de PC que se usarán para extraer las fórmulas DModX y T². Incluso puede guardar el número seleccionado de PC en la tabla de datos si lo desea para otros análisis.
Un gran agradecimiento a @jthi para obtener ayuda con algunos otros aspectos de este código para que las cosas funcionen según lo previsto, como <
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: Cómo usar JSL para ahorrar T² desde la plataforma PCA (o cómo calcularlo)Consulte el script adjunto para conocer la forma de calcular el cuadrado T. Fue proporcionado por el desarrollador JMP de estas plataformas.
Re: Cómo usar JSL para ahorrar T² desde la plataforma PCA (o cómo calcularlo)La capacidad de guardar T cuadrada solo está disponible desde la plataforma de gráficos de control, por lo que su primer acercamiento no es posible en este momento.
Puede buscar en la lista de deseos aquí en la comunidad de JMP para ver si alguien ya lo ha pedido. Si es así, vota por él (kudo). Si no, ingrese una nueva solicitud.