モデルの適合を実行する前にモデルを微調整します。リスト ボックスは特別な列名を尊重しません適合モデルからこのモデル効果ダイアログのコピーを作成しようとしています:

目標は、DOE がテーブルに保存するモデル スクリプトからこの効果表現を読み込むスクリプトを作成し、人々が効果表現を微調整してから、新しい効果表現で適合モデルを使用して分析を実行できるようにすることです。
以下のスクリプトでダイアログを実行すると、テーブルに保存されているモデル スクリプトからエフェクト式が読み取られることがわかります。 それを Fit Model に似たリスト ボックスに入れ、それを微調整できるようにし、OK を押すと、リスト ボックスを新しい効果式に解析し、その新しい式でカスタム フィット モデル ダイアログを開始しようとします。
問題/相違点は特別な名前の列にあります。元の式では :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)」を追加できるかどうか、それで問題が解決するかどうか疑問に思っています。これを行う 1 つの方法は、Regex() を使用することです。この方向への一歩と思われるものを書きましたが、まだ完全ではありません。たぶん、正規表現の知識が豊富な人がこれを手伝ってくれるでしょうか?:
colnames=dt<<GET column="" names=""></GET>
Re: フィット モデルを実行する前にモデルを微調整する、リスト ボックスが特別な列名を尊重しない@ブレイディ_ブレイディほぼ解決しましたが、まだ 1 つの問題に直面しています: 列名に用語の交差または入れ子に使用されるのと同じ文字が含まれている場合、リストボックスから戻るときにどのようにそれらを列に分割しますか?
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();リスト ボックスからの項目は単なる文字列であることがわかります。 スプリッター「*」または「[]」で words() を使用すると、分割が多すぎて、結果が列参照ではなくなります。 各項目をその構成要素に分割して、それらを :Name(" ") でラップし、それらを再ネスト/クロスして、適合モデルの効果式に追加できるようにする必要があります。 また、スクリプトの別の部分の用語に関連するすべての列のリストも必要です。
解決策を知っている場合は、モデルの適合ダイアログで 2 つ以上の変数を入れ子にしたり交差させたりできることを考慮してください。
逆に、モデル スクリプトから効果式を解析すると、Arg() 関数を使用して列を抽出し、リスト ボックスに入力できますが、これは文字列型であるため機能しません。
また、式タイプのすべての引数を抽出するのと同等の words() はありますか? ここで、式からすべての引数を抽出するためにループを作成する必要があります。
Re: フィット モデルを実行する前にモデルを微調整する、リスト ボックスが特別な列名を尊重しないありがとうブレイディ、私はこれを調べます。 私は主に、交差、相互作用、およびネストされた用語をどのように処理するのか疑問に思っていますが、それを少し試して確認する必要があります.
また、これらの用語を含む既存のモデルをリスト ボックスにインポートするときに、同様のことができるかどうかを確認する必要もあります。 掘り下げる時間ができたら、レポートを報告します。
考えてみると、実際には、[モデルの適合] ダイアログから [モデル効果の構築] 要素を呼び出して再利用した方がよい場合があります。ユーザーをそのウィンドウとやり取りするように送り出し、そのウィンドウから効果式を読み戻します。 それほどきれいではありませんが。
Re: フィット モデルを実行する前にモデルを微調整する、リスト ボックスが特別な列名を尊重しないこれを行う 1 つの方法は、式を構築することです。 このアプローチの主な利点は、文字列ベースのアプローチとは異なり、コードが色付きのままで読みやすく、必要なエスケープ文字が最小限であることです。 この特定の場合の流れは次のとおりです。
- 応答式を定義して構築し、
- エフェクト表現の定義と構築、
- プレースホルダーを使用して Fit Model 式を定義し、
- モデル適合式のプレースホルダーに応答式と効果式を代入し、
- Fit Model 式を実行します。
注: 「invisible」オプションをコメントアウトし、列名の変更を try() でラップして、繰り返し実行できるようにしました。
これを試すには、buttonbox("OK" ... ) コードを以下のコードに置き換えます。 [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;
)