48  Quel modèle choisir ?

La tableau synthétique ci-dessous permet d’identifier rapidement quelle fonction utiliser en fonction du type de variable à expliquer, du type de distribution et de la famille de modèles (modèle de base, modèle avec prise en compte du plan d’échantillonnage, modèle mixte ou modèle GEE).

Variable à expliquer Type de distribution Interprétation des coefficients Modèle de base Échantillonnage complexe Modèle mixte GEE1
Continue Linéaire directe stats::lm() lme4::lmer()
Gaussien directe stats::glm()
avec family = gaussian
survey::svyglm()
avec family = gaussian
lme4::glmer()
avec family = gaussian
geepack::geeglm()
avec family = gaussian
Comptage
(nombre d’occurences)
Poisson RR
(risques relatifs)
stats::glm()
avec family = poisson
survey::svyglm()
avec family = poisson
lme4::glmer()
avec family = poisson
geepack::geeglm()
avec family = poisson
Quasi-Poisson RR
(risques relatifs)
stats::glm()
avec family = quasipoisson
survey::svyglm()
avec family = quasipoisson
lme4::glmer()
avec family = quasipoisson
geepack::geeglm()
avec family = quasipoisson
Binomial négatif RR
(risques relatifs)
MASS::glm.nb()

sjstats::svyglm.nb()

Alternative :
svrepmisc::svynb()

lme4::glmer.nb()
Incidence / Taux / Ratio Poisson
avec offset
IRR
(incidence rate ratio)
stats::glm()
avec family = poisson
et offset(log(denominateur))
survey::svyglm()
avec family = poisson
et offset(log(denominateur))
lme4::glmer()
avec family = poisson
et offset(log(denominateur))
geepack::geeglm()
avec family = poisson
et offset(log(denominateur))
Quasi-Poisson
avec offset
IRR
(incidence rate ratio)
stats::glm()
avec family = quasipoisson
et offset(log(denominateur))
survey::svyglm()
avec family = quasipoisson
et offset(log(denominateur))
lme4::glmer()
avec family = quasipoisson
et offset(log(denominateur))
geepack::geeglm()
avec family = quasipoisson
et offset(log(denominateur))
Binomial négatif
avec offset
IRR
(incidence rate ratio)
MASS::glm.nb()
avec offset(log(denominateur))

sjstats::svyglm.nb()
et offset(log(denominateur))

Alternative :
svrepmisc::svynb()
avec offset(log(denominateur))

lme4::glmer.nb()
avec offset(log(denominateur))
Binaire
(oui / non)
Logistique
(logit)
OR
(odds ratio)
stats::glm()
avec family = binomial
survey::svyglm()
avec family = binomial
lme4::glmer()
avec family = binomial
geepack::geeglm()
avec family = binomial
Quasi-binomial
(logit)
OR
(odds ratio)
stats::glm()
avec family = quasibinomial
survey::svyglm()
avec family = quasibinomial
lme4::glmer()
avec family = quasibinomial
geepack::geeglm()
avec family = quasibinomial
Probit pas interprétable directement stats::glm()
avec family = binomial("probit")
survey::svyglm()
avec family = binomial("probit")
lme4::glmer()
avec family = binomial("probit")
geepack::geeglm()
avec family = binomial("probit")
Log binomial PR
(prevalence ratio)

stats::glm()
avec family = binomial("log")

Alternative :
logbin::logbin()

survey::svyglm()
avec family = binomial("log")
lme4::glmer()
avec family = binomial("log")
geepack::geeglm()
avec family = binomial("log")
Poisson PR
(prevalence ratio)
stats::glm()
avec family = poisson
survey::svyglm()
avec family = poisson
lme4::glmer()
avec family = poisson
geepack::geeglm()
avec family = poisson
Catégorielle ordinale
(3 modalités ou plus)
Régression logistique ordinale OR
(odds ratio)

MASS::polr()

