Alguna forma de obtener constantes de la Transformación de JohnsonHola a todos,
Estaba tratando de desarrollar un script que transformara una columna usando la Transformada de Johnson y luego pudiera tomar las constantes de la fórmula para poder volver a colocarlas en la fórmula inversa para poder usarla para calcular los límites de especificación en sus unidades originales.
Entonces el flujo de trabajo será así
seleccione una columna-> transformar usando Johnson-> Ejecutar gráfico de control-> ver cuáles son los límites de control e ingresar a mi interfaz de usuario,-> tener los límites de especificación en unidades originales-> ejecutar el gráfico de control nuevamente en unidades originales e ingresar los cálculos a partir de los pasos anteriores.
Creo que puedo manejar la mayor parte de esto, pero no sé cómo obtener las constantes de la ecuación de transformación.
Así que desde aquí

poner aquí

¡Gracias por cualquier idea!
Steve
Automatización y scriptingRe: Alguna forma de obtener constantes de la Transformación de JohnsonExtrae la fórmula en una expresión y luego toma valores de ella. Una vez que tengas la expresión, puedes usar, por ejemplo, Arg() para tomar valores de la fórmula.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
new_cols = dt << New Formula Column(
Operation(Category("Distributional"), "Johnson Normalizing"),
Columns(:weight)
);
new_col = Remove From(new_cols, 1)[1];
f_expr = Column(dt, new_col << get name) << Get Formula;
Show(Arg(f_expr, 1), Arg(f_expr, 2));
Hay pocas publicaciones sobre esto en la comunidad, aquí hay una JMP > JSL > Obtener fórmula > Extraer parámetros
Re: Alguna forma de obtener constantes de la Transformación de JohnsonUn método que he utilizado con éxito consiste en usar aproximaciones sucesivas para hallar el valor en la distribución original de un valor de la distribución transformada. Básicamente, toma valores de la distribución original y los pasa por la fórmula creada por la fórmula de transformación hasta encontrar una coincidencia con el valor calculado de la distribución transformada. Aquí hay un ejemplo que se ajusta a una distribución de Johnson, halla la media de la columna transformada y luego halla el valor en la distribución original para esa media transformada. En este caso, simplemente escribe el valor transformado en el logaritmo.
Names Default To Here( 1 );
dt =
// Open Data Table: Semiconductor Capability.jmp
// → Data Table( "Semiconductor Capability" )
Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
theColumn = "NPN1";
Distribution(
Continuous Distribution(
Column( as column(theColumn) ),
Process Capability( Use Column Property Specs ),
Fit Johnson(save distribution formula)
),
SendToReport(
Dispatch( {"NPN1"}, "Process Capability", OutlineBox, {Close( 1 )} )
)
);
// Find the back transform of the calculated mean of the transformed distribution
theTargetCol = Column( dt, N Cols( dt ) ) << get name;
theFormula = Char( As Column( dt, theTargetCol ) << get formula );
theTarget = Col Mean( Column( dt, theTargetCol ) );
// Change the reference to the original column used in the transformation to _X_
// so it can be used in the back transform
Substitute Into( theFormula, ":"|| theColumn, "_X_" );
// The formula needs to create a memory variable to allow for comparison.
// Add the resulting variable name to be the resulting variable when the
// formula is executed
theFormula = "theResult = " || theFormula || ";";
// Successive Approximation will be used to get the back transform
// Use the min and max of the original column to start the approximations
theMax = Col Max(as column(theColumn) );
theMin = Col Min( as column(theColumn) );
// Loop through the approximations for up to 100 loops to find the value
For( i = 1, i <= 100, i++,
_X_ = Mean( theMax, theMin );
Eval( Parse( theFormula ) );
If(
theResult > theTarget, theMax = _X_,
theResult < theTarget, theMin = _X_,
Break()
);
);
// Display the findings in the log
Show( theTarget, theResult, _X_, i );Re: Alguna forma de obtener constantes de la Transformación de Johnson¡Gracias @jthi !
Modifiqué tu script para extraer cada parámetro individual de la siguiente manera:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
new_cols = dt << New Formula Column(
Operation(Category("Distributional"), "Johnson Normalizing"),
Columns(:weight)
);
new_col = Remove From(new_cols, 1)[1];
f_expr = Column(dt, new_col << get name) << Get Formula;
test1=contains(char(arg(f_expr))," - (",1);
test2=contains(char(arg(f_expr)),"))",1);
c1=num(substr(char(arg(f_expr)),num(test1)+4,num(test2)-num(test1)-4));
test3=contains(char(arg(f_expr))," / ",1);
test4=contains(char(arg(f_expr)),") *",1);
c2=num(substr(char(arg(f_expr)),num(test3)+4,num(test4)-num(test3)-4));
test5=contains(char(arg(f_expr))," * ",1);
test6=contains(char(arg(f_expr)),"+",1);
c3=num(substr(char(arg(f_expr)),num(test5)+4,num(test6)-num(test5)-4));
c4=Arg(f_expr, 2);
Show(Arg(f_expr, 1), Arg(f_expr, 2));
¡Funcionando muy bien hasta ahora!
Steve
Re: Alguna forma de obtener constantes de la Transformación de Johnson¡Eso es realmente genial @txnelson !
Jugaré un poco más con esto, pero parece que puedo usarlo para introducir un objetivo a partir de las unidades transformadas (en comparación con cómo el script simplemente usó la media de la columna) y emitirá el valor en unidades originales (si lo entiendo correctamente).
Steve
Re: Alguna forma de obtener constantes de la Transformación de JohnsonPara algo como esto todas las funciones de expresión pueden ser muy útiles.

