Solved – Confidence intervals for GLMM: bootstrap vs likelihood profile

bootstrapconfidence intervalglmmprofile-likelihood

I've built a relatively large negative binomial GLMM (~50000 observations, 10 covariates in conditional model, 1 covariate as zero-inflation model, 3 random intercepts (650, 26, 26 levels in each group respectively), and a number of random slopes). The model was fitted with the package glmmTMB in R.

I'm trying to build confidence intervals for my covariates, and I'm trying to figure out the advantages of building them by likelihood profile vs bootstrapping. Is there a reason to use one over the other?

Best Answer

tl;dr parametric bootstrap intervals are slightly more reliable, but much slower to compute. I would guess that either would be adequate in your case.

  • Likelihood profile: Likelihood profile confidence intervals are limited by the accuracy of the asymptotic approximation that differences in deviance (-2 * log-likelihood, possibly with an offset based on the saturated model) are $\chi^2$-distributed. In general they should be pretty good if the minimum number of groups in any random-effects grouping variable is large. $n=26$ is "fairly large" (various sources quote $n=40$ or $n=50$ as "large enough not to worry about it all"; Angrist and Pischke's Mostly Harmless Econometrics, which has a Hitchhiker's Guide to the Galaxy theme, gives $n=42$). So for your case these should be reasonably good, although maybe not so good if you want to compute high-precision confidence intervals (e.g. 99.9% CIs).
  • Bootstrapping: parametric bootstrapping is the usual approach taken for GLMMs (non-parametric bootstrap, i.e. resampling the data with replacement, has to be done in careful/non-standard ways in order to preserve the grouping structure). It doesn't make any asymptotic assumptions, but [like likelihood profile CIs] it does assume the model assumptions are adequate (e.g. conditional distribution, Normality of random effects, etc.). The main problem is that it's very slow - you have to refit the model once for every bootstrap sample. Also, there's no built-in method for PB in glmmTMB (unlike lme4), although there is a simulate() method for fitted models, so it shouldn't be too hard to put one together if you know what you're doing.