重新运行公式的脚本问题我在之前的帖子中问过这个问题,但那是几周前的事了,所以可能不会引起注意。我怀疑这对于这个组来说是一个简单的脚本问题。下面是一个脚本(由 Frank 提供),成功运行了逐步回归的蒙特卡罗模拟。它唯一没有做的就是在进行逐步回归之前重新计算公式中包含随机数的一些列。当我手动单击表中的红色箭头并说重新运行公式时,<<重新运行公式命令有效,但在脚本中它不执行任何操作。有人可以帮助我在 For 循环中的每次迭代之前获取要重新运行的公式吗?
我不成功的尝试是脚本中的第 19 行。谢谢。
Clear Globals();
Clear Log();
Names Default To Here( 1 );
//Define path in and out
Path_in = Pick File( "Select file" );
If( Directory Exists( "$Desktop\Fit_Stepwise" ),
,
Create Directory( "$Desktop\Fit_Stepwise" )
);
Path_out = "$Desktop\Fit_Stepwise\";
//Run Fit model and stepwise after open datatable
dt = Open( Path_in );
For( i = 1, i <= 1000, i++,
dt << Rerun Formulas;
ow = dt << Fit Model(
Y( :Y ),
Effects(
:Column 2 001,
:Column 2 002,
:Column 2 003,
:Column 2 004,
:Column 2 005,
:Column 2 006,
:Column 2 007,
:Column 2 008,
:Column 2 009,
:Column 2 010
),
Personality( "Stepwise" ),
Run,
SendToReport( Dispatch( {}, "Step History", OutlineBox, {Close( 1 )} ) )
);
dt_result = Report( ow )[Outline Box( "Stepwise Fit for Y" )][Outline Box( "Current Estimates" )][Table Box( 1 )] << Make Into Data Table;
dt_result << save( Path_out || Char( i ) || ".csv", "csv" );
ow << close window;
dt_result << Close Window;
);
dt << Close Window;
dt_result = Multiple File Import(
<<SET folder="">F\!"" ) > 0.05 ) ) << Delete Rows;
dt_result << Distribution( Stack( 1 ), Nominal Distribution( Column( :Parameter ), Horizontal Layout( 1 ), Vertical( 0 ) ) );</SET>高级统计建模回复:重新运行公式的脚本问题谢谢,这太完美了。感谢您对我的耐心。另外,正如您所说,Wait() 的帮助位于帮助中,而不是脚本索引中。
回复:重新运行公式的脚本问题我不确定为什么您的原始脚本不会更新公式列中的值。 您可以通过降低循环计数(例如用作最大值)并添加 Wait(1) 来进一步测试这一点;例如,在 <<重新运行公式之后,您应该可以看到数据表中的更改。
这是使用您之前提供的子集表稍微修改的脚本。 由于您不想更精通脚本编写,因此我不会深入解释这里的函数如何工作,但请参阅下面的说明和脚本中的注释,如果需要,我还可以解释更多内容。 此处提供的脚本应该:
- 循环遍历 dt 中找到的所有列并启用对它们的评估以允许对公式列进行重新计算
- 运行拟合模型 100 次并每次使用 <
- 还将使用 Show() 打印要记录的一列的 Col Median()。 这会减慢脚本执行速度,但应该显示列中的值确实发生了变化
- 使用结果创建一张结果表并关闭所有不必要的表和窗口
- 运行循环完成后:隐藏并排除 ProbF > 0.05 的行,然后创建分布
Names Default To Here(1);
dt = Current Data Table();
//dt = Open("Subset of Test data.jmp");
dt << Show Window(0); // should provide slight speed improvement
For Each({col_name}, dt << get column names(String), Column(dt, col_name) << suppress eval(False));
get_stepwise = Expr(
dt << Rerun Formulas;
Show(Col Mean(As Column(dt, :Column 2 001))); //will slow down script execution, but shows that values in Column 2 001 should change
Show(Col Mean(As Column(dt, :Column 2 010)));
fm = dt << Fit Model(
Y(:Y),
Effects(
:Column 2 001, :Column 2 002, :Column 2 003, :Column 2 004, :Column 2 005, :Column 2 006, :Column 2 007, :Column 2 008, :Column 2 009,
:Column 2 010
),
Personality("Stepwise"),
Run,
SendToReport(Dispatch({}, "Step History", OutlineBox, {Close(1)})),
Invisible // should provide slight speed improvement
);
dt_result = Report(fm)[Outline Box("Stepwise Fit for Y")][Outline Box("Current Estimates")][Table Box(1)] << Make Into Data Table(invisible);
dt_result << New Column("Loop", Numeric, Continuous, <<SET each="" value="">F\!""n > 0.05) << Hide And Exclude(1) << Clear Select;
// plot distribution
dt_collector << Distribution(Stack(1), Nominal Distribution(Column(:Parameter), Horizontal Layout(1), Vertical(0)));</SET>
至少在我的设置(快速 PC、Windows 10 和 JMP16.2)上,该脚本似乎不需要 Wait(0)。 对我来说,似乎公式值确实得到了重新评估
结果:

Wait() 的脚本索引,单击“主题帮助”有时会提供更多信息(如果是 Wait(),它会提供更多信息)

JMP 帮助 - 等待(n) “指定等待(0)启用一个消息处理周期。”
回复:重新运行公式的脚本问题我表中的公式没有被抑制。您能详细解释一下您建议我添加的命令吗?我对脚本几乎完全无知(并且真的不想花时间变得更加熟练 - 不要花精力告诉我为什么我应该这样做 - 我在很多方面都是一个特例)。我是在 { } 中放入一个列名还是将所有 6 列(用 , 或 ; 分隔)?我需要用任何东西替换 String 吗?并且,我是否要为抑制 eval (false) 命令单独列出列?
关于 wait() 我尝试失败,但我在 wait() 命令的脚本索引中找不到任何文档。
回复:重新运行公式的脚本问题只是为了确保对该列进行评估,请在 For 循环之前添加此内容(如果您使用的是早于 JMP16 的版本,请将 For Each 更改为 For):
For Each({col_name}, dt << get column names(String),
Column(dt, col_name) << suppress eval(False)
);
在表中,我打开的公式列已抑制评估,但这可能只是下载文件的安全功能。
如果必须添加 wait(0),则可以在开始时做得有点过多,几乎在 for 循环内的每一行之后添加它。 通常在 JMP 中不需要它,但也有一些情况需要它。
回复:重新运行公式的脚本问题我已附上文件。看起来我在正确的位置插入了重新运行公式,但它不起作用。Wait 如何以及去哪里?
回复:重新运行公式的脚本问题重新运行公式应该可以工作,也许您需要在某处添加 wait(0) ? 在没有看到数据表的情况下,测试问题可能出在哪里有点困难(行数、列数、复杂的公式、随机种子由于某种原因没有改变)。
通过这个简单的示例,值似乎更新得很好:
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(5),
New Column("Column1", Numeric, "Continuous", Format("Best", 12), Formula(Random Normal(1, 1))),
New Column("Column2", Numeric, "Continuous", Format("Best", 12), Formula(Random Normal(2, 1)))
);
For(i = 1, i <= 3, i++,
dt << Rerun Formulas;
Show(dt:Column1 << get as matrix);
Show(dt:Column2 << get as matrix);
fm = dt << Fit Model(
Y(:Column1),
Effects(:Column2),
Personality("Stepwise"),
Run,
SendToReport(Dispatch({}, "Step History", OutlineBox, {Close(1)}))
);
dt_result = Report(fm)[Outline Box("Stepwise Fit for Column1")][Outline Box("Current Estimates")][Table Box(1)] << Make Into Data Table;
fm << close window;
//dt_result << Close Window;
);