I am working on a data which contain nearly 80% of zeros and positive counts as large as 7. The dataset is very large, nearly 16,000 cases. It is a health related data. I have fitted ZIP, ZINB and Hurdle models on it with five covariates, same for zero and positive counts. Later I have fitted negative binomial and Poisson on the data for same covariates. All the covariates were significant on each of the models. As I expected, AIC's are much better (I mean lower) for zero inflated models. So, I was happy. Vuong test also confirms the superiority of ZIP, ZINB and Hurdle models over Poisson and negative binomial models. So, I was happier.

Later I estimated the frequency of counts for each models. I used the following codes:

round(colSums(predict(zip, type=""prob))) #zip is the ZIP model and so on for the latter.
round(colSums(predict(zinb, type="prob")))
round(colSums(predict(hurdle, type="prob")))


table(data$TRUE) # this is for the true counts

Poisson and NB has as good estimate as ZIP, ZINB and Hurdle. Even, NB has somewhat better than ZIP. All were very close to the TRUE counts.

Can anyone please tell me what might be the reason? I really liked the ZI models. I simulated data and explored them in various ways. But now I am kind of shocked! By the way, I have used pscl package for ZI models and glm for Poisson and glm.nb for negative binomial model in R.

  • 2
    $\begingroup$ You have covariates, but you apparently only assess whether your models give the correct total numbers. Have you looked at whether your predictions match the actuals per case, i.e., taking covariates into account? $\endgroup$ Commented Mar 31, 2014 at 8:51
  • $\begingroup$ Thanks Stephan. After fitting the model with covariates, if I predict the probabilities then it returns probabilities for each counts for the given covariates. That is: P(y|x)= 1, P(y|x)=2 and so on which sum to 1. So, I will get a matrix of nXmax_count with predicted probabilities. Row sum should be 1 and column sum should be counts for each 1, 2, .... If a model works better, in case of count data model, it should return counts close to true values. My question was why NB and Poisson works superior or equal to ZI models. But AIC are still much lower for ZI models. Why? $\endgroup$ Commented Mar 31, 2014 at 9:12

1 Answer 1


Expanding on @Stephen 's comment, why do you expect the counts to be better with ZIP or ZINB than with P or NB? Predicting the total counts is not what regression tries to do: It tries to model the dependent variable on the covariates. So, if you want to see if (say) ZINB is better than NB you could (in addition to what you have already done), do something like this (untested code):

plot(x = predprob(nb), y = jitter(data$TRUE))
    plot(x = predprob(zinb), y = jitter(data$TRUE))

and compare them, or combine them in one graph:

nberror <- predprob(nb) - data$TRUE
    zinberror <- predprob(zinb) - data$TRUE
plot(x = nberror, y = zinberror)

to see where ZINB does better and where NB does better. Or you could plot both densities:

lines(density(zinberror, col = 2)

and compare them.

  • $\begingroup$ Thanks @Peter. I appreciate your help. However, I carefully looked at the problem. In usual regression we may look at the predicted values. But in count data it might better to look for counts. Like, true value is 0, but predicted value is 0.16. Also true=1, pred=0.66. Hard to make any conclusion. Anyway, when I used column sum then it gives me the average. But I should have look at covariate specific predicted values. Like, if covariates, say x, y, z, are low how each model works.And compare them with true counts. Now ZIP, Hurdle and ZINB became superior. $\endgroup$ Commented Mar 31, 2014 at 11:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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