맞춤 모델을 실행하기 전에 모델을 조정하십시오. 목록 상자는 특수 열 이름을 따르지 않습니다.적합 모델에서 이 모델 효과 대화 상자의 복사본을 만들려고 합니다.

목표는 DOE가 테이블에 저장하는 모델 스크립트에서 이 효과 식을 읽고 사람들이 효과 식을 조정한 다음 새 효과 식과 함께 적합 모델을 사용하여 일부 분석을 실행할 수 있도록 하는 스크립트를 구축하는 것입니다.
아래 스크립트에서 대화 상자를 실행하면 테이블에 저장된 모델 스크립트에서 효과 표현식을 읽는 것을 볼 수 있습니다. Fit Model과 유사한 목록 상자에 넣고 조정할 수 있으며 확인을 누르면 목록 상자를 새로운 효과 식으로 구문 분석하고 해당 새 식으로 사용자 정의 모델 맞춤 대화 상자를 시작합니다.
문제/차이점은 특수 이름 열에 있습니다. 원래 표현식에서는 :name("Height-")으로 저장되지만 목록 상자에서 해당 표현식을 검색하면 "Height-"로 저장되어 불완전한 수식이 됩니다. 열 이름 대신 작업. 그렇다면 이 목록 상자의 항목에 특수 열 이름 규칙을 어떻게 적용합니까? 특수 이름 열이 있는 교차 및 중첩 용어에도 동일하게 적용됩니다.
dt=Open("$SAMPLE_DATA/Big Class.jmp");
dt:height << Set Name( "Height-" );
FitModelScript = dt << Get table variable( "Fit Model" );
i = 1;
try(
While( !Is Empty( arg_i = Arg( parse(FitModelScript), i ) ),
If( Starts With( Char( Name Expr( arg_i ) ), "Effects" ),
EffectsExpr = Name Expr( arg_i );
Break();
,
i++
)
);
);
New Window( "Test",
Border Box( Left( 3 ), top( 2 ),
v list box(
H List Box(
Panel Box( "Select Columns",
v list box(
colListData = Col list box( All, width( 253 ), grouped, nLines( 20 ) ),
Spacer box(size(1,2))
)
),
Panel Box( "Cast Selected Columns into Roles",
Lineup Box( N Col( 2 ), Spacing( 3 ),
Button Box( "Response columns", colListYbox << Append( colListData << GetSelected ) ),
colListYbox = Col List Box( width( 200 ), nLines( 20 ), numeric, MinItems( 1 ) ),
)
),
Panel Box( "Model effects",
H List Box(
V List Box(
Button Box( "Main", LB << Append( colListData << GetSelected ) ),
Button Box( "Interact",
SelectedColumns = colListData << GetSelected();
For( i = 1, i <= N Items( SelectedColumns ), i++,
For( k = 1, k <= N Items( SelectedColumns ) - i, k++,
LB << Append( concat(SelectedColumns[i], " * ", SelectedColumns[i + k] ) )
)
);
),
Button Box( "Quadratic",
SelectedColumns = colListData << GetSelected();
For( i = 1, i <= N Items( SelectedColumns ), i++,
LB << Append( concat(SelectedColumns[i], " * ", SelectedColumns[i] ) )
);
),
Button Box( "Nest",
colListX = colListData << GetSelected();
For( i = 1, i <= N Items( colListX ), i++,
If(Column(colListX[i]) << Get Modeling Type() != "Nominal",
New window("Error",<<MODAL>0,
For( i = 1, i <= N Items( MainNest ), i++,
If(Contains(colListX, MainNest[i])==0,
LB << Append(concat(MainNest[i], "[", concat items(colListX, ", "), "]"));
LB << Remove Item(contains(LB << Get items( ),MainNest[i]));
,
New window("Error", <<MODAL></MODAL></MODAL>
스크립팅Re: 맞춤 모델을 실행하기 전에 모델을 조정합니다. 목록 상자가 특수 열 이름을 따르지 않습니다.감사해요!
예, 모든 열 이름을 생성하지 않기 때문에 모든 열 이름을 지원하려고 합니다. 이름 바꾸기는 진정으로 작동하는 유일한 솔루션이지만 사람들의 데이터 테이블을 일시적으로 변경하는 것을 좋아하지 않습니다. 대신 새 창 대화 상자에 Fit 모델을 직접 포함하여 효과 표현 생성을 처리하도록 하여 거기에 도달할 수 있는지 확인하겠습니다. 그런 식으로 일부 기능을 잃어버리지만(리콜 및 채울 수 있는 다른 열 상자) 강력한 효과 표현 생성기를 가질 가치가 있습니다.
Re: 맞춤 모델을 실행하기 전에 모델을 조정합니다. 목록 상자가 특수 열 이름을 따르지 않습니다.열 이름에 교차 또는 중첩 용어에 사용되는 동일한 문자가 포함된 경우...
가장 간단한 방법은 이를 방지하는 것입니다. 스크립트가 이러한 열을 생성하는 경우 예를 들어 [ ] 대신 \{ \}를 사용하고 * 대신 \#를 사용하는 것을 고려하십시오. 반면에 가능한 열 이름을 지원하려는 경우 사용자에게 열 이름을 일시적으로 변경해야 함을 알리는 모달 경고 창을 표시한 후 위에서 언급한 것과 같이 대체하여 열 이름을 순환할 수 있습니다. 그런 다음 스크립트가 완료되면 다시 변경할 수 있습니다.
또한: 표현식 유형의 모든 인수를 추출하는 것과 동일한 words()가 있습니까? 이제 표현식에서 모든 인수를 추출하기 위해 루프를 작성해야 합니다.
표현 인수에 대한 단어와 유사한 기능을 모르겠습니다. 이러한 목록을 자주 작성하는 경우 함수가 도움이 될까요? 표현식을 함수에 전달할 때 nameexpr()로 표현식을 래핑해야 합니다.
건배,
브래디
exp = Expr( note( a, b, c ) );
argList = function({ex},
{aList = {}, i=1},
While( i <= N Arg( ex ), Insert Into( aList, Arg( ex, i++ ) ) );
aList
);
argList(nameexpr(exp));
Re: 맞춤 모델을 실행하기 전에 모델을 조정합니다. 목록 상자가 특수 열 이름을 따르지 않습니다.안녕,
각 열 이름 주위에 ":Name(ColumnName)"을 추가하면 문제가 해결되는지 궁금합니다.이를 수행하는 한 가지 방법은 Regex()를 사용하는 것입니다.나는 이 방향으로 나아가는 단계라고 생각하지만 여전히 완벽하지는 않은 것을 작성했습니다.Regex에 대해 더 많이 알고 있는 사람이 도움을 줄 수 있습니까?:
colnames=dt<<GET column="" names=""></GET>
Re: 맞춤 모델을 실행하기 전에 모델을 조정합니다. 목록 상자가 특수 열 이름을 따르지 않습니다.@brady_brady 거의 해결했지만 여전히 한 가지 문제가 있습니다. 열 이름에 교차 또는 중첩 용어에 사용되는 동일한 문자가 포함되어 있으면 목록 상자에서 돌아올 때 어떻게 열로 분할합니까?
dt = New Table( "Test",
Add Rows( 3 ),
Compress File When Saved( 1 ),
New Column( "SCR[12]*34",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3] )
),
New Column( "SCR5[a]*",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [3, 2, 3] )
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [4, 1, 4] )
)
);
new window("test", LB = list box());
LB << append((Column(1) << get name()) || " * " || (Column(2) << get name()));
LB << append((Column(1) << get name()) || "[" || (Column(2) << get name()) || "]");
LB << get items();목록 상자에서 오는 항목이 문자열이라는 것을 알 수 있습니다. splitter "*" 또는 "[]"와 함께 words()를 사용하면 너무 많은 분할이 발생하고 결과는 더 이상 열 참조가 아닙니다. 각 항목을 구성 요소로 분할하여 :Name(" ")에 래핑하고 다시 중첩/교차하여 적합 모델에 대한 효과 표현식에 추가해야 합니다. 또한 스크립트의 다른 부분에 대한 용어와 관련된 모든 열 목록이 필요합니다.
솔루션을 알고 있는 경우 모델 적합 대화 상자에서 2개 이상의 변수로 중첩 및 교차가 가능하다는 점을 고려하십시오.
다른 방법으로 모델 스크립트에서 효과 식을 구문 분석하면 Arg() 함수를 사용하여 열을 추출하고 목록 상자를 채울 수 있지만 다시 돌아가서 문자열 유형이므로 작동하지 않습니다.
또한: 표현식 유형의 모든 인수를 추출하는 것과 동일한 words()가 있습니까? 이제 표현식에서 모든 인수를 추출하기 위해 루프를 작성해야 합니다.
Re: 맞춤 모델을 실행하기 전에 모델을 조정합니다. 목록 상자가 특수 열 이름을 따르지 않습니다.Brady에게 감사합니다. 조사해 보겠습니다. 나는 그것이 교차, 상호 작용 및 중첩 용어를 어떻게 처리할지 궁금하지만 확인하려면 약간의 작업이 필요합니다.
또한 이러한 용어가 포함된 기존 모델을 목록 상자로 가져올 때 현재 "Name(" 항목이 표시되므로 비슷한 작업을 수행할 수 있는지 확인해야 합니다. 파헤칠 시간이 있으면 다시보고하겠습니다.
생각해 보면 사용자가 해당 창과 상호 작용하도록 보낸 다음 해당 창에서 효과 식을 다시 읽어 모델 맞춤 대화 상자에서 모델 효과 구성 요소를 호출/재사용하는 것이 실제로 더 나을 수 있습니다. 그래도 예쁘지는 않습니다.
Re: 맞춤 모델을 실행하기 전에 모델을 조정합니다. 목록 상자가 특수 열 이름을 따르지 않습니다.이를 수행하는 한 가지 방법은 표현식을 작성하는 것입니다. 이 접근 방식의 주요 이점은 문자열 기반 접근 방식과 달리 코드가 색상으로 유지되고 쉽게 읽을 수 있으며 최소한의 이스케이프 문자가 필요하다는 것입니다. 이 특별한 경우의 흐름은 다음과 같습니다.
- 응답 식을 정의하고 작성합니다.
- 효과 표현 정의 및 구축,
- 자리 표시자를 사용하여 Fit Model 표현식을 정의합니다.
- 모델 적합 표현식의 자리 표시자로 응답 및 효과 표현식을 대체하고
- Fit Model 표현식을 실행합니다.
참고: "invisible" 옵션을 주석 처리하고 반복 실행을 허용하기 위해 try()에서 열 이름 변경을 래핑했습니다.
이 작업을 수행하려면 buttonbox("OK" ... ) 코드를 아래 코드로 바꾸십시오. "확인"을 클릭하기 전에 응답 열의 목록 상자에 열을 입력해야 합니다.
건배,
브래디
Button Box( "OK",
respList = colListYbox << get items();
respExpr = expr(Y());
for(i=1, i<=nitems(respList), i++,
insertinto(respExpr, parse(evalinsert(":name(\!"^respList[i]^\!")")))
);
effectsList = lb << get Items;
effectsExpr = expr(Effects());
for(i=1, i<=nitems(effectsList), i++,
insertinto(effectsExpr, parse(evalinsert(":name(\!"^effectsList[i]^\!")")))
);
jslExpr = expr(
try(FitModelDialogWindow << closewindow());
FitModelDialogWindow = Fit Model(
//invisible,
_Y_,
_EFFECTS_,
Keep dialog open( 1 ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" )
);
);
substituteInto(jslExpr,
expr(_Y_), nameexpr(respExpr),
expr(_EFFECTS_), nameexpr(effectsExpr)
);
jslExpr;
)