在運行擬合模型之前調整模型,列錶框不考慮特殊列名我正在尋找從擬合模型構建此模型效果對話框的副本:

目標是構建一個腳本,該腳本將從 DOE 保存在表中的模型腳本中讀取此效果表達式,允許人們調整效果表達式,然後使用具有新效果表達式的擬合模型運行一些分析。
如果您在下面的腳本中運行對話框,您將看到它從存儲在表中的模型腳本中讀取效果表達式。 將其放入類似於擬合模型的列錶框中,允許您對其進行調整,然後當您點擊確定時,它會嘗試將列錶框解析為新的效果表達式,並使用該新表達式啟動自定義擬合模型對話框。
問題/區別在於特殊名稱列:在原始表達式中,它存儲為 :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>
腳本回复:在運行擬合模型之前調整模型,列錶框不考慮特殊列名稱謝謝!
是的,我試圖支持每個列名,因為我不創建它們。 重命名是我發現真正有效的唯一解決方案,但我不喜歡臨時更改人們的數據表。 相反,我將看看是否可以通過直接在新窗口對話框中嵌入 Fit 模型來實現這一目標,並讓它處理效果表達式的創建。 我以這種方式失去了一些功能(召回,並且其他列框可填充)但是擁有強大的效果表達式生成器是值得的。
回复:在運行擬合模型之前調整模型,列錶框不考慮特殊列名如果列名包含用於交叉或嵌套術語的相同字符...
最簡單的方法是防止這種情況發生。 如果您的腳本正在創建此類列,請考慮使用 \{ \} 代替 [ ] 並使用 \# 代替 *。 另一方面,如果您嘗試支持任何可能的列名,則可以在顯示模態警告窗口通知用戶必須臨時更改列名後,循環列名,進行上述替換。 然後,您可以在腳本完成後將它們改回原樣。
另外:是否有一個 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));
回复:在運行擬合模型之前調整模型,列錶框不考慮特殊列名你好,
我想知道是否可以在每個列名稱周圍添加“:Name(ColumnName)”,是否可以解決問題。一種方法是使用 Regex()。我寫了一些我認為可能是朝著這個方向邁出的一步,但它仍然不完美的東西。也許對正則表達式有更多了解的人可以幫助解決這個問題?:
colnames=dt<<GET column="" names=""></GET>
回复:在運行擬合模型之前調整模型,列錶框不考慮特殊列名@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();您會注意到來自列錶框的項目只是字符串。 如果我將 words() 與拆分器“*”或“[]”一起使用,我會得到太多拆分,結果不再是列引用。 我需要將每個項目拆分成它的組成部分,以便我可以將它們包裝在 :Name(" ") 中並重新嵌套/交叉它們並將它們添加到擬合模型的效果表達式中。 我還需要腳本另一部分的任何術語中涉及的所有列的列表。
如果您知道解決方案,請考慮擬合模型對話框允許嵌套和交叉超過 2 個變量。
反過來說,從模型腳本中解析效果表達式我可以使用 Arg() 函數來提取列並填充列錶框,但是返回這不起作用,因為它是字符串類型。
另外:是否有一個 words() 等同於提取表達式類型的所有參數? 現在我最終不得不編寫循環來從表達式中提取所有參數。
回复:在運行擬合模型之前調整模型,列錶框不考慮特殊列名謝謝布雷迪,我會調查一下。 我主要想知道它將如何處理交叉、交互和嵌套的術語,但需要稍微嘗試一下以進行檢查。
我還需要看看在將具有這些術語的現有模型導入列錶框中時是否可以做一些類似的事情,因為這顯示了當前的“名稱(”內容。 一旦我有時間深入研究,我會報告回來。
考慮一下,通過將用戶發送到該窗口進行交互,然後從該窗口讀回效果表達式,從“擬合模型”對話框調用/重新使用“構建模型效果”元素實際上可能更好。 雖然不那麼漂亮。
回复:在運行擬合模型之前調整模型,列錶框不考慮特殊列名一種方法是建立表達式。 這種方法的一個主要好處是,與基於字符串的方法不同,代碼保持彩色,易於閱讀,並且需要最少的轉義字符。 這種特殊情況下的流程是:
- 定義和構建響應表達式,
- 定義和構建效果表達式,
- 用佔位符定義擬合模型表達式,
- 將響應和效果表達式替換為擬合模型表達式中的佔位符,以及
- 執行擬合模型表達式。
注意:我已經註釋掉了“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;
)