Подтвердить что ты не робот

R: как получить Гессиан от вызова nlme

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 не подходят успешно, глядя на гессиан. Есть ли способ извлечь эту матрицу?

Я также рассматриваю функцию fdHess (также из той же pacakge), которая "оценивает приближенный гессиан и градиент скалярной функции с использованием конечных разностей" будет ли это эквивалентно тому, что в настоящее время реализовано в функции nlme?

4b9b3361

Ответ 1

Я думаю, что первое, что нужно сделать, это взглянуть на элементы управления:

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, если я печатаю, что получаю:

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

Если вам интересно, как я напечатал hessian, со своей стороны я редактирую nlme.formula и назначая свою новую версию функции под названием nlme.formula_new, которую затем подключаю обратно к nlme:

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

godmode находится на Github, но наверняка есть другие способы достижения этого.