Une façon d'obtenir des constantes à partir de la transformation de JohnsonBonjour à tous,
J'essayais de développer un script qui transformerait une colonne à l'aide de la transformation de Johnson, puis serait capable de récupérer les constantes de la formule pour pouvoir les remettre dans la formule inverse afin de pouvoir l'utiliser pour calculer les limites de spécification dans leurs unités d'origine.
Donc le flux de travail sera comme ceci
sélectionnez une colonne -> transformez en utilisant Johnson -> Exécutez le graphique de contrôle -> voyez quelles sont les limites de contrôle et entrez dans mon interface utilisateur, -> faites en sorte que les limites de spécification soient exprimées dans les unités d'origine -> exécutez à nouveau le graphique de contrôle dans les unités d'origine et entrez les valeurs calculées à partir des étapes précédentes.
Je pense que je peux gérer la plupart de ces choses, mais je ne sais pas comment récupérer les constantes de l'équation de transformation.
Donc à partir d'ici

à mettre ici

Merci pour toutes vos idées !
Steve
Automatisation et scriptsRe : Quelques moyens d'obtenir des constantes à partir de la transformation de JohnsonExtrayez la formule dans une expression, puis extrayez-en les valeurs. Une fois l'expression obtenue, vous pouvez, par exemple, utiliser Arg() pour extraire les valeurs de la formule.
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));
Il existe quelques publications à ce sujet dans la communauté, en voici une : JMP > JSL > Obtenir la formule > Extraire les paramètres
Re : Quelques moyens d'obtenir des constantes à partir de la transformation de JohnsonUne méthode que j'ai utilisée avec succès consiste à utiliser des approximations successives pour trouver la valeur dans la distribution d'origine d'une valeur issue de la distribution transformée. Cette méthode prend les valeurs de la distribution d'origine et les soumet à la formule créée par la formule de transformation jusqu'à ce qu'elle trouve une correspondance avec la valeur calculée à partir de la distribution transformée. Voici un exemple qui s'adapte à une distribution de Johnson, calcule la moyenne de la colonne transformée, puis trouve la valeur dans la distribution d'origine pour cette valeur moyenne transformée. Dans cet exemple, la valeur rétrotransformée est simplement inscrite dans le logarithme.
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 : Quelques moyens d'obtenir des constantes à partir de la transformation de JohnsonMerci @jthi !
J'ai modifié votre script pour extraire chaque paramètre individuel comme tel :
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));
Cela fonctionne très bien jusqu'à présent !
Steve
Re : Quelques moyens d'obtenir des constantes à partir de la transformation de JohnsonC'est vraiment cool @txnelson !
Je vais jouer un peu plus avec ça, mais il semble que je puisse l'utiliser pour alimenter une cible à partir des unités transformées (par opposition à la façon dont le script a simplement utilisé la moyenne de la colonne) et il affichera la valeur dans les unités d'origine (si je comprends bien).
Steve
Re : Un moyen d'obtenir des constantes à partir de la transformation de JohnsonPour quelque chose comme ça, toutes les fonctions d'expression peuvent être très utiles

N Arg(f_expr);
Head(f_expr);
Head Name(f_expr);
Head(Arg(f_expr, 1));
Head(Arg(Arg(f_expr, 1), 1));
Parfois, vous souhaiterez peut-être ajouter Extract Expr au mélange
Extract Expr(f_expr, (:weight - Wild()));
Re : Quelques moyens d'obtenir des constantes à partir de la transformation de JohnsonC'est correct, ou toute autre statistique que vous obtenez à partir de la distribution transformée
Re : Quelques moyens d'obtenir des constantes à partir de la transformation de JohnsonSalut @txnelson ,
J'ai modifié votre script (essayez de ne pas trop grincer des dents !) pour pouvoir y insérer mes limites de spécification et obtenir les valeurs transformées, ce qui est génial. Cependant, pour mon workflow, j'ai besoin de pouvoir insérer les limites de spécification à partir des données transformées (donc après avoir exécuté un graphique de contrôle sur les données transformées) et les afficher dans les valeurs des données d'origine. Je maîtrise la majeure partie du code, mais pas suffisamment pour me sentir à l'aise pour tenter de le modifier davantage moi-même. Je me demandais donc s'il s'agissait d'une solution rapide que vous pourriez apporter à ce code pour inverser son fonctionnement actuel.
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>Merci pour toute contribution et/ou aide !</P>
<BR />
<P>Steve</P>Re : Un moyen d'obtenir des constantes à partir de la transformation de JohnsonVous avez modifié certaines instructions qui n'auraient pas dû l'être. J'ai commenté les lignes inappropriées et les ai corrigées. J'ai également ajouté une fonctionnalité qui exécute un graphique de contrôle et supprime les limites de contrôle pour les utiliser comme valeurs afin de rétablir la distribution d'origine.
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 : Quelques moyens d'obtenir des constantes à partir de la transformation de JohnsonMerci @txnelson !
Merci d'avoir dépassé les attentes. Ça marche très bien !
Steve