重新運行公式的腳本問題我在之前的帖子中問過這個問題,但那是幾週前的事了,所以可能不會引起注意。我懷疑這對於這個組來說是一個簡單的腳本問題。下面是一個腳本(由 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;
);