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

目標是建立一個腳本,該腳本將從 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>
進階統計建模消費者與市場研究大規模客製化品質和工藝工程回覆:在執行擬合模型之前調整模型,列錶框不考慮特殊列名稱謝謝!
是的,我正在嘗試支援每個列名稱,因為我不會建立它們。 重新命名是我發現真正有效的唯一解決方案,但我不喜歡更改人們的資料表,即使是暫時的。 相反,我將看看是否可以透過將「擬合」模型直接嵌入到新視窗對話方塊中來實現這一點,並讓它處理效果表達式的建立。 這樣我就失去了一些功能(回想一下,其他列框是可填充的),但擁有一個強大的效果表達式產生器是值得的。
回覆:在執行擬合模型之前調整模型,列錶框不考慮特殊列名稱如果列名稱包含與用於交叉或嵌套術語相同的字元...
最簡單的方法就是防止這種情況發生。 例如,如果您的腳本正在建立此類列,請考慮使用 \{ \} 來取代 [ ],使用 \# 來取代 *。 另一方面,如果您嘗試支援任何可能的列名稱,則可以在顯示模式警告視窗通知使用者必須暫時變更列名稱之後,循環瀏覽列名稱,進行如上所述的替換。 當腳本完成後,您可以將它們更改回來。
另外:是否有一個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()相當於提取表達式類型的所有參數? 現在我最終不得不編寫循環來從表達式中提取所有參數。
回覆:在執行擬合模型之前調整模型,列錶框不考慮特殊列名稱謝謝布雷迪,我會調查一下。 我主要想知道它將如何處理交叉、互動和嵌套術語,但需要稍微檢查一下。
我還需要看看在將具有這些術語的現有模型匯入到列錶框中時是否可以執行類似的操作,因為目前顯示的是「Name(」內容。 一旦我有時間深入研究,我會報告。
考慮一下,實際上,透過將使用者發送出去與該視窗交互,然後從該視窗讀回效果表達式,從「擬合模型」對話框中調用/重用「構造模型效果」元素可能會更好。 雖然沒那麼漂亮。
回覆:在執行擬合模型之前調整模型,列錶框不考慮特殊列名稱實現此目的的一種方法是建立表達式。 這種方法的一個主要好處是,與基於字串的方法不同,程式碼保持彩色、易於閱讀,並且需要最少的轉義字元。 在這種特殊情況下的流程是:
- 定義並建立響應表達式,
- 定義並建立效果表達式,
- 使用佔位符定義擬合模型表達式,
- 將響應和效果表達式替換為擬合模型表達式中的佔位符,並且
- 執行擬合模型表達式。
注意:我已經註解掉了「不可見」選項,並將列名稱變更包裝在 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;
)