Cross Validated is a question and answer site for people interested in statistics, machine learning, data analysis, data mining, and data visualization. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Does anybody know why it is not possible to compute standardized residuals when estimating a Tobit model?

Here is a short example of what I am talking about:

> require(AER)   # for tobit estimation commands
> require(MASS)  # for computing standardized residuals
> numberofdrugs <- rpois(84, 5)+1
> healthvalue <- rpois(84,5)
> tob <- tobit(healthvalue ~ numberofdrugs)
> residuals(tob) # works fine
> stdres(tob)    # doesn't work fine

Where is the problem?

share|improve this question
up vote 6 down vote accepted

The problem is in assuming that stdres() will work for a tobit regression. The reason resid() works for tob is that the type of object returned by tobit() inherits from class "survreg":

R> class(tob)
[1] "tobit"   "survreg"

and there is a special residuals() method for objects of that class:

R> methods(residuals)
 [1] residuals.breakpointsfull* residuals.coxph*          
 [3] residuals.coxph.null*      residuals.coxph.penal*    
 [5] residuals.default          residuals.glm             
 [7] residuals.HoltWinters*     residuals.isoreg*         
 [9] residuals.lm               residuals.loglm*          
[11] residuals.nls*             residuals.smooth.spline*  
[13] residuals.survreg*         residuals.survreg.penal*  
[15] residuals.tukeyline*      

   Non-visible functions are asterisked

("survreg" is there as number 13.)

stdres() is (or at least appears to me to be) limited to the linear model case, and one could argue that a tobit model is not a linear regression. From ?stdres we have:


  object: any object representing a linear model.

That this is the case is seen more clearly when one looks at lmwork(), the function that does the work in stdres(), which on the second line of the code for that function, lm.influence() is called, and that is where stdres() is failing (output from debugging lmwork() and calling stdres(tob):

Browse[2]> n
debug: resid <- object$residuals
debug: hat <- lm.influence(object, do.coef = FALSE)$hat
Error in if (model$rank == 0) { : argument is of length zero

I'm not familiar with survival models nor tobit regression. Read ?residuals.survreg and see if that is doing the right thing regarding standardising the residuals (there is something in there about using sigma). otherwise you might have to cook this yourself or contact the author of the survival package for suggestions as to how to compute the standardised residuals that you want.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.