1

nls fittingRでやりたいタスクがあります。ここでこれを行う最初の試みと@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

私はすでにここに質問を投稿しました

基本的に問題は、グループ化されたデータでフィッティングを行い、フィッティング係数に基づいて予測を行いたかったことです。

から使用nlsLMlibrary(minpack.lm)ました エラーが発生しました

nlsModel(formula, mf, start, wts, upper) のエラー: 初期パラメータ推定値での特異勾配行列

@Rolandによると、一見したところ、モデルエラーまたは私の開始値が良くなかったのかもしれません。一方、このモデルは 2 つのフィッティング パラメーターのみでフィッティングできました。問題はthird、フィッティング関数にパラメーターを追加したいときに発生します。

試行 2

その投稿で、@ G をフォローして、トラブルを追加するときに 3rd-fitting-parameter-in-nls を追加します。Grothendieck の提案、私はパッケージnlxbから試しnlmrt、パラメーターの 1 つを に修正し、次のようにフィッティングを行いましたdd=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 に固執して使用します。plyrdplyrdplyrdo

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 つだけ)、本を読み、提案に従って、できることはすべて試したと思います。

4

1 に答える 1

2

このようnls2にnls2パッケージから使用します(質問から、、、、と仮定します )。例を最小限にするために、dplyr を削除し、set == 2 の計算のみを示しています。nlxbdata_repformulad_stepfd

library(nlmrt)
library(nls2)

data_rep2 <- subset(data_rep, set == 2)

fit.nlxb <- nlxb(formula , data = data_rep2,
                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))

fit.nls <- nls2(formula, data = data_rep2, start = fit.nlxb$coefficients,
  algorithm = "brute-force")

identical(fit.nlxb$coefficients, coef(fit.nls))
## [1] TRUE

fit.nlsはand と"nls"同じ係数を持つクラス オブジェクトであり、andおよびその他すべてのメソッドをfit.nlxb使用できます。fitted()predict()"nls"

于 2016-05-11T00:49:56.637 に答える