N Arg(f_expr);
Head(f_expr);
Head Name(f_expr);
Head(Arg(f_expr, 1));
Head(Arg(Arg(f_expr, 1), 1));
A veces es posible que desees agregar Extract Expr a la mezcla
Extract Expr(f_expr, (:weight - Wild()));
Re: Alguna forma de obtener constantes de la Transformación de JohnsonEso es correcto, o cualquier otra estadística que obtengas de la distribución transformada.
Re: Alguna forma de obtener constantes de la Transformación de JohnsonHola @txnelson ,
Modifiqué tu script (no te preocupes demasiado, jaja) y lo adapté para poder introducir mis límites de especificación y obtener los valores transformados de esos límites, lo cual es genial. Sin embargo, para mi flujo de trabajo, necesito poder introducir los límites de especificación a partir de los datos transformados (por lo que después de ejecutar un gráfico de control sobre los datos transformados) y mostrarlos en los valores originales. Sigo la mayor parte del código, pero no lo suficiente como para sentirme seguro al intentar modificarlo yo mismo, así que me preguntaba si esta es una solución rápida que podrías implementar en este código para revertir básicamente lo que está haciendo actualmente.
Names Default To Here( 1 );
dt=current data table();
theColumn = dt<<GET selected="" columns=""> theTarget_lcl, theMax = _X_,
theResult_lcl < theTarget_lcl, theMin = _X_,
Break()
);
);
// Display the findings in the log
Show( theTarget_lcl, theResult_lcl);
// Find the back transform of the calculated mean of the transformed distribution
theTargetCol = Column( dt, N Cols( dt ) ) << get name;
theFormula_ucl = Char( As Column( dt, theTargetCol ) << get formula );
theTarget_ucl = nebvalue2;
// Change the reference to the original column used in the transformation to _X_
// so it can be used in the back transform
Substitute Into( theFormula_ucl, ":"|| theColumn[1], "_X_" );
// The formula needs to create a memory variable to allow for comparison.
// Add the resulting variable name to be the resulting variable when the
// formula is executed
theFormula_ucl = "theResult_ucl = " || theFormula_ucl || ";";
// Successive Approximation will be used to get the back transform
// Use the min and max of the original column to start the approximations
theMax = Col Max(as column(theColumn) );
theMin = Col Min( as column(theColumn) );
// Loop through the approximations for up to 100 loops to find the value
For( i = 1, i <= 1000, i++,
_X_ = thetarget_ucl;
Eval( Parse( theFormula_ucl ) );
If(
theResult_ucl > theTarget_ucl, theMax = _X_,
theResult_ucl < theTarget_ucl, theMin = _X_,
Break()
);
);
// Display the findings in the log
Show( theTarget_ucl, theResult_ucl);
neb3<<SET></SET></GET>
<P>¡Gracias por cualquier aporte y/o ayuda!</P>
<BR />
<P>Steve</P>Re: Alguna forma de obtener constantes de la Transformación de JohnsonHas modificado algunas afirmaciones que no debían modificarse. He comentado las líneas inapropiadas y las he modificado. También he añadido una función que ejecuta un gráfico de control, elimina los límites de control y los utiliza como valores para la transformación a la distribución original.
Names Default To Here( 1 );
dt=current data table();
theColumn = dt<<GET selected="" columns=""> theTarget_lcl, theMax = _X_,
theResult_lcl < theTarget_lcl, theMin = _X_,
Break()
);
);
neb1 << set( _X_ );
// Display the findings in the log
Show( i,_x_,theTarget_lcl, theResult_lcl);
// Find the back transform of the calculated mean of the transformed distribution
//theTargetCol = Column( dt, N Cols( dt ) ) << get name;
theFormula_ucl = Char( As Column( dt, theTargetCol ) << get formula );
//theTarget_ucl = nebvalue2;
// Change the reference to the original column used in the transformation to _X_
// so it can be used in the back transform
Substitute Into( theFormula_ucl, ":"|| theColumn[1], "_X_" );
// The formula needs to create a memory variable to allow for comparison.
// Add the resulting variable name to be the resulting variable when the
// formula is executed
theFormula_ucl = "theResult_ucl = " || theFormula_ucl || ";";
// Successive Approximation will be used to get the back transform
// Use the min and max of the original column to start the approximations
theMax = Col Max(as column(theColumn) );
theMin = Col Min( as column(theColumn) );
// Loop through the approximations for up to 100 loops to find the value
For( i = 1, i <= 15000, i++,
_X_ = Mean( theMax, theMin );
//_X_ = thetarget_ucl;
Eval( Parse( theFormula_ucl ) );
If(
theResult_ucl > theTarget_ucl, theMax = _X_,
theResult_ucl < theTarget_ucl, theMin = _X_,
Break()
);
);
// Display the findings in the log
Show( i,_x_,theTarget_ucl, theResult_ucl);
neb2 << set( _X_ );
neb3<<SET></SET></GET>
Re: Alguna forma de obtener constantes de la Transformación de Johnson¡Gracias @txnelson !
Gracias por ir más allá. ¡Funciona de maravilla!
Steve