在脚本中选择多列我一直在编写一个脚本来评估一些可能的变换以适合一阶和二阶多项式。 该脚本似乎运行良好。 但是,我一次只能选择一列。 有没有办法更改此脚本以允许一次评估多个列?
Clear Log();
dt = Current Data Table(); // Use Current Data Table;
xvar = .;
yvar = .;
win = New Window( "Transformation Variable Selection",
<<MODAL></MODAL>
回复:在脚本中选择多列这是对话框的另一种方法,允许用户为 X 和 Y 选择一列或多列。 这将返回每个角色的列列表。 但是,如果选择了多个列,则脚本的其余部分将需要对列表进行额外的处理,以在循环转换之前检索列 - 您可能需要添加另一个迭代级别。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Body Fat.jmp" );
win = New Window( "Transformation Variable Selection",
<<MODAL></MODAL>
回复:在脚本中选择多列抱歉,该脚本中有一些错误。以下是更接近我实现此目的的方法:
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);
)
)
);回复:在脚本中选择多列每当我从下面的脚本部分中删除 [1](请参阅下面的脚本中的下划线和斜体)时,它就不起作用。您提供的脚本不允许我在文本框中单击“确定”,因此不会实际运行脚本的双变量部分。
我无意惹麻烦,我仍在努力掌握 JSL。 如果您能提供任何帮助,我们将不胜感激。
H 列表框(
文本框(“X,因子”),
x = 列列表框(
dt, // 数据表引用
all, // 显示数据表中的所有列
xvar = (x << 被选中)[1];
// 获取窗口关闭前所选列的名称
显示(xvar);
),
文本框(“Y,响应”),
y = 列列表框(
德特,
全部,
yvar = (y << 被选中)[1];
显示(yvar);
回复:在脚本中选择多列当从脚本中的 Col 列表框中获取列名称时,您可以对返回的列表进行子集化 [1]。这仅返回第一个选定的列。如果删除括号然后迭代列表,您可以将脚本应用于多个 x 和 y 列对。您可能想要总结或连接您的结果,但基本思想如下所示。 请注意,为了加快速度,我只评估 a=1 (请参阅注释的 /* 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 );
)
);
);
)
);编辑:修复了一些错误,请参阅线程中稍后的重写