在运行拟合模型之前调整模型,列表框不考虑特殊列名我正在寻找从拟合模型构建此模型效果对话框的副本:

目标是构建一个脚本,该脚本将从 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;
)