Eine Möglichkeit, Konstanten aus der Johnson-Transformation zu erhaltenHallo zusammen,
Ich habe versucht, ein Skript zu entwickeln, das eine Spalte mithilfe der Johnson-Transformation transformiert und dann die Konstanten aus der Formel abrufen kann, um sie wieder in die inverse Formel einzufügen, damit ich diese zur Berechnung der Spezifikationsgrenzen in ihren ursprünglichen Einheiten verwenden kann.
Der Arbeitsablauf wird also folgendermaßen aussehen
Wählen Sie eine Spalte aus -> transformieren Sie mit Johnson -> führen Sie das Kontrolldiagramm aus -> sehen Sie sich die Kontrollgrenzen an und geben Sie sie in meine Benutzeroberfläche ein -> lassen Sie die Spezifikationsgrenzen in Originaleinheiten ausgeben -> führen Sie das Kontrolldiagramm erneut in Originaleinheiten und mit den aus den vorherigen Schritten berechneten Eingaben aus.
Ich denke, ich kann das meiste davon bewältigen, aber ich weiß nicht, wie ich die Konstanten aus der Transformationsgleichung herausbekomme.
Also von hier

hier reinstellen

Danke für alle Ideen!
Steve
Automatisierung und SkriptingBetreff: Eine Möglichkeit, Konstanten aus der Johnson-Transformation zu erhaltenExtrahieren Sie die Formel in einen Ausdruck und entnehmen Sie dort die Werte. Nachdem Sie den Ausdruck erstellt haben, können Sie beispielsweise mit Arg() Werte aus der Formel entnehmen.
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));
Es gibt einige Beiträge dazu in der Community, hier ist einer : JMP > JSL > Formel abrufen > Parameter extrahieren
Betreff: Eine Möglichkeit, Konstanten aus der Johnson-Transformation zu erhaltenEine Methode, die ich erfolgreich eingesetzt habe, ist die Verwendung sukzessiver Approximationen, um den Wert in der Originalverteilung für einen Wert aus der transformierten Verteilung zu ermitteln. Dabei werden Werte aus der Originalverteilung verwendet und durch die von der Transformationsformel erstellte Formel geleitet, bis eine Übereinstimmung mit dem berechneten Wert aus der transformierten Verteilung gefunden wird. Hier ist ein Beispiel, das eine Johnson-Verteilung anpasst, den Mittelwert der transformierten Spalte ermittelt und anschließend den Wert in der Originalverteilung für diesen transformierten Mittelwert ermittelt. Im Beispiel wird der rücktransformierte Wert einfach in das Protokoll geschrieben.
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 );Betreff: Eine Möglichkeit, Konstanten aus der Johnson-Transformation zu erhaltenDanke @jthi !
Ich habe Ihr Skript geändert, um jeden einzelnen Parameter wie folgt herauszuziehen:
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));
Funktioniert bisher großartig!
Steve
Betreff: Eine Möglichkeit, Konstanten aus der Johnson-Transformation zu erhaltenDas ist echt cool, @txnelson !
Ich werde noch etwas damit herumspielen, aber es sieht so aus, als könnte ich damit ein Ziel aus den transformierten Einheiten eingeben (im Gegensatz dazu, wie das Skript einfach den Spaltenmittelwert verwendet hat) und es wird den Wert in den Originaleinheiten ausgeben (wenn ich das richtig verstehe).
Steve
Betreff: Eine Möglichkeit, Konstanten aus der Johnson-Transformation zu erhaltenFür so etwas können alle Ausdrucksfunktionen sehr nützlich sein

N Arg(f_expr);
Head(f_expr);
Head Name(f_expr);
Head(Arg(f_expr, 1));
Head(Arg(Arg(f_expr, 1), 1));
Manchmal möchten Sie vielleicht Extract Expr in den Mix einbauen
Extract Expr(f_expr, (:weight - Wild()));
Betreff: Eine Möglichkeit, Konstanten aus der Johnson-Transformation zu erhaltenDas ist richtig, oder jede andere Statistik, die Sie aus der transformierten Verteilung erhalten
Betreff: Eine Möglichkeit, Konstanten aus der Johnson-Transformation zu erhaltenHey @txnelson ,
Ich habe Ihr Skript modifiziert (versuchen Sie, nicht zu sehr zusammenzuzucken, lol) und es so gestaltet, dass ich meine Spezifikationsgrenzen eingeben und die transformierten Werte dieser Grenzen erhalten kann, was super ist. Für meinen Arbeitsablauf muss ich jedoch die Spezifikationsgrenzen aus den transformierten Daten eingeben können (also nach dem Ausführen einer Kontrollkarte für die transformierten Daten) und sie in den ursprünglichen Datenwerten ausgeben. Ich verstehe den Code größtenteils, aber nicht genug, um mich selbst bei weiteren Änderungen sicher zu fühlen. Daher habe ich mich gefragt, ob Sie diesen Code schnell korrigieren könnten, um die aktuelle Funktionsweise im Grunde umzukehren.
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>Vielen Dank für alle Beiträge und/oder Hilfe!</P>
<BR />
<P>Steve</P>Betreff: Eine Möglichkeit, Konstanten aus der Johnson-Transformation zu erhaltenSie haben einige Anweisungen geändert, die nicht hätten geändert werden sollen. Ich habe die unpassenden Zeilen auskommentiert und wieder geändert. Außerdem habe ich eine Funktion hinzugefügt, die ein Kontrolldiagramm ausführt, die Kontrollgrenzen entfernt und sie als Werte für die Rücktransformation in die ursprüngliche Verteilung verwendet.
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>
Betreff: Eine Möglichkeit, Konstanten aus der Johnson-Transformation zu erhaltenDanke @txnelson !
Vielen Dank für Ihren Einsatz. Das funktioniert super!
Steve