Selezione di più colonne in uno scriptHo lavorato su uno script per valutare alcune possibili trasformazioni di adattamento sia per i polinomi del primo che del secondo ordine. La sceneggiatura sembra funzionare bene. Tuttavia, posso selezionare solo una colonna alla volta. C'è un modo per modificare questo script per consentire la valutazione di più colonne alla volta?
Clear Log();
dt = Current Data Table(); // Use Current Data Table;
xvar = .;
yvar = .;
win = New Window( "Transformation Variable Selection",
<<MODAL></MODAL>
Ri: Selezione di più colonne in uno scriptEcco un altro approccio alla finestra di dialogo che consente all'utente di selezionare una o più colonne per X e Y. Ciò restituisce un elenco di colonne per ciascun ruolo. Con più colonne selezionate, tuttavia, il resto dello script dovrà eseguire un'ulteriore elaborazione dell'elenco per recuperare le colonne prima di eseguire il ciclo delle trasformazioni: potrebbe essere necessario aggiungere un altro livello di iterazione.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Body Fat.jmp" );
win = New Window( "Transformation Variable Selection",
<<MODAL></MODAL>
Ri: Selezione di più colonne in uno scriptMi dispiace, c'erano alcuni bug in quello script.Ecco qualcosa di più vicino a come lo implementerei:
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);
)
)
);Ri: Selezione di più colonne in uno scriptOgni volta che rimuovo [1] (vedi sottolineato e corsivo nello script seguente) dalla parte dello script seguente, non funziona.Lo script che hai fornito non mi consente di fare clic su OK nella casella di testo e pertanto non esegue effettivamente la parte bivariata dello script.
Non voglio essere una scocciatura, sto ancora cercando di padroneggiare JSL. Qualsiasi aiuto tu possa fornire sarebbe molto apprezzato.
Casella di riepilogo H(
Casella di testo(" X, Fattore "),
x = Casella di riepilogo colonne(
dt, // riferimento alla tabella dati
all, // visualizza tutte le colonne dalla tabella dati
xvar = (x << Ottieni selezionato)[1];
// ottiene il nome della colonna selezionata prima che la finestra si chiuda
Mostra(xvar);
),
Casella di testo ("S, risposta"),
y = Casella di riepilogo colonne(
dt,
Tutto,
yvar = (y << Ottieni la selezione)[1];
Mostra(yvar);
Ri: Selezione di più colonne in uno scriptQuando ottieni i nomi delle colonne dalla casella di riepilogo Col nello script, sottoinsiemi l'elenco restituito con [1].Ciò restituisce solo la prima colonna selezionata.Se rimuovi le parentesi e poi esegui l'iterazione sugli elenchi, puoi applicare lo script a più coppie di colonne xey.Probabilmente vorrai riassumere o concatenare i tuoi risultati, ma l'idea di base sarebbe simile allo script seguente. Da notare che per velocizzare il tutto valuto solo a=1 (vedi il /* 7 */ commentato)
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 );
)
);
);
)
);modificato: risolti alcuni bug, vedere la riscrittura più avanti nel thread