проблема выбора начальных значений nlm - PullRequest
1 голос
/ 24 августа 2011

Необходимо оценить два параметра, используя функцию 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)
}

, я не могу получить значения '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)), чтобы остановить циклы, когда подгонка не равна NULL (поскольку подгонка определяется как объект 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 Ответ

4 голосов
/ 24 августа 2011

Когда вы вызываете 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
}
...