少し前にこの質問をしました。これを回答として投稿するか、新しい質問として投稿するかがわかりません。答えはありませんが、nls.lm
Rを使用してLevenberg-Marquardtアルゴリズムを適用することで問題を「解決」し、解決策が境界にある場合は、信頼領域反射アルゴリズム(Rで実装されたTRR)を実行してステップを実行しますそれから離れてください。今、私は新しい質問があります。
私の経験から、この方法でプログラムは最適に到達し、開始値にそれほど敏感ではありません。しかし、これは、私が遭遇した問題やRの他の最適化関数を回避するための実用的な方法にすぎません。境界制約のある最適化問題に対して がこのように動作する理由と、実際に使用するときに境界制約を処理する方法をnls.lm
知りたいです。.nls.lm
nls.lm
次に、 を使用して 2 つの問題を説明する例を示しましたnls.lm
。
- 開始値に敏感です。
- 一部のパラメータが境界に達すると停止します。
再現可能な例: フォーカス データセット D
library(devtools)
install_github("KineticEval","zhenglei-gao")
library(KineticEval)
data(FOCUS2006D)
km <- mkinmod.full(parent=list(type="SFO",M0 = list(ini = 0.1,fixed = 0,lower = 0.0,upper =Inf),to="m1"),m1=list(type="SFO"),data=FOCUS2006D)
system.time(Fit.TRR <- KinEval(km,evalMethod = 'NLLS',optimMethod = 'TRR'))
system.time(Fit.LM <- KinEval(km,evalMethod = 'NLLS',optimMethod = 'LM',ctr=kingui.control(runTRR=FALSE)))
compare_multi_kinmod(km,rbind(Fit.TRR$par,Fit.LM$par))
dev.print(jpeg,"LMvsTRR.jpeg",width=480)
モデル/システムを記述する微分方程式は次のとおりです。
"d_parent = - k_parent * parent"
"d_m1 = - k_m1 * m1 + k_parent * f_parent_to_m1 * parent"
左側のグラフは初期値を使用したモデル、中央は "TRR" (Matlablsqnonlin
関数のアルゴリズムと同様) を使用した近似モデル、右側は "LM" を使用した近似モデルnls.lm
です。適合した parameters( ) を見ると、1 つの適合した parameter( ) が境界にFit.LM$par
あることがわかります。1 つのパラメーターの開始値を0.1 から 100 に変更すると、 and を使用して同じ結果が得られました。このようなケースがたくさんあります。f_parent_to_m1
1
M0_parent
nls.lm
lsqnonlin
newpars <- rbind(Fit.TRR$par,Fit.LM$par)
rownames(newpars)<- c("TRR(lsqnonlin)","LM(nls.lm)")
newpars
M0_parent k_parent k_m1 f_parent_to_m1
TRR(lsqnonlin) 99.59848 0.09869773 0.005260654 0.514476
LM(nls.lm) 84.79150 0.06352110 0.014783294 1.000000
上記の問題を除いて、によって返されるヘッセ行列がnls.lm
可逆でないことがよくあります (特に、いくつかのパラメーターが境界上にある場合)。そのため、共分散行列の推定値を取得できません。一方、"TRR" アルゴリズム (Matlab 内) は、ほとんどの場合、解点でヤコビアンを計算することによって推定を行います。これは便利だと思いますが、R 最適化アルゴリズム (私が試したもの) が何らかの理由でこれを行わなかったことも確かです。パラメータ推定値の標準誤差を得るために共分散行列を計算する Matlab の方法を使用して、私が間違っているかどうかを知りたいです。
最後の注意点として、私は以前の投稿で、ほぼすべてのケースで Matlablsqnonlin
が R の最適化関数よりも優れていると主張しました。私は間違っていた。上記の例からわかるように、Matlab で使用される「Trust-Region-Reflective」アルゴリズムは、R でも実装されている場合、実際には遅くなります (場合によってははるかに遅くなります)。ただし、R の基本的な最適化アルゴリズムよりも安定しており、より優れたソリューションに到達します。