2017-08-09 53 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調用獲得Hessian

我也在尋找到fdHess功能(也來自同一pacakge),其中「評估採用有限差分標量函數的近似Hessian和梯度」將這個相當於什麼功能nlme目前正在實施?

回答

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允許返回麻袋也一樣,如果我打印,我得到:

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

如果你想知道我是怎麼印,就我而言,我的編輯nlme.formula和分配我的新版本被調用函數的粗麻布nlme.formula_new,我再插回nlme

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

godmode是在Github上,但肯定還有其他的方式來實現這一目標。