开发者

selection of nlm starting values problem

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 hood2开发者_开发问答par 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??


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