Alternative :
ordinal::clm()

Alternative :
VGAM::vglm()
avec family = VGAM::cumulative(
  parallel = TRUE
)

survey::svyolr()

Alternative :
svrepmisc::svyclm()

Alternative :
svyVGAM::svy_vglm()
avec family = VGAM::cumulative(
  parallel = TRUE
)

ordinal::clmm()

geepack::ordgee()

Alternative :
multgee::ordLORgee()

Catégorielle nominale
(3 modalités ou plus)
Régression logistique multinomiale OR
(odds ratio)

nnet::multinom()

Alternative :
VGAM::vglm()
avec family = VGAM::multinomial

Alternative :
mlogit::mlogit()

svrepmisc::svymultinom()

Alternative :
svyVGAM::svy_vglm()
avec family = VGAM::multinomial

Voir note 2 multgee::nomLORgee()
Survie
(time to event)
Cox HR
(hazard ratio)
survival::coxph() survey::svycoxph()

survival::coxph()
avec un terme survival::frailty()

Alternative :
coxme::coxme()

survival::coxph()
avec l’option cluster
Modèle à temps discret binomial
(cloglog)
HR
(hazard ratio)
stats::glm()
avec family = binomial("cloglog")
survey::svyglm()
avec family = binomial("cloglog")
lme4::glmer()
avec family = binomial("cloglog")
geepack::geeglm()
avec family = binomial("cloglog")
Accelerated failure time
(AFT)
HR
(hazard ratio)
survival::survreg() survey::svysurvreg() survival::survreg() avec un terme survival::frailty() survival::survreg()
avec l’option cluster
Comptage avec surreprésentation de zéros Zero-inflated Poisson OR & RR

pscl::zeroinfl()

Alternative :

glmtoolbox::zeroinf()
sjstats::svyglm.zip() GLMMadaptive::mixed_model()
avec family = zi.poisson()3
Hurdle Poisson model OR & RR pscl::hurdle() GLMMadaptive::mixed_model()
avec family = hurdle.poisson()
Zero-inflated negative binomial OR & RR

pscl::zeroinfl()
avec dist = "negbin"

Alternative :

glmtoolbox::zeroinf(family = "nbf(log)")
sjstats::svyglm.zip()
avec dist = "negbin"
GLMMadaptive::mixed_model()
avec family = zi.negative.binomial()
Hurdle negative binomial model OR & RR pscl::hurdle()
avec dist = "negbin"
GLMMadaptive::mixed_model()
avec family = hurdle.negative.binomial()

  1. Voir aussi glmtoolbox::glmgee() ou gee::gee() comme alternative à geepack::geeglm().↩︎

  2. Il n’y a pas de solution évidente.

    L’approche la plus simple consiste à réaliser plusieurs modèles logistiques binaires séparés à l’aide de lme4::glmer(). Si la variable à expliquer a trois niveaux (A, B et C), on pourra réaliser un modèle binaire B vs A, et un modèle binaire C vs A. Cette approche est appelée approximation de Begg et Gray. On trouvera, en anglais, plus d’explications et des références bibliographiques sur StackOverflow.

    Une approche alternative, dans un contexte bayésien et non fréquentiste, est d’avoir recours à brms::brm() qui peut gérer ce type de modèles. Cette approche, avec des exemples de code, est mentionnée sur StackOverflow.

    Dans le cadre d’une approche fréquentiste, la fonction mgcv::gam() est mentionnée sur StackExchange, de même que la fonction mixcat::npmlt() (voir ce post), sachant que le package {mixcat} est faiblement documenté et ne semble plus forcément maintenu.

    Enfin, il semble possible d’avoir recours à MCMCglmm::MCMCglmm(), selon cette réponse sur StackOverflowet ce billet de blog.↩︎

  3. Cf. https://drizopoulos.github.io/GLMMadaptive/articles/ZeroInflated_and_TwoPart_Models.html↩︎