nls
fitting
Rでやりたいタスクがあります。ここでこれを行う最初の試みと@Rolandが指摘したように
「要点は、複雑なモデルは当てはめが難しいということです。そうであるほど、データがモデルをサポートしなくなり、不可能になります。非常に良い開始値があれば、これを当てはめることができるかもしれません。」
私は@Rolandに同意excel
できますが、このフィッティングができるのであれば、できR
ないのはなぜですか?
基本的に、このフィッティングは Excel の GRG Nonlinear ソルバーで実行できますが、プロセスに非常に時間がかかり、フィッティングがうまくいかない場合もあります。(実際にはたくさんのデータがあるため)。
これが私のサンプルdata.frameです。set
各グループを以下に示すモデルに当てはめたいと思います。
set.seed(12345)
set =rep(rep(c("1","2","3","4"),each=21),times=1)
time=rep(c(10,seq(100,900,100),seq(1000,10000,1000),20000),times=1)
value <- replicate(1,c(replicate(4,sort(10^runif(21,-6,-3),decreasing=FALSE))))
data_rep <- data.frame(time, value,set)
> head(data_rep)
# time value set
#1 10 1.007882e-06 1
#2 100 1.269423e-06 1
#3 200 2.864973e-06 1
#4 300 3.155843e-06 1
#5 400 3.442633e-06 1
#6 500 9.446831e-06 1
* * * *
試行 1
私はすでにここに質問を投稿しました。
基本的に問題は、グループ化されたデータでフィッティングを行い、フィッティング係数に基づいて予測を行いたかったことです。
から使用nlsLM
しlibrary(minpack.lm)
ました エラーが発生しました
nlsModel(formula, mf, start, wts, upper) のエラー: 初期パラメータ推定値での特異勾配行列
@Rolandによると、一見したところ、モデルエラーまたは私の開始値が良くなかったのかもしれません。一方、このモデルは 2 つのフィッティング パラメーターのみでフィッティングできました。問題はthird
、フィッティング関数にパラメーターを追加したいときに発生します。
試行 2
その投稿で、@ G をフォローして、トラブルを追加するときに 3rd-fitting-parameter-in-nls を追加します。Grothendieck の提案、私はパッケージnlxb
から試しnlmrt
、パラメーターの 1 つを に修正し、次のようにフィッティングを行いましたd
。d=32
formula = value~Ps*(1-exp(-2*f*time*exp(-d)))*1/(sqrt(2*pi*sigma))*exp(-(d-d_ave)^2/(2*sigma))*d_step
d_step <- 1
f <- 1e9
d <- 32
library(plyr)
library(nlmrt)
get.coefs <- function(data_rep) {
fit <- nlxb(formula ,
data = data_rep,
start=c(d_ave=44,sigma=12,Ps=0.5),
lower=c(d_ave=25,sigma=2,Ps=0.5),
upper=c(d_ave=60,sigma=15,Ps=1),
trace=TRUE)
}
fit <- dlply(data_rep, c("set"), .fun = get.coefs) # Fit data grouped by "set"
# > fit
# $`1`
# nlmrt class object: x
# residual sumsquares = 1.474e-07 on 21 observations
# after 12 Jacobian and 13 function evaluations
# name coeff SE tstat pval #gradient JSingval
# d_ave 42.0126 NA NA NA #-7.082e-15 0.001733
# sigma 12.8377 NA NA NA #2.408e-15 1.289e-19
# Ps 0.973223 NA NA NA #9.33e-15 3.37e-20
#
# $`2`
# nlmrt class object: x
# residual sumsquares = 6.2664e-08 on 21 observations
# after 12 Jacobian and 13 function evaluations
# name coeff SE tstat pval #gradient JSingval
# d_ave 42.246 NA NA NA #-7.269e-15 0.001428
# sigma 12.7429 NA NA NA #2.568e-15 3.098e-19
# Ps 0.981517 NA NA NA #9.211e-15 2.746e-20
#
# $`3`
# nlmrt class object: x
# residual sumsquares = 1.773e-07 on 21 observations
# after 12 Jacobian and 13 function evaluations
# name coeff SE tstat pval #gradient JSingval
# d_ave 41.968 NA NA NA #-6.438e-15 0.001798
# sigma 12.8561 NA NA NA #2.173e-15 2.414e-19
# Ps 0.972988 NA NA NA #8.534e-15 5.922e-20
# $`4`
# nlmrt class object: x
# residual sumsquares = 2.5219e-07 on 21 observations
# after 12 Jacobian and 13 function evaluations
# name coeff SE tstat pval #gradient JSingval
# d_ave 41.8532 NA NA NA #-4.454e-15 0.001976
# sigma 12.9045 NA NA NA #1.474e-15 3.443e-19
# Ps 0.974319 NA NA NA #5.987e-15 3.124e-20
# attr(,"split_type")
# [1] "data.frame"
# attr(,"split_labels")
# set
# 1 1
# 2 2
# 3 3
# 4 4
フィッティング係数は妥当ですwolaa! しかし、今回、(@G. Grothendieck も後で指摘しました) 後の新しい値を予測することは不可能であることに気付きましたnlxb
(なぜ=? わかりません!)
predvals <- ldply(fit, .fun=predictvals, xvar="time", yvar="value",xrange=range(range)) # predict values
::ここpredictvals
から機能を見つけることができます
UseMethod("predict") のエラー: クラス "nlmrt" のオブジェクトに適用される 'predict' に適用可能なメソッドがありません
ここにはない!coef
またはクラスオブジェクトの場合predict methods
。"nlmrt"
試行 3
@Gをフォローした後。Grothendieckwrapnls
から次に試した別の提案nlmrt
。
この投稿で彼が述べたので、 can-we-make-prediction-with-nlxb-from-nlmrt-package
「nlmrtパッケージwrapnls
が実行するものをnlmrt
提供nls
し、"nls"
オブジェクトが結果として得られ、そのオブジェクトをすべての"nls"
クラスメソッドで使用できるため.
以下のようにまだ問題がある同じnlmrt
パッケージから
ロードが問題をより複雑にしているためplyr
、最初の投稿の後、使用を断念しました。そのため、代わりに function に固執して使用します。plyr
dplyr
dplyr
do
library(dplyr)
library(nlmrt)
formula = value~Ps*(1-exp(-2*f*time*exp(-d)))*1/(sqrt(2*pi*sigma))*exp(-(d-d_ave)^2/(2*sigma))*d_step
d_step <- 1
f <- 1e9
d <- 32
dffit = data_rep %>% group_by(set) %>%
do(fit = wrapnls(formula ,
data = .,
start=c(d_ave=44,sigma=12,Ps=0.5),
lower=c(d_ave=25,sigma=2,Ps=0.5),
upper=c(d_ave=60,sigma=15,Ps=1),
trace=TRUE))
nlsModel(formula, mf, start, wts, upper) のエラー: 初期パラメータ推定値での特異勾配行列
このエラーで開始した場所に戻りました。関連する例を探し(ただし 3 つだけ)、本を読み、提案に従って、できることはすべて試したと思います。