On commence par un jeu de données simulé : \(100\) observations conjointes de deux
variables explicatives numériques x1
et x2
, et
une variable réponse y
dichotomique \(0/1\)
load(url("https://irma.math.unistra.fr/~jberard/reg_log_sim_1"))
str(donnees)
## 'data.frame': 100 obs. of 3 variables:
## $ y : int 1 1 0 1 1 0 0 1 1 1 ...
## $ x1: num 3.53 -2.21 -1.14 -2.03 1.21 ...
## $ x2: num 3.3 -1.87 -1 -2.11 1.08 ...
On ajuste maintenant un modèle de régression logistique simple sur le jeu de données.
ajustement_100 <- glm(formula = y ~ x1 + x2, family = binomial(link = "logit"), data = donnees)
La commande summary
nous permet d’accéder aux résultats
de tests de Wald de nullité des coefficients, les \(p-\)valeurs étant indiquées dans la colonne
Pr(>|z|)
pour chacun des coefficients.
Bien entendu, aucun coefficient n’est estimé à une valeur exactement égale à \(0\). La question que l’on se pose ici est de préciser dans quelle mesure cette valeur estimée non-nulle estimée est le signe d’un coefficient dont la vraie valeur est non-nulle, ou si cette valeur estimée non-nulle n’est que le résultat d’une fluctuation autour d’une vraie valeur égale à \(0\). On constate ici que :
l’hypothèse de nullité du coefficient associé au terme constant
(Intercept)
est assez nettement rejetée, avec une \(p-\)valeur à un peu moins de \(0.02\), ce qui lui vaut d’être assortie de
deux étoiles **
; l’écart à \(0\) de la valeur estimée est donc jugé
“statistiquement significatif”;
l’hypothèse de nullité du coefficient associé à la variable
explicative numérique x1
n’est pas rejetée (quel que soit
le niveau “raisonnable” de risque de première espèce que l’on se fixe),
avec une \(p-\)valeur d’environ \(0.89\); l’écart à \(0\) de la valeur estimée est donc jugé
“statistiquement non-significatif”;
de même, l’hypothèse de nullité du coefficient associé à la
variable explicative numérique x2
n’est pas rejetée (quel
que soit le niveau “raisonnable” de risque de première espèce que l’on
se fixe), avec une \(p-\)valeur
d’environ \(0.27\).
summary(ajustement_100)
##
## Call:
## glm(formula = y ~ x1 + x2, family = binomial(link = "logit"),
## data = donnees)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.6838 0.5444 3.093 0.00198 **
## x1 0.1684 1.1828 0.142 0.88676
## x2 1.5743 1.4144 1.113 0.26571
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 136.058 on 99 degrees of freedom
## Residual deviance: 47.701 on 97 degrees of freedom
## AIC: 53.701
##
## Number of Fisher Scoring iterations: 7
Le jeu de données précédent est en fait extrait d’un jeu de données simulé plus vaste comportant \(10000\) observations.
load(url("https://irma.math.unistra.fr/~jberard/reg_log_sim_2"))
str(donnees)
## 'data.frame': 10000 obs. of 3 variables:
## $ y : int 1 1 0 1 1 0 0 1 1 1 ...
## $ x1: num 3.53 -2.21 -1.14 -2.03 1.21 ...
## $ x2: num 3.3 -1.87 -1 -2.11 1.08 ...
On procède de nouveau à l’ajustement d’un modèle de régression logistique simple, sur ce jeu de données plus étendu.
ajustement_10000 <- glm(formula = y ~ x1 + x2, family = binomial(link = "logit"), data = donnees)
summary(ajustement_10000)
##
## Call:
## glm(formula = y ~ x1 + x2, family = binomial(link = "logit"),
## data = donnees)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.959080 0.033418 28.700 <2e-16 ***
## x1 0.977406 0.106204 9.203 <2e-16 ***
## x2 0.001149 0.115076 0.010 0.992
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 13360.5 on 9999 degrees of freedom
## Residual deviance: 6969.6 on 9997 degrees of freedom
## AIC: 6975.6
##
## Number of Fisher Scoring iterations: 6
On constate que :
l’hypothèse de nullité du coefficient associé au terme constant
est fortement rejetée, avec une \(p-\)valeur inférieure à \(2 \cdot 10^{-16}\), ce qui lui vaut d’être
assortie de trois étoiles ***
;
Contrairement à l’ajustement précédent, l’hypothèse de nullité du
coefficient associé à la variable explicative numérique x1
est fortement rejetée, avec une \(p-\)valeur inférieure à \(2 \cdot 10^{-16}\);
l’hypothèse de nullité du coefficient associé à la variable
explicative numérique x2
n’est pas rejetée (quel que soit
le niveau “raisonnable” de risque de première espèce que l’on se fixe),
avec une \(p-\)valeur d’environ \(0.99\).
Les deux jeux de données étudiés ici ont été simulés à l’aide du même modèle, à savoir un modèle de régression logistique pour la variable réponse \(y\), dont la composante systématique est de la forme \(\eta=1+x^{(1)}\). Le modèle de régression logistique est donc ici (par construction) valide, avec les vraies valeurs des coefficients données par \(\beta_0=1\), \(\beta_1=1\), \(\beta_2=0\).
Dans le premier cas (100 lignes), la non-nullité de \(\beta_0\) et la nullité de \(\beta_2\) sont correctement identifiées, mais pas la non-nullité de \(\beta_1\), du fait d’un nombre de données insuffisant. Dans le deuxième cas (10000 lignes au lieu de 100), la nullité/non-nullité des divers coefficients est correctement détectée, du fait de la taille plus grande du deuxième jeu de données (10000 lignes au lieu de 100), qui permet d’obtenir une estimation plus précise des coefficients, et en particulier une discrimination plus précise entre coefficients nuls et non-nuls.
On charge maintenant un troisième jeu de données, dont la structure est analogue aux deux précédents.
load(url("https://irma.math.unistra.fr/~jberard/reg_log_sim_3"))
str(donnees)
## 'data.frame': 1000 obs. of 3 variables:
## $ y : int 1 1 0 1 0 1 1 1 1 0 ...
## $ x1: num 1.5 6.3 -2.17 6.76 -3.73 ...
## $ x2: num -2.0238 -4.3049 0.0014 -7.0384 1.5016 ...
On ajuste ensuite deux modèles de régression logistique : l’un
comportant uniquement la variable explicative x2
, et
l’autre comportant les deux variables explicatives x1
et
x2
.
# Ajustement avec x2 toute seule
ajustement_1 <- glm(formula = y ~ x2, family = binomial(link = "logit"), data = donnees)
summary(ajustement_1)
##
## Call:
## glm(formula = y ~ x2, family = binomial(link = "logit"), data = donnees)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.60266 0.08315 7.248 4.23e-13 ***
## x2 -0.59040 0.03946 -14.963 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1345.2 on 999 degrees of freedom
## Residual deviance: 940.9 on 998 degrees of freedom
## AIC: 944.9
##
## Number of Fisher Scoring iterations: 5
# Ajustement avec x1 et x2
ajustement_2 <- glm(formula = y ~ x1 + x2, family = binomial(link = "logit"), data = donnees)
summary(ajustement_2)
##
## Call:
## glm(formula = y ~ x1 + x2, family = binomial(link = "logit"),
## data = donnees)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.87531 0.10428 8.394 <2e-16 ***
## x1 1.08953 0.08708 12.513 <2e-16 ***
## x2 0.06773 0.06115 1.108 0.268
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1345.21 on 999 degrees of freedom
## Residual deviance: 692.67 on 997 degrees of freedom
## AIC: 698.67
##
## Number of Fisher Scoring iterations: 6
Dans le premier cas (ajustement_1
), on constate que
l’hypothèse de nullité du coefficient associé à la variable
x2
est fortement rejetée, avec une \(p-\)valeur inférieure à \(2 \cdot 10^{-16}\).
Dans le deuxième cas (ajustement_2
), on constate que
l’hypothèse de nullité du coefficient associé à la variable
x2
n’est pas rejetée (quel que soit le niveau “raisonnable”
de risque de première espèce que l’on se fixe), avec une \(p-\)valeur d’environ \(0.27\), tandis que l’hypothèse de nullité
du coefficient associé à la variable x1
est fortement
rejetée, avec une \(p-\)valeur
inférieure à \(2 \cdot 10^{-16}\).
La valeur estimée des coefficients et leur significativité statistique éventuelle dépendent des variables incluses dans le modèle !!!
Ici, le modèle utilisé pour simuler les données est exactement le
même que dans l’exemple précédent : modèle de régression logistique pour
la variable réponse \(y\), dont la
composante systématique est de la forme \(\eta=1+x^{(1)}\). Même si la valeur de
x2
n’intervient aucunement dans la loi de la valeur simulée
de y
, le modèle dans lequel x2
est la seule
variable explicative disponible, et la corrélation entre les valeurs de
x1
et x2
, expliquent le fait qu’un coefficient
non-nul soit identifié pour x2
. Lorsque les deux variables
x1
et x2
sont utilisées comme variables
explicatives, la valeur nulle de \(\beta_2\) et la valeur non-nulle de \(\beta_1\) sont correctement
identifiées.
On charge un jeu de données simulé comportant \(1000\) observations conjointes d’une
variable réponse y
dichotomique \(0/1\), d’une variable explicative numérique
x1
, et d’une variable explicative catégorielle
x2
(à trois catégories : a
, b
,
c
)
load(url("https://irma.math.unistra.fr/~jberard/reg_log_sim_4"))
str(donnees)
## 'data.frame': 1000 obs. of 3 variables:
## $ y : int 1 1 0 1 0 1 1 1 1 0 ...
## $ x1: num 1.5 6.3 -2.17 6.76 -3.73 ...
## $ x2: Factor w/ 3 levels "a","b","c": 3 3 2 3 1 3 3 2 3 1 ...
On compare ici deux ajustements d’un modèle de régression logistique
: l’un comportant uniquement la variable x1
, et l’autre
comportant les deux variables x1
et x2
. Le
modèle comportant uniquement la variable x1
peut être vu
comme une restriction du modèle comportant les deux variables
x1
et x2
dans lequel on impose une valeur
nulle aux coefficients associés à la variable x2
.
ajustement_1 <- glm(formula = y ~ x1, family = binomial(link = "logit"), data = donnees)
summary(ajustement_1)
##
## Call:
## glm(formula = y ~ x1, family = binomial(link = "logit"), data = donnees)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.39329 0.11141 12.51 <2e-16 ***
## x1 0.84534 0.05514 15.33 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1255.24 on 999 degrees of freedom
## Residual deviance: 739.37 on 998 degrees of freedom
## AIC: 743.37
##
## Number of Fisher Scoring iterations: 6
ajustement_2 <- glm(formula = y ~ x1 + x2, family = binomial(link = "logit"), data = donnees)
summary(ajustement_2)
##
## Call:
## glm(formula = y ~ x1 + x2, family = binomial(link = "logit"),
## data = donnees)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.06044 0.20224 10.188 < 2e-16 ***
## x1 1.07027 0.07819 13.688 < 2e-16 ***
## x2b 0.11532 0.32704 0.353 0.724
## x2c -1.30227 0.27447 -4.745 2.09e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1255.24 on 999 degrees of freedom
## Residual deviance: 711.21 on 996 degrees of freedom
## AIC: 719.21
##
## Number of Fisher Scoring iterations: 6
Pour effectuer le test du rapport de vraisemblance, on extrait les
log-vraisemblances maximisées obtenues pour chacun des deux ajustements,
à l’aide de la fonction logLik
.
L1<-logLik(ajustement_1)
L1
## 'log Lik.' -369.6841 (df=2)
L2<-logLik(ajustement_2)
L2
## 'log Lik.' -355.6034 (df=4)
On calcule ensuite la différence des nombres de degré de liberté
entre le “grand” modèle (avec les variables x1
et
x2
) et le “petit” modèle (avec uniquement la variable
x1
). On constate que cette différence est égale à \(2\), traduisant la contrainte selon
laquelle les deux coefficients associés à la variable x2
dans le “grand” modèle sont contraints de valoir \(0\) dans le “petit” modèle.
diff_deg_lib <- attributes(L2)[["df"]] - attributes(L1)[["df"]]
diff_deg_lib
## [1] 2
On calcule ensuite la statistique du test du rapport de vraisemblance, c’est-à-dire le double de la différence des log-vraisemblances maximisées entre le “grand” modèle et le “petit” modèle.
LRT_stat <- 2 * (as.double(L2) - as.double(L1))
LRT_stat
## [1] 28.16134
La \(p-\)valeur du test est ensuite
calculée à l’aide de la fonction de répartition de la loi du chi-deux à
diff_deg_lib
degrés de liberté.
LRT_pval <- 1 - pchisq(q = LRT_stat, df = diff_deg_lib)
LRT_pval
## [1] 7.67083e-07
Le test du rapport de vraisemblance penche très clairement en faveur
de l’inclusion de la variable x2
: l’hypothèse de nullité
des coefficients associés à la variable x2
est nettement
rejetée, avec une \(p-\)valeur
d’environ \(7.7 \cdot 10^{-7}\).
Dans ce qui précède, on a décortiqué les différentes étapes
conduisant au test du rapport de vraisemblance. On peut obtenir le même
résultat de manière plus directe en utilisant la fonction
anova
(qui sera donc ici anova.glm
), comme
illustré ci-dessous.
anova(ajustement_1, ajustement_2, test = "LRT")
On utilise maintenant le test du rapport de vraisemblance dans un
autre but : tester la pertinence d’une fusion des modalités
a
et b
de la variable x2
dans le
modèle utilisant les deux variables x1
et
x2
.
On effectue ceci de manière “manuelle”, en créant une nouvelle
variable x2_fus
dans laquelle ces deux modalités sont
fusionnées en une seule modalité nommée ab
, à l’aide de la
commande revalue
du paquet plyr
.
donnees[["x2_fus"]] <- forcats::fct_recode(.f = donnees[["x2"]], "ab" = "a", "ab" = "b")
On ré-ajuste maintenant notre modèle de régression logistique en
utilisant x2_fus
au lieu de x2
.
ajustement_3 <- glm(formula = y ~ x1 + x2_fus, family = binomial(link = "logit"), data = donnees)
summary(ajustement_3)
##
## Call:
## glm(formula = y ~ x1 + x2_fus, family = binomial(link = "logit"),
## data = donnees)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.08830 0.18674 11.18 < 2e-16 ***
## x1 1.07517 0.07702 13.96 < 2e-16 ***
## x2_fusc -1.33200 0.26167 -5.09 3.57e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1255.24 on 999 degrees of freedom
## Residual deviance: 711.33 on 997 degrees of freedom
## AIC: 717.33
##
## Number of Fisher Scoring iterations: 6
On effectue maintenant un test du rapport de vraisemblance pour
comparer les deux modèles ainsi ajustés. Le “grand” modèle est ici celui
dans lequelle les modalités a
et b
de la
variable x2
ne sont pas fusionnées, et le “petit” modèle
celui dans lequel elles le sont, cette fusion pouvant se traduire par la
contrainte d’égalité des coefficients associés aux modalités
a
et b
de la variable x2
.
anova(ajustement_3, ajustement_2, test = "LRT")
On constate que le test du rapport de vraisemblance penche ici très
nettement en faveur de la fusion des modalités a
et
b
. L’hypothèse d’égalité des coefficients associés aux
modalités a
et b
n’est pas rejetée, avec une
\(p-\)valeur d’environ \(0.72\).
Dans les deux exemples précédents, le modèle utilisé pour simuler les
données est un modèle de régression logistique pour la variable réponse
\(y\), dont la composante systématique
est de la forme \(\eta=1+x^{(1)}+\mathbf{1}(x^{(2)} \in
\{a,b\})\). Les deux tests effectués ont donc correctement
identifié, respectivement, l’existence d’un effet pour x2
,
et l’absence de différence d’effet entre les modalités a
et
b
de x2
.
On charge maintenant un nouveau jeu de données, comportant \(1000\) observations conjointes d’une
variable réponse y
dichotomique \(0/1\), d’une variable explicative logique
x1
, et d’une variable explicative numérique
x2
.
load(url("https://irma.math.unistra.fr/~jberard/reg_log_sim_5"))
str(donnees)
## 'data.frame': 1000 obs. of 3 variables:
## $ y : int 1 1 1 0 1 1 1 1 0 1 ...
## $ x1: Factor w/ 2 levels "FALSE","TRUE": 1 1 1 1 2 2 1 1 1 1 ...
## $ x2: num 3.66 3.6 1.44 -1.41 5.4 ...
On ajuste cette fois deux modèles de régression logistique : l’un
encodant un effet purement linéaire de la variable x1
sur
la composante systématique (donc au moyen d’un seul coefficient),
l’autre encodant l’effet de cette variable par un polynôme de degré
\(2\), avec donc un possible effet
quadratique.
ajustement_1 <- glm(formula = y ~ x1 + x2, family = binomial(link = "logit"), data = donnees)
ajustement_2 <- glm(formula = y ~ x1 + poly(x2, degree = 2),
family = binomial(link = "logit"),
data = donnees)
On effectue maintenant un test du rapport de vraisemblance pour
comparer les deux modèles ainsi ajustés. Le “grand” modèle est ici celui
dans lequelle un effet quadratique est ajusté pour x2
, et
le “petit” modèle celui dans lequel l’effet de x2
est
purement linéaire, cette restriction pouvant se traduire par la nullité
du coefficient associé au carré de x2
dans le modèle avec
polynôme de degré \(2\).
anova(ajustement_1, ajustement_2, test = "LRT")
On constate que le test du rapport de vraisemblance penche ici très nettement en faveur de l’inclusion d’un effet quadratique. L’hypothèse de nullité du coefficient correspondant est rejetée, avec une \(p-\)valeur d’environ \(8 \cdot 10^{-6}\).
Dans l’exemple précédent, le modèle utilisé pour simuler les données
est un modèle de régression logistique pour la variable réponse \(y\), dont la composante systématique est de
la forme \(\eta=1+\mathbf{1}(x^{(1)}=
TRUE)+x^{(2)}+0.008 \cdot (x^{(2)})^2\). Le test effectué a donc
correctement identifié la présence d’un effet quadratique pour
x2
.
On reprend simplement l’exemple précédent, pour illustrer le test du
score, qui donne lieu à une conclusion similaire. On utilise de nouveau
la fonction anova
, mais avec l’argument
test="Rao"
. (Voir également la fonction
glmscoretest
du paquet statmod
, et la fonction
test_score
du paquet outilscoursglm
.)
anova(ajustement_1, ajustement_2, test = "Rao")
On commence par récupérer le jeu de données. Il s’agit d’un jeu de
données d’assurance automobile, adapté du paquet
CASdatasets
, comportant les variables suivantes.
DriverAge
: âge du conducteur, 5 catégories d’âgeCarAge
: âge du véhicule, 2 catégories d’âgeDensity
: densité de la zone, 5 catégoriesBrand
: marque du véhicule, 2 catégoriesPower
: puissance du véhicule, 3 catégoriesGas
: type de motorisation, 2 catégoriesClaimNb
: nombre de sinistres observésExposition
: en années-policeLes données ont été groupées par valeurs communes des variables explicatives (toutes catégorielles), si bien que l’on a en tout \(495\) lignes.
load(url("https://irma.math.unistra.fr/~jberard/freMTPLfreq_groupe"))
str(donnees)
## 'data.frame': 495 obs. of 8 variables:
## $ DriverAge: Factor w/ 5 levels "(17,22]","(22,26]",..: 1 2 3 4 5 1 3 4 5 1 ...
## $ CarAge : Factor w/ 2 levels "[0,15]","(15,Inf]": 1 1 1 1 1 2 2 2 2 1 ...
## $ Density : Factor w/ 5 levels "[0,40]","(40,200]",..: 1 1 1 1 1 1 1 1 1 2 ...
## $ Brand : Factor w/ 2 levels "other","J": 1 1 1 1 1 1 1 1 1 1 ...
## $ Power : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
## $ Gas : Factor w/ 2 levels "Diesel","Regular": 1 1 1 1 1 1 1 1 1 1 ...
## $ ClaimNb : num 5 8 21 43 1 0 1 2 0 11 ...
## $ Exposure : num 34.7 66.2 402 519.4 23.6 ...
On ajuste maintenant un modèle log-Poisson pour le nombre de sinistres, en utiliant le logarithme de l’exposition comme terme d’offset.
ajustement <-
glm(formula = ClaimNb ~ DriverAge + CarAge + Density + Brand + Power + Gas + offset(log(Exposure)),
data = donnees,
family = poisson(link = "log"))
summary(ajustement)
##
## Call:
## glm(formula = ClaimNb ~ DriverAge + CarAge + Density + Brand +
## Power + Gas + offset(log(Exposure)), family = poisson(link = "log"),
## data = donnees)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.92779 0.04550 -42.373 < 2e-16 ***
## DriverAge(22,26] -0.61540 0.04610 -13.349 < 2e-16 ***
## DriverAge(26,42] -1.08342 0.03650 -29.680 < 2e-16 ***
## DriverAge(42,74] -1.08009 0.03563 -30.315 < 2e-16 ***
## DriverAge(74,Inf] -1.10306 0.05190 -21.252 < 2e-16 ***
## CarAge(15,Inf] -0.24524 0.03083 -7.955 1.80e-15 ***
## Density(40,200] 0.18350 0.02676 6.856 7.09e-12 ***
## Density(200,500] 0.31562 0.02968 10.633 < 2e-16 ***
## Density(500,4.5e+03] 0.53311 0.02606 20.456 < 2e-16 ***
## Density(4.5e+03,Inf] 0.66589 0.03582 18.591 < 2e-16 ***
## BrandJ -0.17933 0.02479 -7.234 4.68e-13 ***
## Power2 0.08689 0.02344 3.707 0.00021 ***
## Power3 0.23979 0.03012 7.961 1.70e-15 ***
## GasRegular -0.17951 0.01671 -10.743 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2357.05 on 494 degrees of freedom
## Residual deviance: 563.82 on 481 degrees of freedom
## AIC: 2168.8
##
## Number of Fisher Scoring iterations: 4
On s’intéresse en particulier ici à la variable
DriverAge
.
On vérifie sur le tableau ci-dessus que
tous les coefficients estimés pour cette variable (à l’exception de
celui associé à la modalité de référence, bien entendu) possèdent des
valeurs dont la différence vis-à-vis de \(0\) est jugée statistiquement
significative, d’où les ***
pour chacun des
coefficients.
Néanmoins, le tracé effectué ci-dessous (au moyen de la fonction
trace_terme_univar
du fichier d’outils) montre que les
différences entre les trois coefficients estimés
DriverAge(26,42]
, DriverAge(42,74]
,
DriverAge(74,Inf]
sont faibles en comparaison de
l’incertitude portant sur ces estimations (traduite par le tracé des
intervalles de confiance à \(95\)%
obtenus par approximation normale, pour chaque coefficient).
outilscoursglm::trace_terme_univar(ajustement = ajustement,
nom_variable = "DriverAge",
nom_terme = "DriverAge",
trace_exposition = TRUE,
nom_exposition = "Exposure",
trace_int_conf = TRUE)
## Warning in outilscoursglm::trace_terme_univar(ajustement = ajustement, nom_variable = "DriverAge", : Utilisation des données de ajustement$data
Par conséquent, la question se pose de savoir si les différences entre les valeurs estimées de ces trois coefficients traduisent une différence réelle, ou si elles ne sont que le reflet de fluctuations différentes autour d’une valeur identique.
On commence par créer une nouvelle variable fusionnant les trois
dernières modalités de la variable DriverAge
, et sans cette
fusion.
# Fusion des trois dernières modalités de DriverAge
donnees[["DriverAge_fus"]] <-
forcats::fct_recode(.f = donnees[["DriverAge"]],
"(26,Inf]" = "(26,42]",
"(26,Inf]" = "(42,74]",
"(26,Inf]" = "(74,Inf]")
On ré-ajuste maintenant le modèle log-Poisson, en utilisant la variable ainsi fusionnée.
ajustement_fus <-
glm(formula = ClaimNb ~ DriverAge_fus + CarAge + Density + Brand + Power + Gas + offset(log(Exposure)),
data = donnees,
family = poisson(link = "log"))
On peut maintenant juger de l’impact de la fusion en utilisant le test du rapport de vraisemblance.
anova(ajustement_fus, ajustement, test = "LRT")
Celui-ci penche visiblement en faveur de la fusion, avec une \(p-\)valeur à \(0.85\) environ. On n’a donc pas détecté de
différence statistiquement significative entre les effets des trois
dernières modalités de la variable DriverAge
. (Bien
entendu, la portée de cette conclusion dépend de la validité du modèle
GLM utilisé ici, qui n’a pas été examinée. Tout ce que l’on peut dire à
ce stade est que l’on n’a pas détecté de différence statistiquement
significative dans le cadre du modèle utilisé.)
Pour faire bonne mesure, on applique également le test du score, qui, de manière rassurante, fournit une \(p-\)valeur très voisine, avec dans tous les cas une conclusion identique.
anova(ajustement_fus, ajustement, test = "Rao")
On peut également utiliser le test de Wald, qui nous permet
d’illustrer l’utilisation plutôt commode de la fonction
linearHypothesis
du paquet car
pour tester
l’égalité entre coefficients. Le résultat obtenu est de nouveau très
proche des deux précédents (en termes de \(p-\)valeur) et donne lieu à une conclusion
identique.
library(car)
## Loading required package: carData
linearHypothesis(model = ajustement,
c("DriverAge(42,74]=DriverAge(26,42]","DriverAge(26,42]=DriverAge(74,Inf]"))