Auswählen mehrerer Spalten in einem SkriptIch habe an einem Skript gearbeitet, um einige mögliche Transformationen hinsichtlich ihrer Eignung für Polynome erster und zweiter Ordnung zu bewerten. Das Skript scheint gut zu funktionieren. Allerdings kann ich jeweils nur eine Spalte auswählen. Gibt es eine Möglichkeit, dieses Skript so zu ändern, dass mehr als eine Spalte gleichzeitig ausgewertet werden kann?
Clear Log();
dt = Current Data Table(); // Use Current Data Table;
xvar = .;
yvar = .;
win = New Window( "Transformation Variable Selection",
<<MODAL></MODAL>
Betreff: Mehrere Spalten in einem Skript auswählenHier ist ein weiterer Ansatz für den Dialog, der es dem Benutzer ermöglicht, eine oder mehrere Spalten für X und Y auszuwählen. Dies gibt eine Liste von Spalten für jede Rolle zurück. Wenn jedoch mehrere Spalten ausgewählt sind, muss der Rest Ihres Skripts eine zusätzliche Verarbeitung der Liste durchführen, um die Spalten abzurufen, bevor die Transformationen durchlaufen werden. Möglicherweise müssen Sie eine weitere Iterationsebene hinzufügen.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Body Fat.jmp" );
win = New Window( "Transformation Variable Selection",
<<MODAL></MODAL>
Betreff: Mehrere Spalten in einem Skript auswählenTut mir leid, es gab ein paar Fehler in diesem Skript.Hier ist etwas näher daran, wie ich das umsetzen würde:
Names Default To Here( 1 );
//Fit all requested combinations of transformations and fit types for a single pair of variables
processPair = function({dt, xvar, yvar},
transformations = {"Log", "Sqrt", "Square", "Reciprocal", "Exp", "None"};
For( transx = 1, transx < 7, transx++,
For( transy = 1, transy < 7 /* 7 */, transy++,
For (FitDegree = 1, FitDegree <= 3, FitDegree++,
biv = dt << Bivariate(
Y( Column( yvar ) ),
X( Column( xvar ) ),
Fit Special(
xTran( transformations[transx] ),
yTran( transformations[transy] ),
Degree( FitDegree ),
//Centered Polynomial( 1 ),
{Line Color( {212, 73, 88} )}
)
);
rbiv = Report( biv );
bivmatrix = Try( rbiv[Outline Box( 3 )][1][2] << Get As Matrix );
If( Is Missing( bivmatrix = Try( rbiv[Outline Box( 3 )][1][2] << Get As Matrix ) ), 0 );
dtOutput << Add Rows( 1, At End );
rowout = n rows( dtOutput );
Column( dtOutput, "Independent Variable" )[rowout] = xvar;
Column( dtOutput, "Dependent Variable" )[rowout] = yvar;
Column( dtOutput, "X Transformation" )[rowout] = transformations[transx];
Column( dtOutput, "Y Transformation" )[rowout] = transformations[transy];
Column( dtOutput, "Polynomial Degree" )[rowout] = FitDegree;
Column( dtOutput, "R2" )[rowout] = bivmatrix[1];
Column( dtOutput, "RMSE" )[rowout] = bivmatrix[3];
biv << Close Window;
);
);
);
);
//Function to analyze all variables, runs when button is pressed and at least one variable is selected
processAll = function({dt, xvars, yvars},
tbStatus << Set Text("Starting analysis...");
//Make a data table to hold output
dtOutput = New Table( "Tranformation Evalutation Results",
New Column( "Independent Variable", Character, Text, Width( 5 ) ),
New Column( "Dependent Variable", Character, Text, Width( 5 ) ),
New Column( "X Transformation", Character, Text, Width( 5 ) ),
New Column( "Y Transformation", Character, Text, Width( 5 ) ),
New Column( "Polynomial Degree", Numeric, Ordinal, Width( 5 ) ),
New Column( "R2", Numeric, Continuous, Width( 5 ) ),
New Column( "RMSE", Numeric, Continuous, Width( 5 ) )
);
//for each combination of x and y variable update status and fit all types of transformations
for( xvar_n = 1, xvar_n <= N items(xvars), xvar_n++,
for(yvar_n = 1, yvar_n <= N items(yvars), yvar_n++,
tbStatus << Set Text("Processing x = '" || xvars[xvar_n] || "', y = '" || yvars[yvar_n] || "'");
processPair( dt, xvars[xvar_n], yvars[yvar_n] );
);
);
tbStatus << Set Text("Done with analysis.");
);
//open sample data
dt = Open( "$SAMPLE_DATA/Body Fat.jmp" );
//window to select columns and button to run functions above
win = New Window( "Transformation Variable Selection",
Text Box( " Select Numeric Columns. " ),
H List Box(
Text Box( " X, Factor " ),
x = Col List Box(
dt, // data table reference
all // display all columns from the data table;
),
Text Box( "Y, Response" ),
y = Col List Box(
dt,
all
)
),
tbStatus = Text Box("Ready."),
Button Box("Analyze Variables",
//Get variables
xvars = x << Get selected;
yvars = y << Get selected;
If( n items(xvars) == 0 | n items(yvars) == 0,
tbStatus << Set Text("Select at least one ind and one dep variable to continue."),
processAll(dt, xvars, yvars);
)
)
);Betreff: Mehrere Spalten in einem Skript auswählenImmer wenn ich die [1] (siehe unterstrichene und kursive Schrift im Skript unten) aus dem Teil des Skripts unten entferne, funktioniert es nicht.Das von Ihnen bereitgestellte Skript erlaubt mir nicht, im Textfeld auf „OK“ zu klicken, und führt daher den bivariaten Teil des Skripts nicht tatsächlich aus.
Ich will nicht lästig sein, ich versuche immer noch, JSL in den Griff zu bekommen. Wir würden uns über jede Hilfe, die Sie leisten können, sehr freuen.
H-Listenfeld(
Textfeld( „X, Faktor“),
x = Col List Box(
dt, // Datentabellenreferenz
all, // alle Spalten aus der Datentabelle anzeigen
xvar = (x << Ausgewählt werden)[1];
// Den Namen der ausgewählten Spalte abrufen, bevor das Fenster geschlossen wird
Show( xvar );
),
Textfeld( „Y, Antwort“),
y = Col List Box(
dt,
alle,
yvar = (y << Ausgewählt werden)[1];
Show( yvar );
Betreff: Mehrere Spalten in einem Skript auswählenWenn Sie die Spaltennamen aus dem Spaltenlistenfeld in Ihrem Skript abrufen, bilden Sie eine Teilmenge der Liste, die mit [1] zurückgegeben wird.Dadurch wird nur die erste ausgewählte Spalte zurückgegeben.Wenn Sie die Klammern entfernen und dann über die Listen iterieren, können Sie Ihr Skript auf mehrere x- und y-Spaltenpaare anwenden.Sie möchten Ihre Ergebnisse wahrscheinlich zusammenfassen oder verketten, aber die Grundidee würde wie das folgende Skript aussehen. Beachten Sie, dass ich zur Beschleunigung nur a=1 auswerte (siehe kommentierte /* 7 */)
Names Default To Here( 1 );
//wrap your script to process both variables in a function
//this is not necessary but it make the new for loops more clear
processpair = function({dt, xvar, yvar},
d = 1;
m = Matrix( 72, 5 );
l = List( 72 );
l1 = List( 72 );
l2 = List( 72 );
For( c = 1, c < 3, c++,
For( b = 1, b < 7, b++,
transb = Match( b, 1, "Log", 2, "Sqrt", 3, "Square", 4, "Reciprocal", 5, "Exp", 6, "None", );
For( a = 1, a < 7 /* 7 */, a++,
transa = Match( a, 1, "Log", 2, "Sqrt", 3, "Square", 4, "Reciprocal", 5, "Exp", 6, "None", );
biv = Bivariate(
Y( Column( yvar ) ),
X( Column( xvar ) ),
Fit Special(
xTran( transb ),
yTran( transa ),
Degree( c ),
Centered Polynomial( 0 ),
{Line Color( {213, 72, 87} )}
),
//SendToReport(
// Dispatch(
// {"Transformed Fit Log to Log"},
// "Summary of Fit",
// OutlineBox,
// {Set Title( "Summary of Fit" )}
// )
//)
);
rbiv = Report( biv );
bivmatrix = Try( rbiv[Outline Box( 3 )][1][2] << Get As Matrix );
If( Is Missing( bivmatrix = Try( rbiv[Outline Box( 3 )][1][2] << Get As Matrix ) ),
0
);
//bivmatrix2 = rbiv[Number Col Box( 7 )] << Get As Matrix;
//bivMatrix3 = rbiv[Number Col Box( 8 )] << Get As Matrix;
bivR2 = bivmatrix[1];
bivRMSE = bivmatrix[3];
//bivIntercept = bivMatrix2[1];
//bivX = bivMatrix2[2];
//bivForm = rbiv[Text Edit Box( 4 )];
//l[d] = transb || "(" || xvar || ") vs " || transa || "(" || yvar || ")";
l[d] = xvar;
l1[d] = transb;
l2[d] = transa;
m[d, 1] = c;
m[d, 2] = bivR2;
m[d, 3] = bivRMSE;
Close All( Reports, No Save );
//m[d, 3] = bivIntercept;
//m[d, 4] = bivx;
d++;
);
)
);
ds = New Table( "Tranformation Evalutation" || " " || xvar || " vs " || yvar );
ds << New Column( "Independent Variable", Character, Text, Width( 5 ), Values( l ) );
ds << New Column( "X Transformation", Character, Text, Width( 5 ), Values( l1 ) );
ds << New Column( "Y Transformation", Character, Text, Width( 5 ), Values( l2 ) );
ds << New Column( "Polynomial Degree", Numeric, Continuous, Width( 5 ), Values( m[0, 1] ) );
ds << New Column( "R2", Numeric, Continuous, Width( 5 ), Values( m[0, 2] ) );
ds << New Column( "RMSE", Numeric, Continuous, Width( 5 ), Values( m[0, 3] ) );
);
//use sample data
dt = Open( "$SAMPLE_DATA/Body Fat.jmp" );
xvar = .;
yvar = .;
win = New Window( "Transformation Variable Selection",
Text Box( " Select Numeric Columns. " ),
H List Box(
Text Box( " X, Factor " ),
x = Col List Box(
dt, // data table reference
all, // display all columns from the data table
// get the name of the selected column before the window closes
xvars = (x << Get Selected);
Show( xvar );
),
Text Box( "Y, Response" ),
y = Col List Box(
dt,
all,
yvars = (y << Get Selected);
Show( yvar );
)
),
tbStatus = Text Box("Ready."),
Button Box("Analyze Variables",
//Get variables
xvars = x << Get selected;
yvars = y << Get selected;
If( n items(xvars) == 0 | n items(yvars) == 0,
tbStatus << Set Text("Select at least one ind and one dep variable to continue."),
//for each combination of x and y variable
for( xvar_n = 1, xvar_n <= N items(xvars), xvar_n ++,
xvar = xvars[xvar_n];
show(xvar);
for(yvar_n = 1, yvar_n <= N items(yvars), yvar_n ++,
yvar = yvars[yvar_n];
show(yvar);
//Run your script
processpair( dt, xvar, yvar );
)
);
);
)
);bearbeitet: Einige Fehler behoben, siehe später im Thread neu schreiben