如何使用多個參數擬合自定義非線性模型我有一個非線性模型,我為其創建了一個包含以下公式的新列。 該模型被描述為類似於具有兩個定義階段的 S 形曲線,我有三個參數來表徵每個階段。 初始階段由 K1、Y1 和 P1 參數描述,第二階段由 K2、Y2 和 P2 參數描述。 此外,對於每個參數,我都創建了一個新列,並賦予初始值 0.1 以方便擬合(不在下面的腳本中)。 但是,從 0 到 1 的樣本之間的值可能會有很大差異。
我有一個樣本列表,我需要為其擬合相同的模型並根據最佳擬合檢索這些參數值。 我想根據最小 RMSE 或最大 R2 測量最合適的值。 但是,我不知道該怎麼做。 我為損失函數創建了一個列,我將其計算為實驗數據 (:Production) 和模型 (:Model) 之間的 SSQ,希望這對擬合模型有所幫助。
col7 = New Column("Model");
col7<< set formula (Parameter({Y1_Y1_0 = 0.001, K1_K1_0 = 0.001, P1_P1_0 = 0.001, Y2_Y2_0 = 0.001, K2_K2_0 = 0.001, P2_P2_0 = 0.001},
Y1_Y1_0 * Exp(-Exp(((K1_K1_0 * Exp()) / Y1_Y1_0) * (P1_P1_0 - :Days))) + Y2_Y2_0 * Exp(-Exp(((K2_K2_0 * Exp()) / Y2_Y2_0) * (P2_P2_0 - :Days)))));
col8=newcolumn("Error");
col8<< set Formula(SSQ(:Production - :Model));
col8<<EVALFORMULA></EVALFORMULA>
作為將模型擬合到一個樣本時生成的腳本的示例
Nonlinear(
Y( :Methane Yield ),
X( :Model ),
Loss( :Err ),
Iteration Limit( 1000 ),
Numeric Derivatives Only( 1 ),
Unthreaded( 1 ),
Loss is Neg LogLikelihood( 1 ),
Newton,
Finish,
Where( :Sample == "M301" )
);
我正在嘗試使這些分析自動化,因為我現在一直在使用 Excel Solver。
有人可以提供一些反饋,說明如何通過數據表中的所有樣本自動運行模型擬合,並檢索 RSME 何時最小(如果損失函數最小時我是正確的)或 R2 最大時的參數?
每列中的參數值會自動更新嗎?
謝謝
伊沃
回复:如何使用多個參數擬合定制的非線性模型謝謝。回复:如何使用多個參數擬合定制的非線性模型默認損失函數是最小二乘法,因此 JMP 會自動對觀察到的響應和預測響應之間的差異進行平方。
我認為你的參數估計會很高,所以很難收斂。 同樣,在嘗試使用腳本自動化之前,我會使用 Nonlinear 交互式解決問題。
您可能需要就此問題聯繫 JMP 技術支持。 (support@jmp.com)
回复:如何使用多個參數擬合定制的非線性模型是的,這就是我正在使用的模型。那麼我應該使用什麼函數來指定損失函數?回复:如何使用多個參數擬合定制的非線性模型這是您要擬合的模型嗎:

