I think this is a poorly chosen data set for exploring the advantages of zero inflated models, because, as you note, there isn't that much zero inflation.
plot(fitted(fm_pois), fitted(fm_zinb))
shows that the predicted values are almost identical.
In data sets with more zero-inflation, the ZI models give different (and usually better fitting) results than Poisson.
Another way to compare the fit of the models is to compare the size of residuals:
boxplot(abs(resid(fm_pois) - resid(fm_zinb)))
shows that, even here, the residuals from the Poisson are smaller than those from the ZINB. If you have some idea of a magnitude of the residual that is really problematic, you can see what proportion of the residuals in each model are above that. E.g. if being off by more than 1 was unacceptable
sum(abs(resid(fm_pois) > 1))
sum(abs(resid(fm_zinb) > 1))
shows the latter is a bit better - 20 fewer large residuals.
Then the question is whether the added complexity of the models is worth it to you.
I suspect that your problem may be that the default behavior of predict.glm
isn't what you think it is.
Specifically, predict
used on a glm
object will by default gives a response on the scale of the linear predictors, not the response.
This is quite clearly stated in the help (?predict.glm
) but seems to trip people up very often (suggesting the default ought to be changed, perhaps; you might like to raise it on the relevant mailing list).
To get the values you want, try predict(model1,type="response")
Best Answer
From another post (here: Error "system is computationally singular" when running a glm), and based on the number of predictor variables you have in your model, I would suggest you look for collinear predictors in your model, or whether you are trying to fit a model with more variables than observations.