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

목표는 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: 적합 모델을 실행하기 전에 모델을 조정합니다. 목록 상자가 특수 열 이름을 고려하지 않습니다.열 이름에 용어 교차 또는 중첩에 사용되는 동일한 문자가 포함된 경우...
가장 간단한 방법은 이런 일이 발생하지 않도록 방지하는 것입니다. 스크립트가 이러한 열을 생성하는 경우, 예를 들어 [ ] 대신 \{ \}를 사용하고 * 대신 \#을 사용하는 것을 고려하십시오. 반면에 가능한 열 이름을 지원하려는 경우 열 이름을 일시적으로 변경해야 함을 사용자에게 알리는 모달 경고 창을 표시한 후 위에서 언급한 것과 같은 대체를 수행하여 열 이름을 순환할 수 있습니다. 그런 다음 스크립트가 완료되면 다시 변경할 수 있습니다.
또한: 표현식 유형의 모든 인수를 추출하는 데 해당하는 단어()가 있습니까? 이제 표현식에서 모든 인수를 추출하기 위해 루프를 작성해야 합니다.
표현 인수에 대한 단어와 유사한 기능을 모르겠습니다. 그러한 목록을 자주 작성하는 경우 함수가 도움이 될까요? 표현식을 함수에 전달할 때 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();목록 상자에서 나오는 항목은 단지 문자열이라는 것을 알 수 있습니다. 분할자 "*" 또는 "[]"와 함께 단어()를 사용하면 너무 많은 분할이 발생하고 결과는 더 이상 열 참조가 아닙니다. 각 항목을 해당 구성 요소로 분할하여 :Name(" ")으로 래핑하고 다시 중첩/교차하여 모델 맞춤에 대한 효과 표현식에 추가할 수 있도록 해야 합니다. 또한 스크립트의 다른 부분에 대한 용어와 관련된 모든 열 목록이 필요합니다.
해결책을 알고 있다면 모형 적합 대화 상자에서 2개 이상의 변수를 사용하여 중첩 및 교차를 허용한다는 점을 고려하십시오.
다른 방법으로 모델 스크립트에서 효과 표현식을 구문 분석하면 Arg() 함수를 사용하여 열을 추출하고 목록 상자를 채울 수 있지만 뒤로 돌아가는 것은 문자열 유형이므로 작동하지 않습니다.
또한: 표현식 유형의 모든 인수를 추출하는 데 해당하는 단어()가 있습니까? 이제 표현식에서 모든 인수를 추출하기 위해 루프를 작성해야 합니다.
Re: 적합 모델을 실행하기 전에 모델을 조정합니다. 목록 상자가 특수 열 이름을 고려하지 않습니다.Brady님, 감사합니다. 조사해 보겠습니다. 교차, 상호 작용 및 중첩 용어를 어떻게 처리할지 궁금합니다. 하지만 확인하려면 약간의 작업이 필요합니다.
또한 현재 "Name(" 항목이 표시되므로 이러한 용어가 포함된 기존 모델을 목록 상자로 가져올 때 비슷한 작업을 수행할 수 있는지 확인해야 합니다. 좀 더 알아보고 나면 다시 보고하겠습니다.
생각해 보면 사용자를 해당 창과 상호 작용하도록 보낸 다음 해당 창에서 효과 표현식을 다시 읽어 모델 적합 대화 상자에서 모델 효과 구성 요소를 호출/재사용하는 것이 실제로 더 나을 수 있습니다. 그래도 그다지 예쁘지는 않습니다.
Re: 적합 모델을 실행하기 전에 모델을 조정합니다. 목록 상자가 특수 열 이름을 고려하지 않습니다.이를 수행하는 한 가지 방법은 표현을 구축하는 것입니다. 이 접근 방식의 주요 이점은 문자열 기반 접근 방식과 달리 코드에 색상이 남아 있고 쉽게 읽을 수 있으며 최소한의 이스케이프 문자가 필요하다는 것입니다. 이 특별한 경우의 흐름은 다음과 같습니다.
- 응답 표현식을 정의하고 구축합니다.
- 효과 표현식을 정의하고 구축합니다.
- 자리 표시자를 사용하여 Fit Model 표현식을 정의합니다.
- 반응 및 효과 표현식을 모형 적합 표현식의 자리 표시자로 대체하고
- Fit Model 표현식을 실행합니다.
참고: "invisible" 옵션을 주석 처리하고 반복 실행을 허용하기 위해 try()에서 열 이름 변경을 래핑했습니다.
이를 시도해 보려면 버튼박스("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;
)