1

I have an issue with my RMarkdown script and an iterative application of an ordinal logistic regression fit that is well discussed (the reasons for that is) here and here. I have also tried increasing the maxint to 100 as suggested here to no effect.

I know the overall code is fine as it appears to only be failing on one model out of several hundred so far.

The script breaking error is:

Error in polr(a, data = rData, Hess = TRUE) : 
  attempt to find suitable starting values failed
In addition: Warning messages:
1: glm.fit: algorithm did not converge 
2: glm.fit: fitted probabilities numerically 0 or 1 occurred 

My question is; is there a way to fail a model fit gracefully and report something like cat(Model XY doesn't converge, moving on) AND then continue with the next model in the input list?

I suspect this will involve wrapping the call in conditional test, perhaps one that looks like:

if( polr(...) == FAILS) {
  cat(message)
  return() # exit out of current iteration
} else {
  polr(... # run the model fit normally
}

This is the data and model that is failing:

## Raw Data
T_P <- c(32,34,31,24,40,21,30,31,25,31,18,32,26,26,27,35,22,32,27,28)
T_M <- c(16,6,12,12,13,10,14,14,11,13,5,13,9,13,11,18,11,15,12,13)
E   <- c(10,15,11,15,15,8,14,13,15,12,9,11,13,15,9,15,6,13,6,15)
Q13.1.2 <- c(5,4,5,5,4,4,5,4,3,5,3,4,3,5,4,4,4,5,5,4) # categorical response

## Dataframe of data
rData <- data.frame(T_P,T_M,E,Q13.1.2)

d <- "Q13.1.2"       # dependant variable
c <- "T_P + T_M + E" # sting of covariates
a <- str_c("as.factor(",d,") ~ ", c, sep="") # concat depVar & indVars into model alogrithm

m <- polr(a, data=rData, Hess=TRUE) # build model
Community
  • 1
  • 1
BarneyC
  • 529
  • 4
  • 17

1 Answers1

0

Turns out there is some error handling in R, albeit rudimentary (see here). Following this logic, and remembering the example is actually part of a loop:

tryCatch({
           # this is the test (just run the call in question)
           polr(a, data=rData, Hess=TRUE)
         }, warning = function(w) {
            # this is how tryCatch handles a stop event
            message("Model doesn't fit") # message to console
            modelFail <<- TRUE # set a variable to test                 
         }, error = function(e) {
            # this is tryCatch handing an error event
            message("error!")
         }, finally = {
            # this is what to do in the event of an.. event
            # I'm not using this approach
         })

if(exists("modelFail")){
  cat("DON'T PANIC! The model fit failed, moving on...")
  rm(modelFail) # I clear the flag to reuse in case of another failure in loop
  return()
} else {
    # now it is safe to run the fit as we have handled an error above                  
    m <- polr(a, data=rData, Hess=TRUE) # build model
}
Community
  • 1
  • 1
BarneyC
  • 529
  • 4
  • 17