2017-08-09 4 views
13
library(nlme) 
fm1 <- nlme(height ~ SSasymp(age, Asym, R0, lrc), 
      data = Loblolly, 
      fixed = Asym + R0 + lrc ~ 1, 
      random = Asym ~ 1, 
      start = c(Asym = -10311111, R0 = 8.5^4, lrc = 0.01), 
      verbose = TRUE) 

**Iteration 1 
LME step: Loglik: -312.2787, nlminb iterations: 23 
reStruct parameters: 
    Seed 
10.41021 
Error in nlme.formula(height ~ SSasymp(age, Asym, R0, lrc), data = Loblolly, : 
    Singularity in backsolve at level 0, block 1 

nlmeのモデルがヘッセ行列を調べて正常に適合しない理由を調べようとしています。何とかこの行列を抽出する方法はありますか?R:nlmeコールからヘッセ行列を得るには

また、私は、これは現在の関数nlmeに実装されているものと同等になり、「有限差分を使用して、スカラー関数の近似ヘッセ行列や勾配を評価する」(も同じ可能パッケージから)fdHess機能、に探していますか?

答えて

0

私はここでまず最初に行うには、コントロールの外観を持つことであると思う:

nlmeControl() 

# this gives in my case the following settings 
$maxIter 
[1] 50 

$pnlsMaxIter 
[1] 7 

$msMaxIter 
[1] 50 

$minScale 
[1] 0.001 

$tolerance 
[1] 1e-05 

$niterEM 
[1] 25 

$pnlsTol 
[1] 0.001 

$msTol 
[1] 1e-06 

$returnObject 
[1] FALSE 

$msVerbose 
[1] FALSE 

$gradHess 
[1] TRUE 

$apVar 
[1] TRUE 

$.relStep 
[1] 6.055454e-06 

$minAbsParApVar 
[1] 0.05 

$opt 
[1] "nlminb" 

$natural 
[1] TRUE 

$sigma 
[1] 0 

私は任意のドキュメントを読んでいないが、あなたは、少なくとものよりよい手がかりを得るために、以下のことを実行することができ状況:これは、すべての反復のためにあなたの出力を印刷し

# using additional controls list argument 
fm1 <- nlme(
    height ~ SSasymp(age, Asym, R0, lrc), 
    data = Loblolly, 
    fixed = Asym + R0 + lrc ~ 1, 
    random = Asym ~ 1, 
    start = c(Asym = -10311111, R0 = 8.5^4, lrc = 0.01), 
    control = list(opt = "nlm", msVerbose = 2, msTol = 1e-06), 
    verbose = TRUE 
) 

、最終的には:

# ............ 
iteration = 9 
Parameter: 
[1] 7.180326 
Function Value 
[1] 379.1821 
Gradient: 
[1] -4.212256e-05 

Relative gradient close to zero. 
Current iterate is probably solution. 


**Iteration 1 
LME step: Loglik: -312.2787, nlm iterations: 9 
reStruct parameters: 
    Seed 
7.180326 
Error in nlme.formula(height ~ SSasymp(age, Asym, R0, lrc), data = Loblolly, : 
    Singularity in backsolve at level 0, block 1 

msTolや他のコントロールも変更したいと思うかもしれません。 nlmは、私は私が得ることを印刷する場合、あまりにもヘッセ行列を返すことができますことに注意してください:あなたは、私は、私の部分のために、私はnlme.formulaを編集していますし、呼び出された関数に私の新しいバージョンを割り当てる印刷ヘッセ行列を得た方法だろ場合

$hessian 
      [,1] 
[1,] 8.478483e-05 

godmode:::assignAnywhere("nlme.formula", nlme.formula_new) 

godmodeはGithubの上ですが、確かにこれを達成するための他の方法があります。私は当時nlmeに差し込むnlme.formula_new

関連する問題