Selección de varias columnas en un scriptHe estado trabajando en un script para evaluar algunas transformaciones posibles para el ajuste de polinomios de primer y segundo orden. El guión parece funcionar bien. Sin embargo, solo puedo seleccionar una columna a la vez. ¿Hay alguna manera de cambiar este script para permitir que se evalúe más de una columna a la vez?
Clear Log();
dt = Current Data Table(); // Use Current Data Table;
xvar = .;
yvar = .;
win = New Window( "Transformation Variable Selection",
<<MODAL></MODAL>
Re: Seleccionar varias columnas en un scriptAquí hay otro enfoque del cuadro de diálogo que permite al usuario seleccionar una o más columnas para X e Y. Esto devuelve una lista de columnas para cada función. Sin embargo, con varias columnas seleccionadas, el resto de la secuencia de comandos deberá realizar un procesamiento adicional de la lista para recuperar las columnas antes de recorrer las transformaciones; es posible que deba agregar otro nivel de iteración.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Body Fat.jmp" );
win = New Window( "Transformation Variable Selection",
<<MODAL></MODAL>
Re: Seleccionar varias columnas en un scriptLo siento, hubo algunos errores en ese script.Aquí hay algo más cercano a cómo implementaría esto:
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);
)
)
);Re: Seleccionar varias columnas en un scriptCada vez que elimino el [1] (ver subrayado y en cursiva en el guión a continuación) de la parte del guión a continuación, no funciona.La secuencia de comandos que proporcionó no me permite hacer clic en Aceptar en el cuadro de texto y, por lo tanto, no ejecuta la parte bivariada de la secuencia de comandos.
No quiero ser un dolor, todavía estoy tratando de entender a JSL. Cualquier ayuda que pueda proporcionar sería muy apreciada.
Cuadro de lista H(
Cuadro de texto (" X, Factor " ),
x = Cuadro de lista de columnas (
dt, // referencia de la tabla de datos
all, // muestra todas las columnas de la tabla de datos
xvar = (x << Obtener seleccionado)[1];
// obtener el nombre de la columna seleccionada antes de que se cierre la ventana
Mostrar(xvar);
),
Cuadro de texto( "Y, Respuesta"),
y = Cuadro de lista de columnas (
dt,
todo,
yvar = (y << Obtener seleccionado)[1];
Mostrar(yvar);
Re: Seleccionar varias columnas en un scriptAl obtener los nombres de las columnas del Cuadro de lista de columnas en su secuencia de comandos, crea un subconjunto de la lista que se devuelve con [1].Esto solo devuelve la primera columna seleccionada.Si elimina los corchetes y luego itera sobre las listas, puede aplicar su script a múltiples pares de columnas x e y.Es probable que desee resumir o concatenar sus resultados, pero la idea básica se parecería al siguiente script. Tenga en cuenta que para acelerar las cosas solo evalúo a = 1 (vea el comentario /* 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 );
)
);
);
)
);editado: corrigió algunos errores, vea volver a escribir más adelante en el hilo