損失函數不應使用 SSQ() 函數。 非線性平台會自動合併每一行的損失。
回复:如何使用多個參數擬合定制的非線性模型起始值是根據在 Excel Solver 上針對相同數據獲得的結果使用的。
JMP 沒有取得類似的結果或沒有取得良好的收斂性,這有點令人驚訝。 此外,JMP 難以使用損失函數運行迭代並最終崩潰。 在沒有損失函數的情況下運行它時,它不會實現任何收斂。
回复:如何使用多個參數擬合定制的非線性模型另一條評論:我建議以交互方式使用非線性,直到您確定最佳設置。 與嘗試讓腳本同時工作相比,這種方式可能會更快更容易。 然後您可以保存腳本以繼續開發。
回复:如何使用多個參數擬合定制的非線性模型首先,Finish 選項並不意味著永遠走下去。 這與在用戶界面中單擊“開始”按鈕而不是“步驟”按鈕相同。 直到達到其中一個停止規則(標準)為止。 迭代次數的默認限制為 60。 您可以再次運行,使 Nonlinear 更加努力地工作以獲得良好的解決方案。 如有必要,您還可以更改(放寬或加強)其他標準。
其次,收斂緩慢可能表明初始值選擇不當。 您如何確定數據的這些值?
回复:如何使用多個參數擬合定制的非線性模型我在 JSL 上的經驗很少。 不幸的是我才剛剛開始。 我正在使用 JMP14。 感謝您的反饋。
我已經按照您的建議(如下)修改了您的腳本並運行了它。 它確實給了我估計值,但它直到“無限”才運行迭代,因為我認為命令 :Finish 會請求。 那是對的嗎? 它只會持續到 60 歲。 因此,輸出擬合不是很好,參數估計偏高或為負,這意味著我可能需要設置參數約束
obj = Nonlinear(Y( :Methane Yield ), X( :Model ), Loss( :Err ), Finish(), By( :Sample ));
obj << go;
obj << get estimates;
_xx = obj << Xpath("//OutlineBox[@helpKey='Nonlinear Solution']");
fit_dt = (_xx[1]<<FIND></FIND>回复:如何使用多個參數擬合定制的非線性模型關於非線性建模,我只熟悉設置一個收斂準則,一個目標。許多年前,當計算能力與今天相比還很弱時,我通常使用 SAS 創建一個包含多個起始估計的循環,然後比較殘差結果。 所以我不能幫助你的“最佳模型”請求。
您沒有提到您使用的是哪個版本的 JMP,也沒有提到您的腳本編寫知識。 要理解此腳本,您需要了解一些基本語法。 以下是 JMP 腳本索引>對象>非線性>CopyByGroupScript 中腳本的修改。
它 :
- 創建一個“by”列,對於您的示例,這將是您的 :Sample 列
- 為報告 obj 分配句柄/引用。在這裡你會使用你的腳本改變其中(:樣品==“M301”)到通過(:示例)
- 演示如何使用“get”語句創建結果列表。 看JMP 腳本索引>對象>可用消息的非線性。
- 或者,您可以製作結果表。JMP 報告 (obj) 是顯示框的嵌套列表。 例如,在 GUI 中,如果您有一個特定的表格框,可以逐個分組,然後右鍵單擊並選擇“製作組合數據表”,那麼這個 JSL 也會做同樣的事情。Xpath 是一種通用的查找顯示框的方法。 Find 不太靈活,但在句法上更易於閱讀。 下面的 Xpath 語句返回作為解決方案的 obj 報告中每個輪廓框的句柄/引用。 每個解決方案大綱框都有 2 個表格框,我知道看結構。我所需要的只是這些表格框的第一次出現 ecah 發送消息以製作組合數據表格。
這應該給你一個起點。首先運行下面的腳本以確保它在您的 JMP 版本上運行,然後進行修改。 這是此示例腳本的估算表的圖片。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Nonlinear Examples/US Population.jmp" );
dt << New Column( "_bycol",
Character,
Nominal,
set values( Repeat( {"A", "B"}, N Rows( dt ) )[1 :: N Rows( dt )] )
);
obj = Nonlinear( Y( :pop ), X( :Name( "X-formula" ) ), Finish(), By( _bycol )) ;
obj << go;
//returns a list of vectors where each vector, contains the parameters estimates
obj << get estimates;
//also see Get SSE, Get Parameter Names, Get CI
//Alternately, make a table
_xx = obj << Xpath("//OutlineBox[@helpKey='Nonlinear Solution']");
//only 2 groups so only 2 are found; each contains two sub tables
fit_dt = (_xx[1]<<FIND></FIND>