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

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