Проблема выбора начальных значений nlm

Необходимо оценить два параметра с помощью функции nlm;

fit<-nlm(hood2par,c(x01[i],x02[j]),iterlim=300, catch=x[,c(3,4,5)],sp=.5)

где hood2par модифицированная логистика

Сходимость nlm зависит от начальных значений этих параметров. Чтобы найти такие начальные значения, я автоматически генерирую два вектора начальных значений

x01 = seq(-10,-20,-0.1)
x02 = seq(0.1,0.9,0.01)

Затем я создаю подпрограмму, включенную в double для (), чтобы найти значения, которые приводят к сходимости функции:

for (i in 1:length(x01)) { for (j in 1:length(x02)) {

fit <- NULL
try(fit <- nlm(hood2par, c(x01[i],x02[j]), iterlim = 300, catch = x[,c(3,4,5)],
               sp = .5), 
    silent = TRUE)
stopifnot(is.null(fit))}} 

Проблема в том, что когда я включаю предыдущую подпрограмму в функцию:

FFF <- function(x01, x02, catch){
    for (i in 1:length(x01)) { 
        for (j in 1:length(x02)) {
            fit <- NULL
            try(fit <- nlm(hood2par, c(x01[i], x02[j]), iterlim = 300,
                           catch = x[,c(3,4,5)], sp = .5), 
               silent = TRUE) # does not stop in the case of err
            stopifnot(is.null(fit))
        }
     }  
return(fit)
}

Я не могу получить "подходящие" значения из FFF():

> fit.fff<-FFF(x01,x02,catch)
#Error: is.null(fit) is not TRUE 

>fit.fff
fit.fff
Error: object 'fit.fff' not found

я использовал stopifnot(is.null(fit)) остановить циклы, когда fit не равен NULL (так как fit определен как объект NULL перед попыткой (...)). Что касается кода попытки, которым вы поделились, мне просто нужно это;

res <- try(some_expression)
if(inherits(res, "try-error"))
{
  #some code to keep loops running
} else
{
  #stop the loops and gather "res" 
}

Я пытался включить break функция во втором аргументе condictional, но это не работает в моей версии R... Любая идея??

1 ответ

Когда вы звоните FFFвнутри блока try, если nlm успешно завершается, то fit назначен, и stopifnot условие активировано, выдает ошибку.

Дико догадываясь, ты имел ввиду

stopifnot(!is.null(fit))

Для дальнейшего использования, стандартный кусок кода для использования с try является

res <- try(some_expression)
if(inherits(res, "try-error"))
{
  #some error handling code
} else
{
  #normal execution
}
Другие вопросы по тегам