스크립트에서 여러 열 선택저는 1차 및 2차 다항식 모두에 적합한 몇 가지 가능한 변환을 평가하기 위해 스크립트 작업을 해왔습니다. 스크립트가 잘 작동하는 것 같습니다. 그러나 한 번에 하나의 열만 선택할 수 있습니다. 한 번에 둘 이상의 열을 평가할 수 있도록 이 스크립트를 변경하는 방법이 있습니까?
Clear Log();
dt = Current Data Table(); // Use Current Data Table;
xvar = .;
yvar = .;
win = New Window( "Transformation Variable Selection",
<<MODAL></MODAL>
Re: 스크립트에서 여러 열 선택다음은 사용자가 X 및 Y에 대해 하나 이상의 열을 선택할 수 있는 대화 상자에 대한 또 다른 접근 방식입니다. 이렇게 하면 각 역할에 대한 열 목록이 반환됩니다. 그러나 여러 열을 선택한 경우 나머지 스크립트는 변환을 반복하기 전에 열을 검색하기 위해 목록의 추가 처리를 수행해야 합니다. 다른 수준의 반복을 추가해야 할 수도 있습니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Body Fat.jmp" );
win = New Window( "Transformation Variable Selection",
<<MODAL></MODAL>
Re: 스크립트에서 여러 열 선택죄송합니다. 해당 스크립트에 몇 가지 버그가 있었습니다.다음은 이것을 구현하는 방법에 더 가깝습니다.
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: 스크립트에서 여러 열 선택아래 스크립트 부분에서 [1](아래 스크립트에서 밑줄 및 기울임꼴 참조)을 제거할 때마다 작동하지 않습니다.제공한 스크립트는 텍스트 상자에서 확인을 클릭하는 것을 허용하지 않으므로 실제로 스크립트의 이변량 부분을 실행하지 않습니다.
나는 고통스러워하려는 것이 아니라 여전히 JSL을 다루려고 노력하고 있습니다. 제공할 수 있는 모든 도움을 주시면 감사하겠습니다.
H 목록 상자(
텍스트 상자( " X, 계수 " ),
x = 열 목록 상자(
dt, // 데이터 테이블 참조
all, // 데이터 테이블의 모든 열 표시
xvar = (x << 선택 받기)[1];
// 창이 닫히기 전에 선택한 열의 이름을 가져옵니다.
표시( xvar );
),
텍스트 상자( "Y, 응답" ),
y = 열 목록 상자(
dt,
모두,
yvar = (y << 선택 받기)[1];
표시(yvar);
Re: 스크립트에서 여러 열 선택스크립트의 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 );
)
);
);
)
);편집됨: 일부 버그 수정, 스레드에서 나중에 다시 작성 참조