Ответ 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, но наверняка есть другие способы достижения этого.