如何使用多個參數擬合定制的非線性模型我有一個非線性模型,我為其創建了一個帶有以下公式的新列。 該模型被描述為類似於具有兩個定義階段的 S 形曲線,其中我有三個參數來表徵每個階段。 初始階段由 K1、Y1 和 P1 參數描述,第二階段由 K2、Y2 和 P2 參數描述。 另外,對於每個參數,我建立了一個新列,並將初始值指定為 0.1 以方便擬合(不在下面的腳本中)。 然而,樣本之間的值可能有很大差異,從 0 到 1。
我有一個樣本列表,我需要為其擬合相同的模型並根據最佳擬合檢索這些參數值。 我想根據最小 RMSE 或最大 R2 來測量最佳擬合。 但是,我不知道該怎麼做。 我為損失函數創建了一個列,我將其計算為實驗數據(:生產)和模型(:模型)之間的 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 會自動對觀測響應與預測響應之間的差異進行平方。
我認為你的參數估計會很高,因此很難收斂。 同樣,在嘗試使用腳本自動化之前,我會使用非線性互動方式解決該問題。
您可能需要聯絡 JMP 技術支援來解決此問題。 (support@jmp.com)
回覆:如何使用多個參數擬合客製化的非線性模型是的,這就是我正在使用的模型。那我應該使用什麼函數來指定損失函數?回覆:如何使用多個參數擬合客製化的非線性模型這是您想要擬合的模型嗎:

損失函數不應使用 SSQ() 函數。 非線性平台會自動合併每行的損失。
回覆:如何使用多個參數擬合客製化的非線性模型起始值是根據 Excel Solver 對相同資料所獲得的結果所使用的。
令人有點驚訝的是,JMP 沒有獲得類似的結果,或者沒有實現良好的收斂。 此外,JMP 很難使用損失函數運行迭代,並最終崩潰。 當沒有損失函數運行時,它不會實現任何收斂。
回覆:如何使用多個參數擬合客製化的非線性模型還有一條評論:我建議以互動方式使用非線性,直到確定最佳設定為止。 與嘗試讓腳本同時運作相比,這種方式可能會更快、更容易。 然後您可以保存腳本以繼續開發。
回覆:如何使用多個參數擬合客製化的非線性模型首先,「完成」選項並不意味著永遠進行。 這與單擊使用者介面中的“執行”按鈕而不是“步驟”按鈕相同。 一直持續到達到其中一項停止規則(標準)為止。 迭代次數的預設限制為 60。 您可以再次運行以使非線性更加努力以獲得良好的解決方案。 如有必要,您也可以更改(放寬或加強)其他標準。
其次,收斂緩慢可能表示初始值選擇不當。 您如何確定資料的這些值?
回覆:如何使用多個參數擬合客製化的非線性模型我對 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>