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

目標は、DOE がテーブルに保存したモデル スクリプトからこの効果式を読み取るスクリプトを構築し、ユーザーが効果式を微調整し、新しい効果式でモデルの適合を使用して分析を実行できるようにすることです。
以下のスクリプトでダイアログを実行すると、テーブルに保存されているモデル スクリプトからエフェクト式が読み込まれることがわかります。 これを [モデルのフィット] に似たリスト ボックスに入れて微調整できるようにします。[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: モデルの適合を実行する前にモデルを微調整する、リスト ボックスが特別な列名を考慮しないありがとう!
はい、私は列名を作成していないので、すべての列名をサポートしようとしています。 名前の変更は本当に機能することがわかった唯一の解決策ですが、たとえ一時的であっても人のデータテーブルを変更するのは好きではありません。 代わりに、新しいウィンドウ ダイアログにモデルのフィットを直接埋め込み、エフェクト エクスプレッションの作成を処理させることでそこに到達できるかどうかを確認します。 この方法では一部の機能が失われますが (他の列ボックスは入力可能であることを思い出してください)、堅牢なエフェクト式ジェネレーターを用意する価値はあります。
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: モデルの適合を実行する前にモデルを微調整する、リスト ボックスが特別な列名を考慮しない@brady_bradyほぼ解決しましたが、まだ直面している問題が 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(" ") でラップし、再ネスト/クロスさせて、フィット モデルのエフェクト式に追加できるようにする必要があります。 また、スクリプトの別の部分の用語に関係するすべての列のリストも必要です。
解決策をご存知の場合は、モデルの適合ダイアログで 3 つ以上の変数のネストと交差が可能であることを考慮してください。
逆に、モデル スクリプトからエフェクト式を解析すると、Arg() 関数を使用して列を抽出し、リスト ボックスに値を入力できますが、元に戻ると、これは文字列型であるため機能しません。
また、式タイプのすべての引数を抽出するのと同等の Words() はありますか? 結局、式からすべての引数を抽出するループを作成する必要があります。
Re: モデルの適合を実行する前にモデルを微調整する、リスト ボックスが特別な列名を考慮しないありがとうブレイディ、検討してみます。 私は主に、交差した、相互作用する、ネストされた用語をどのように処理するのか疑問に思っていますが、確認するには少しいじる必要があります。
また、現在 "Name(" が表示されているため、これらの用語を含む既存のモデルをリスト ボックスにインポートするときに、同様のことができるかどうかを確認する必要があります。 もう少し掘り下げて時間ができたらまたレポートします。
考えてみると、実際には、ユーザーをそのウィンドウと対話させてから、そのウィンドウからエフェクト式を読み戻すことによって、[モデルのフィット] ダイアログから [モデルのエフェクトの構築] 要素を呼び出して再利用する方が良いかもしれません。 それほどきれいではありませんが。
Re: モデルの適合を実行する前にモデルを微調整する、リスト ボックスが特別な列名を考慮しないこれを行う 1 つの方法は、式を構築することです。 このアプローチの主な利点は、文字列ベースのアプローチとは異なり、コードが色付きのままで読みやすく、必要なエスケープ文字が最小限であることです。 この特定のケースのフローは次のとおりです。
- 応答式を定義して構築します。
- エフェクト表現を定義して構築し、
- プレースホルダーを使用してモデルの適合式を定義します。
- 応答式と効果式をモデルの適合式のプレースホルダーに置き換えます。
- モデルの適合式を実行します。
注: 繰り返し実行できるように、「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;
)