Проблема выбора начальных значений 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
}