1

Need to estimate two parameters using the nlm function;

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

where hood2par is a modified logistic

The convergence of nlm depends on the starting values ​​of these parameters. To find such initial values I ​​automatically generate two vectors of starting values

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

next I create a routine included in a double for() to find the values ​​that lead to the convergence of the function:

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))}} 

The problem I have is that when I include the previous routine in a function:

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)
}

I can´t get the 'fit' values from FFF():

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

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

I used stopifnot(is.null(fit)) to stop the loops when fit is not NULL (as fit is defined as a NULL object before try(...)). Regarding the try code you have shared, I just need this;

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

I tried to include the break function in the second argument of the condictional, but it doesn´t run in my R version...Any idea??

Robert Harvey
  • 178,213
  • 47
  • 333
  • 501
jrs-x
  • 336
  • 1
  • 2
  • 10

1 Answers1

4

When you call FFF, inside the try block if nlm successfully completes, then fit is assigned, and the stopifnot condition is activated, throwing an error.

Wildly guessing, did you mean

stopifnot(!is.null(fit))

For future reference, a standard chunk of code for use with try is

res <- try(some_expression)
if(inherits(res, "try-error"))
{
  #some error handling code
} else
{
  #normal execution
}
Richie Cotton
  • 118,240
  • 47
  • 247
  • 360