Les posteurs les plus actifs de la semaine
Aucun utilisateur |
Sujets les plus vus
Interprétation régression logistique binomiale
2 participants
Page 1 sur 1
Interprétation régression logistique binomiale
Bonjour,
On m'a conseillé de réaliser une régression logistique pour étudier ma variable à prédire qui est l'occupation de mes nichoirs en fonction de mes variables explicatives (année de pose, essence de l'arbre, type de nichoir, aire des milieux, etc.). Etant débutante avec R et n'ayant jamais réaliser ce type de test, je me suis basée sur la littérature et des exemples pour le réaliser. J'ai obtenu le script suivant:
Si j'ai bien compris après sélection des meilleurs variables par AIC, mes variables "pelouse" et "nichoir" sont celles qui expliquera au mieux mon occupation ? Et je dois donc refaire une régression logistique à partir de ces variables ?
Mais n'étant pas une grande connaisseuse, je suis perdue dans la masse d'information .. Je n'arrive pas à comprendre ou sont mes résultats et comment les interpréter.
Il y a beaucoup à lire mais cela m'éclairerait énormément, si quelqu'un me venait en aide.
Vraiment merci d'avance.
Marion
On m'a conseillé de réaliser une régression logistique pour étudier ma variable à prédire qui est l'occupation de mes nichoirs en fonction de mes variables explicatives (année de pose, essence de l'arbre, type de nichoir, aire des milieux, etc.). Etant débutante avec R et n'ayant jamais réaliser ce type de test, je me suis basée sur la littérature et des exemples pour le réaliser. J'ai obtenu le script suivant:
- Code:
> #regression logistique
>
> modele=glm(occupe~pose+nichoir+essence+culture+vigne+foret+friche+eau+haie+pelouse+urbain, data=t, family=binomial)
> print(modele)
Call: glm(formula = occupe ~ pose + nichoir + essence + culture + vigne +
foret + friche + eau + haie + pelouse + urbain, family = binomial,
data = t)
Coefficients:
(Intercept) pose2016 pose2017
-9.389e+00 1.475e+00 1.260e+00
nichoirgobemouche essenceAulne essenceChene
-1.713e+01 1.363e-01 -3.092e-01
essenceCypres essenceErable essenceFrene
6.360e-01 1.824e+01 2.021e-01
essencenon_identifie essencePeuplier essencePin
1.805e+01 -5.671e-01 8.488e-01
essenceRobinier essenceSaule culture
-8.236e-02 -1.704e+01 1.176e-05
vigne foret friche
1.118e-05 9.674e-06 8.804e-07
eau haie pelouse
2.963e-06 3.871e-06 2.756e-05
urbain
9.872e-06
Degrees of Freedom: 99 Total (i.e. Null); 78 Residual
Null Deviance: 138.6
Residual Deviance: 110.5 AIC: 154.5
> print(summary(modele))
Call:
glm(formula = occupe ~ pose + nichoir + essence + culture + vigne +
foret + friche + eau + haie + pelouse + urbain, family = binomial,
data = t)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.26569 -0.99986 0.00001 0.88236 1.92481
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -9.389e+00 1.696e+01 -0.554 0.5799
pose2016 1.475e+00 7.922e-01 1.862 0.0626
pose2017 1.260e+00 7.788e-01 1.618 0.1057
nichoirgobemouche -1.713e+01 1.970e+03 -0.009 0.9931
essenceAulne 1.363e-01 4.419e+03 0.000 1.0000
essenceChene -3.092e-01 1.671e+00 -0.185 0.8532
essenceCypres 6.360e-01 2.041e+00 0.312 0.7553
essenceErable 1.824e+01 3.956e+03 0.005 0.9963
essenceFrene 2.021e-01 1.712e+00 0.118 0.9060
essencenon_identifie 1.805e+01 3.956e+03 0.005 0.9964
essencePeuplier -5.671e-01 1.928e+00 -0.294 0.7687
essencePin 8.488e-01 1.702e+00 0.499 0.6180
essenceRobinier -8.236e-02 1.913e+00 -0.043 0.9657
essenceSaule -1.704e+01 3.956e+03 -0.004 0.9966
culture 1.176e-05 2.223e-05 0.529 0.5968
vigne 1.118e-05 2.180e-05 0.513 0.6079
foret 9.674e-06 2.258e-05 0.428 0.6684
friche 8.804e-07 2.695e-05 0.033 0.9739
eau 2.963e-06 2.543e-05 0.116 0.9073
haie 3.871e-06 2.559e-05 0.151 0.8798
pelouse 2.756e-05 2.219e-05 1.242 0.2144
urbain 9.872e-06 2.235e-05 0.442 0.6587
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 138.63 on 99 degrees of freedom
Residual deviance: 110.51 on 78 degrees of freedom
AIC: 154.51
Number of Fisher Scoring iterations: 16
> p=predict(modele,type="response")
> class(modele)
[1] "glm" "lm"
> attributes(modele)
$names
[1] "coefficients" "residuals" "fitted.values"
[4] "effects" "R" "rank"
[7] "qr" "family" "linear.predictors"
[10] "deviance" "aic" "null.deviance"
[13] "iter" "weights" "prior.weights"
[16] "df.residual" "df.null" "y"
[19] "converged" "boundary" "model"
[22] "call" "formula" "terms"
[25] "data" "offset" "control"
[28] "method" "contrasts" "xlevels"
$class
[1] "glm" "lm"
> chi2=modele$null.deviance - modele$deviance
> chi2
[1] 28.11459
> ddl=modele$df.null - modele$df.residual
> ddl
[1] 21
> pvalue=pchisq(chi2,ddl,lower.tail = F)
> pvalue
[1] 0.1369312
> ls()
[1] "chi2" "culture" "ddl" "eau"
[5] "err" "essence" "foret" "friche"
[9] "glm" "haie" "mc" "modele"
[13] "modele.back" "modele.forward" "modele.step" "modele.stepw"
[17] "modele.trivial" "nichoir" "occupe" "p"
[21] "pelouse" "pose" "pred.moda" "pred.proba"
[25] "pvalue" "reg" "t" "urbain"
[29] "vigne"
>
> pred.proba= predict(modele,newdata=t, type="response")
> pred.proba
1 2 3 4 5
7.384810e-01 7.163054e-01 7.144246e-01 6.581104e-01 5.412045e-01
6 7 8 9 10
3.019341e-01 2.477738e-01 3.593926e-01 5.442767e-01 6.134556e-01
11 12 13 14 15
6.847416e-01 7.779130e-01 7.853442e-01 7.893950e-01 7.806005e-01
16 17 18 19 20
9.278166e-01 8.411467e-01 7.757747e-01 7.035765e-01 7.993461e-01
21 22 23 24 25
7.967043e-01 8.661627e-01 3.438110e-01 3.435579e-01 2.737438e-01
26 27 28 29 30
1.000000e+00 3.152584e-01 2.350463e-08 2.536448e-08 5.207700e-01
31 32 33 34 35
9.232104e-01 5.424428e-01 6.322602e-01 2.350463e-08 1.912494e-08
36 37 38 39 40
2.954972e-01 1.912849e-08 3.262621e-01 3.150934e-01 3.120459e-08
41 42 43 44 45
3.150261e-01 3.221958e-01 7.617667e-01 7.998330e-01 7.953887e-01
46 47 48 49 50
6.125409e-01 3.866756e-01 3.932322e-01 5.240741e-01 2.735210e-01
51 52 53 54 55
5.371963e-01 4.652132e-01 4.630229e-01 4.819648e-01 6.813364e-01
56 57 58 59 60
4.099869e-01 6.857180e-01 6.820723e-01 6.785593e-01 6.744954e-01
61 62 63 64 65
6.681321e-01 6.817345e-01 4.433281e-01 5.687021e-01 7.236564e-01
66 67 68 69 70
3.991931e-01 4.394948e-01 4.154152e-01 6.194143e-01 4.828879e-01
71 72 73 74 75
4.969552e-01 4.064456e-01 4.783118e-01 4.742883e-01 4.731478e-01
76 77 78 79 80
7.405587e-01 4.709171e-01 5.072183e-01 6.144229e-01 4.258473e-01
81 82 83 84 85
3.943886e-01 3.938319e-01 3.938319e-01 3.960044e-01 1.568531e-01
86 87 88 89 90
1.692544e-01 6.694533e-01 6.680294e-01 1.910203e-01 1.934424e-01
91 92 93 94 95
3.635878e-02 3.583720e-02 1.657003e-01 3.833232e-01 6.275010e-01
96 97 98 99 100
5.136099e-01 7.364370e-01 1.000000e+00 4.297343e-01 1.757098e-01
> pred.moda=factor(ifelse(pred.proba>0.5, "occupe", "non_occupe"))
> pred.moda
1 2 3 4 5 6
occupe occupe occupe occupe occupe non_occupe
7 8 9 10 11 12
non_occupe non_occupe occupe occupe occupe occupe
13 14 15 16 17 18
occupe occupe occupe occupe occupe occupe
19 20 21 22 23 24
occupe occupe occupe occupe non_occupe non_occupe
25 26 27 28 29 30
non_occupe occupe non_occupe non_occupe non_occupe occupe
31 32 33 34 35 36
occupe occupe occupe non_occupe non_occupe non_occupe
37 38 39 40 41 42
non_occupe non_occupe non_occupe non_occupe non_occupe non_occupe
43 44 45 46 47 48
occupe occupe occupe occupe non_occupe non_occupe
49 50 51 52 53 54
occupe non_occupe occupe non_occupe non_occupe non_occupe
55 56 57 58 59 60
occupe non_occupe occupe occupe occupe occupe
61 62 63 64 65 66
occupe occupe non_occupe occupe occupe non_occupe
67 68 69 70 71 72
non_occupe non_occupe occupe non_occupe non_occupe non_occupe
73 74 75 76 77 78
non_occupe non_occupe non_occupe occupe non_occupe occupe
79 80 81 82 83 84
occupe non_occupe non_occupe non_occupe non_occupe non_occupe
85 86 87 88 89 90
non_occupe non_occupe occupe occupe non_occupe non_occupe
91 92 93 94 95 96
non_occupe non_occupe non_occupe non_occupe occupe occupe
97 98 99 100
occupe occupe non_occupe non_occupe
Levels: non_occupe occupe
> ls()
[1] "chi2" "culture" "ddl" "eau"
[5] "err" "essence" "foret" "friche"
[9] "glm" "haie" "mc" "modele"
[13] "modele.back" "modele.forward" "modele.step" "modele.stepw"
[17] "modele.trivial" "nichoir" "occupe" "p"
[21] "pelouse" "pose" "pred.moda" "pred.proba"
[25] "pvalue" "reg" "t" "urbain"
[29] "vigne"
> mc=table(t$occupe,pred.moda)
> class(mc)
[1] "table"
> mc
pred.moda
non_occupe occupe
non_occupe 37 13
occupe 14 36
>
> err=(mc[2,1]+mc[1.2])/sum(mc)
> err
[1] 0.51
> ls()
[1] "chi2" "culture" "ddl" "eau"
[5] "err" "essence" "foret" "friche"
[9] "glm" "haie" "mc" "modele"
[13] "modele.back" "modele.forward" "modele.step" "modele.stepw"
[17] "modele.trivial" "nichoir" "occupe" "p"
[21] "pelouse" "pose" "pred.moda" "pred.proba"
[25] "pvalue" "reg" "t" "urbain"
[29] "vigne"
> library(MASS)
> modele.back=stepAIC(modele,scope=list(lower="occupe~1", upper="occupe~pose+nichoir+essence+culture+vigne+haie+pelouse+friche+eau+urbain+foret"),direction="backward")
Start: AIC=154.51
occupe ~ pose + nichoir + essence + culture + vigne + foret +
friche + eau + haie + pelouse + urbain
Df Deviance AIC
- essence 10 119.48 143.48
- friche 1 110.52 152.52
- eau 1 110.53 152.53
- haie 1 110.54 152.54
- foret 1 110.75 152.75
- urbain 1 110.78 152.78
- vigne 1 110.90 152.90
- culture 1 110.92 152.92
- pose 2 114.46 154.46
<none> 110.52 154.51
- nichoir 1 113.77 155.77
- pelouse 1 113.85 155.85
Step: AIC=143.48
occupe ~ pose + nichoir + culture + vigne + foret + friche +
eau + haie + pelouse + urbain
Df Deviance AIC
- friche 1 119.48 141.48
- haie 1 119.52 141.52
- eau 1 119.52 141.52
- foret 1 120.23 142.24
- urbain 1 120.58 142.58
- vigne 1 120.65 142.65
- pose 2 122.65 142.65
- culture 1 120.91 142.91
<none> 119.48 143.48
- pelouse 1 123.56 145.56
- nichoir 1 124.03 146.03
Step: AIC=141.48
occupe ~ pose + nichoir + culture + vigne + foret + eau + haie +
pelouse + urbain
Df Deviance AIC
- eau 1 119.54 139.54
- haie 1 119.54 139.54
- foret 1 120.67 140.67
- pose 2 122.83 140.83
- urbain 1 121.08 141.08
- vigne 1 121.45 141.46
<none> 119.48 141.48
- culture 1 121.66 141.66
- nichoir 1 124.03 144.03
- pelouse 1 124.89 144.88
Step: AIC=139.54
occupe ~ pose + nichoir + culture + vigne + foret + haie + pelouse +
urbain
Df Deviance AIC
- haie 1 119.56 137.56
- pose 2 122.83 138.83
- foret 1 121.17 139.17
<none> 119.54 139.54
- urbain 1 122.15 140.15
- vigne 1 123.22 141.22
- culture 1 123.51 141.51
- nichoir 1 124.06 142.06
- pelouse 1 128.38 146.38
Step: AIC=137.56
occupe ~ pose + nichoir + culture + vigne + foret + pelouse +
urbain
Df Deviance AIC
- foret 1 121.18 137.18
<none> 119.56 137.56
- pose 2 123.58 137.58
- urbain 1 122.40 138.40
- vigne 1 123.56 139.56
- culture 1 123.72 139.72
- nichoir 1 124.16 140.16
- pelouse 1 128.47 144.47
Step: AIC=137.18
occupe ~ pose + nichoir + culture + vigne + pelouse + urbain
Df Deviance AIC
- urbain 1 122.42 136.42
- pose 2 124.84 136.84
<none> 121.18 137.18
- culture 1 124.52 138.52
- vigne 1 124.61 138.61
- nichoir 1 126.24 140.24
- pelouse 1 129.55 143.55
Step: AIC=136.42
occupe ~ pose + nichoir + culture + vigne + pelouse
Df Deviance AIC
- pose 2 125.79 135.79
<none> 122.42 136.42
- culture 1 124.55 136.55
- vigne 1 124.79 136.79
- nichoir 1 127.50 139.50
- pelouse 1 129.66 141.66
Step: AIC=135.79
occupe ~ nichoir + culture + vigne + pelouse
Df Deviance AIC
- vigne 1 127.38 135.38
<none> 125.79 135.79
- culture 1 127.97 135.97
- nichoir 1 130.45 138.45
- pelouse 1 130.46 138.46
Step: AIC=135.38
occupe ~ nichoir + culture + pelouse
Df Deviance AIC
- culture 1 128.09 134.09
<none> 127.38 135.38
- pelouse 1 130.56 136.56
- nichoir 1 133.07 139.07
Step: AIC=134.09
occupe ~ nichoir + pelouse
Df Deviance AIC
<none> 128.09 134.09
- pelouse 1 131.44 135.44
- nichoir 1 134.14 138.14
> modele.back
Call: glm(formula = occupe ~ nichoir + pelouse, family = binomial,
data = t)
Coefficients:
(Intercept) nichoirgobemouche pelouse
-1.202e-01 -1.645e+01 8.020e-06
Degrees of Freedom: 99 Total (i.e. Null); 97 Residual
Null Deviance: 138.6
Residual Deviance: 128.1 AIC: 134.1
>
>
> modele.trivial=glm(occupe~1,data=t,family=binomial)
> modele.forward=stepAIC(modele.trivial,scope=list(lower="occupe~1", upper="occupe~pose+nichoir+essence+culture+vigne+foret+haie+pelouse+friche+eau+urbain"),direction="forward")
Start: AIC=140.63
occupe ~ 1
Df Deviance AIC
+ nichoir 1 131.44 135.44
+ eau 1 133.63 137.63
+ pelouse 1 134.14 138.14
<none> 138.63 140.63
+ culture 1 137.27 141.27
+ urbain 1 137.86 141.86
+ foret 1 137.94 141.94
+ friche 1 138.42 142.42
+ haie 1 138.52 142.52
+ vigne 1 138.54 142.54
+ pose 2 137.87 143.87
+ essence 10 128.36 150.36
Step: AIC=135.43
occupe ~ nichoir
Df Deviance AIC
+ pelouse 1 128.09 134.09
+ eau 1 128.99 134.99
<none> 131.44 135.44
+ culture 1 130.56 136.56
+ foret 1 131.04 137.04
+ urbain 1 131.21 137.21
+ friche 1 131.29 137.29
+ vigne 1 131.30 137.30
+ haie 1 131.38 137.38
+ pose 2 130.42 138.42
+ essence 10 123.12 147.12
Step: AIC=134.09
occupe ~ nichoir + pelouse
Df Deviance AIC
+ eau 1 125.83 133.83
<none> 128.09 134.09
+ pose 2 125.12 135.12
+ foret 1 127.38 135.38
+ culture 1 127.38 135.38
+ friche 1 127.87 135.87
+ urbain 1 127.93 135.93
+ vigne 1 127.97 135.97
+ haie 1 128.08 136.08
+ essence 10 116.57 142.57
Step: AIC=133.83
occupe ~ nichoir + pelouse + eau
Df Deviance AIC
<none> 125.83 133.83
+ foret 1 125.12 135.12
+ culture 1 125.33 135.33
+ pose 2 123.48 135.48
+ haie 1 125.69 135.69
+ friche 1 125.73 135.73
+ urbain 1 125.76 135.76
+ vigne 1 125.80 135.80
+ essence 10 115.97 143.97
> modele.forward
Call: glm(formula = occupe ~ nichoir + pelouse + eau, family = binomial,
data = t)
Coefficients:
(Intercept) nichoirgobemouche pelouse eau
8.893e-01 -1.599e+01 8.116e-06 -1.698e-05
Degrees of Freedom: 99 Total (i.e. Null); 96 Residual
Null Deviance: 138.6
Residual Deviance: 125.8 AIC: 133.8
Si j'ai bien compris après sélection des meilleurs variables par AIC, mes variables "pelouse" et "nichoir" sont celles qui expliquera au mieux mon occupation ? Et je dois donc refaire une régression logistique à partir de ces variables ?
Mais n'étant pas une grande connaisseuse, je suis perdue dans la masse d'information .. Je n'arrive pas à comprendre ou sont mes résultats et comment les interpréter.
Il y a beaucoup à lire mais cela m'éclairerait énormément, si quelqu'un me venait en aide.
Vraiment merci d'avance.
Marion
MarionL- Nombre de messages : 5
Date d'inscription : 18/08/2017
Re: Interprétation régression logistique binomiale
Hello,
Oui, c'est moi qui vous ais conseillé une régression logistique.
On progresse.
Il y a deux choses que vous devriez faire à présent :
1) Lancer la commande anova(modele, test="Chisq"). Ceci vous donnera des tests de rapport de vraisemblance par facteur, et répondra à votre question de savoir quel facteur est significatif ou pas, comme une ANOVA.
2) Dans le summary que vous demandez, vous constatez "(Dispersion parameter for binomial family taken to be 1)". C'est imposé par l'ajustement, mais c'est peut-être faux. Il faudrait ré-ajuster le modèle avec "family = quasibinomial" plutôt que "family = binomial". Dans ce cas, le paramètre de dispersion n'est plus fixé à 1, mais ajusté à partir des données. Il faut s'assurer que ce coefficient reste proche de (ou inférieur à) 1.
Ensuite, il y a effectivement la recherche du modèle le plus parcimonieux, etc, et un critère d'AIC peut faire l'affaire, si nécessaire. Mais ce n'est pas spécifique à la régression logistique.
HTH, Eric.
Oui, c'est moi qui vous ais conseillé une régression logistique.
On progresse.
Il y a deux choses que vous devriez faire à présent :
1) Lancer la commande anova(modele, test="Chisq"). Ceci vous donnera des tests de rapport de vraisemblance par facteur, et répondra à votre question de savoir quel facteur est significatif ou pas, comme une ANOVA.
2) Dans le summary que vous demandez, vous constatez "(Dispersion parameter for binomial family taken to be 1)". C'est imposé par l'ajustement, mais c'est peut-être faux. Il faudrait ré-ajuster le modèle avec "family = quasibinomial" plutôt que "family = binomial". Dans ce cas, le paramètre de dispersion n'est plus fixé à 1, mais ajusté à partir des données. Il faut s'assurer que ce coefficient reste proche de (ou inférieur à) 1.
Ensuite, il y a effectivement la recherche du modèle le plus parcimonieux, etc, et un critère d'AIC peut faire l'affaire, si nécessaire. Mais ce n'est pas spécifique à la régression logistique.
HTH, Eric.
Eric Wajnberg- Nombre de messages : 1238
Date d'inscription : 14/09/2012
Re: Interprétation régression logistique binomiale
Merci pour la réponse !
J'ai donc effectuer une nouvelle régression avec le réajustement que vous m'avez conseillé et j'ai réaliser l'ANOVA par la suite. J'ai obtenu le script suivant :
Au vu des résultats, je peux donc conclure que le test est significatif (H0 est rejeté) pour les facteur pelouse et nichoir. Donc ce sont ces deux facteurs qui peuvent expliquer l'occupation de mes nichoirs si j'ai bien compris ?
Est-il utile de réaliser le même test avec le modèle parcimonieux ? Ou est-ce que j'ai répondu à ma question de base ?
J'ai donc effectuer une nouvelle régression avec le réajustement que vous m'avez conseillé et j'ai réaliser l'ANOVA par la suite. J'ai obtenu le script suivant :
- Code:
> modele=glm(occupe~pose+nichoir+essence+culture+vigne+foret+friche+eau+haie+pelouse+urbain, data=t, family=quasibinomial)
> print(modele)
Call: glm(formula = occupe ~ pose + nichoir + essence + culture + vigne +
foret + friche + eau + haie + pelouse + urbain, family = quasibinomial,
data = t)
Coefficients:
(Intercept) pose2016 pose2017
-9.389e+00 1.475e+00 1.260e+00
nichoirgobemouche essenceAulne essenceChene
-1.713e+01 1.363e-01 -3.092e-01
essenceCypres essenceErable essenceFrene
6.360e-01 1.824e+01 2.021e-01
essencenon_identifie essencePeuplier essencePin
1.805e+01 -5.671e-01 8.488e-01
essenceRobinier essenceSaule culture
-8.236e-02 -1.704e+01 1.176e-05
vigne foret friche
1.118e-05 9.674e-06 8.804e-07
eau haie pelouse
2.963e-06 3.871e-06 2.756e-05
urbain
9.872e-06
Degrees of Freedom: 99 Total (i.e. Null); 78 Residual
Null Deviance: 138.6
Residual Deviance: 110.5 AIC: NA
> print(summary(modele))
Call:
glm(formula = occupe ~ pose + nichoir + essence + culture + vigne +
foret + friche + eau + haie + pelouse + urbain, family = quasibinomial,
data = t)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.26569 -0.99986 0.00001 0.88236 1.92481
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -9.389e+00 1.886e+01 -0.498 0.620
pose2016 1.475e+00 8.810e-01 1.675 0.098
pose2017 1.260e+00 8.661e-01 1.455 0.150
nichoirgobemouche -1.713e+01 2.190e+03 -0.008 0.994
essenceAulne 1.363e-01 4.915e+03 0.000 1.000
essenceChene -3.092e-01 1.859e+00 -0.166 0.868
essenceCypres 6.360e-01 2.269e+00 0.280 0.780
essenceErable 1.824e+01 4.400e+03 0.004 0.997
essenceFrene 2.021e-01 1.903e+00 0.106 0.916
essencenon_identifie 1.805e+01 4.400e+03 0.004 0.997
essencePeuplier -5.671e-01 2.145e+00 -0.264 0.792
essencePin 8.488e-01 1.893e+00 0.448 0.655
essenceRobinier -8.236e-02 2.128e+00 -0.039 0.969
essenceSaule -1.704e+01 4.400e+03 -0.004 0.997
culture 1.176e-05 2.472e-05 0.476 0.636
vigne 1.118e-05 2.424e-05 0.461 0.646
foret 9.674e-06 2.511e-05 0.385 0.701
friche 8.804e-07 2.997e-05 0.029 0.977
eau 2.963e-06 2.828e-05 0.105 0.917
haie 3.871e-06 2.846e-05 0.136 0.892
pelouse 2.756e-05 2.468e-05 1.117 0.268
urbain 9.872e-06 2.486e-05 0.397 0.692
(Dispersion parameter for quasibinomial family taken to be 1.236706)
Null deviance: 138.63 on 99 degrees of freedom
Residual deviance: 110.51 on 78 degrees of freedom
AIC: NA
Number of Fisher Scoring iterations: 16
>
> p=predict(modele,type="response")
> class(modele)
[1] "glm" "lm"
> attributes(modele)
$names
[1] "coefficients" "residuals" "fitted.values"
[4] "effects" "R" "rank"
[7] "qr" "family" "linear.predictors"
[10] "deviance" "aic" "null.deviance"
[13] "iter" "weights" "prior.weights"
[16] "df.residual" "df.null" "y"
[19] "converged" "boundary" "model"
[22] "call" "formula" "terms"
[25] "data" "offset" "control"
[28] "method" "contrasts" "xlevels"
$class
[1] "glm" "lm"
> chi2=modele$null.deviance - modele$deviance
> chi2
[1] 28.11459
> ddl=modele$df.null - modele$df.residual
> ddl
[1] 21
> pvalue=pchisq(chi2,ddl,lower.tail = F)
> pvalue
[1] 0.1369312
> ls()
[1] "chi2" "culture" "ddl"
[4] "eau" "err" "essence"
[7] "foret" "friche" "glm"
[10] "haie" "mc" "modele"
[13] "modele.back" "modele.forward" "modele.step"
[16] "modele.stepw" "modele.trivial" "nichoir"
[19] "occupe" "p" "pelouse"
[22] "pose" "pred.moda" "pred.proba"
[25] "pvalue" "reg" "t"
[28] "urbain" "vigne"
>
> pred.proba= predict(modele,newdata=t, type="response")
> pred.proba
1 2 3 4 5
7.384810e-01 7.163054e-01 7.144246e-01 6.581104e-01 5.412045e-01
6 7 8 9 10
3.019341e-01 2.477738e-01 3.593926e-01 5.442767e-01 6.134556e-01
11 12 13 14 15
6.847416e-01 7.779130e-01 7.853442e-01 7.893950e-01 7.806005e-01
16 17 18 19 20
9.278166e-01 8.411467e-01 7.757747e-01 7.035765e-01 7.993461e-01
21 22 23 24 25
7.967043e-01 8.661627e-01 3.438110e-01 3.435579e-01 2.737438e-01
26 27 28 29 30
1.000000e+00 3.152584e-01 2.350463e-08 2.536448e-08 5.207700e-01
31 32 33 34 35
9.232104e-01 5.424428e-01 6.322602e-01 2.350463e-08 1.912494e-08
36 37 38 39 40
2.954972e-01 1.912849e-08 3.262621e-01 3.150934e-01 3.120459e-08
41 42 43 44 45
3.150261e-01 3.221958e-01 7.617667e-01 7.998330e-01 7.953887e-01
46 47 48 49 50
6.125409e-01 3.866756e-01 3.932322e-01 5.240741e-01 2.735210e-01
51 52 53 54 55
5.371963e-01 4.652132e-01 4.630229e-01 4.819648e-01 6.813364e-01
56 57 58 59 60
4.099869e-01 6.857180e-01 6.820723e-01 6.785593e-01 6.744954e-01
61 62 63 64 65
6.681321e-01 6.817345e-01 4.433281e-01 5.687021e-01 7.236564e-01
66 67 68 69 70
3.991931e-01 4.394948e-01 4.154152e-01 6.194143e-01 4.828879e-01
71 72 73 74 75
4.969552e-01 4.064456e-01 4.783118e-01 4.742883e-01 4.731478e-01
76 77 78 79 80
7.405587e-01 4.709171e-01 5.072183e-01 6.144229e-01 4.258473e-01
81 82 83 84 85
3.943886e-01 3.938319e-01 3.938319e-01 3.960044e-01 1.568531e-01
86 87 88 89 90
1.692544e-01 6.694533e-01 6.680294e-01 1.910203e-01 1.934424e-01
91 92 93 94 95
3.635878e-02 3.583720e-02 1.657003e-01 3.833232e-01 6.275010e-01
96 97 98 99 100
5.136099e-01 7.364370e-01 1.000000e+00 4.297343e-01 1.757098e-01
> pred.moda=factor(ifelse(pred.proba>0.5, "occupe", "non_occupe"))
> pred.moda
1 2 3 4 5 6
occupe occupe occupe occupe occupe non_occupe
7 8 9 10 11 12
non_occupe non_occupe occupe occupe occupe occupe
13 14 15 16 17 18
occupe occupe occupe occupe occupe occupe
19 20 21 22 23 24
occupe occupe occupe occupe non_occupe non_occupe
25 26 27 28 29 30
non_occupe occupe non_occupe non_occupe non_occupe occupe
31 32 33 34 35 36
occupe occupe occupe non_occupe non_occupe non_occupe
37 38 39 40 41 42
non_occupe non_occupe non_occupe non_occupe non_occupe non_occupe
43 44 45 46 47 48
occupe occupe occupe occupe non_occupe non_occupe
49 50 51 52 53 54
occupe non_occupe occupe non_occupe non_occupe non_occupe
55 56 57 58 59 60
occupe non_occupe occupe occupe occupe occupe
61 62 63 64 65 66
occupe occupe non_occupe occupe occupe non_occupe
67 68 69 70 71 72
non_occupe non_occupe occupe non_occupe non_occupe non_occupe
73 74 75 76 77 78
non_occupe non_occupe non_occupe occupe non_occupe occupe
79 80 81 82 83 84
occupe non_occupe non_occupe non_occupe non_occupe non_occupe
85 86 87 88 89 90
non_occupe non_occupe occupe occupe non_occupe non_occupe
91 92 93 94 95 96
non_occupe non_occupe non_occupe non_occupe occupe occupe
97 98 99 100
occupe occupe non_occupe non_occupe
Levels: non_occupe occupe
> ls()
[1] "chi2" "culture" "ddl"
[4] "eau" "err" "essence"
[7] "foret" "friche" "glm"
[10] "haie" "mc" "modele"
[13] "modele.back" "modele.forward" "modele.step"
[16] "modele.stepw" "modele.trivial" "nichoir"
[19] "occupe" "p" "pelouse"
[22] "pose" "pred.moda" "pred.proba"
[25] "pvalue" "reg" "t"
[28] "urbain" "vigne"
> mc=table(t$occupe,pred.moda)
> class(mc)
[1] "table"
> mc
pred.moda
non_occupe occupe
non_occupe 37 13
occupe 14 36
>
> err=(mc[2,1]+mc[1.2])/sum(mc)
> err
[1] 0.51
> ls()
[1] "chi2" "culture" "ddl"
[4] "eau" "err" "essence"
[7] "foret" "friche" "glm"
[10] "haie" "mc" "modele"
[13] "modele.back" "modele.forward" "modele.step"
[16] "modele.stepw" "modele.trivial" "nichoir"
[19] "occupe" "p" "pelouse"
[22] "pose" "pred.moda" "pred.proba"
[25] "pvalue" "reg" "t"
[28] "urbain" "vigne"
> library(MASS)
> modele.back=stepAIC(modele,scope=list(lower="occupe~1", upper="occupe~pose+nichoir+essence+culture+vigne+haie+pelouse+friche+eau+urbain+foret"),direction="backward")
Error in stepAIC(modele, scope = list(lower = "occupe~1", upper = "occupe~pose+nichoir+essence+culture+vigne+haie+pelouse+friche+eau+urbain+foret"), :
AIC n'est pas défini pour ce modèle, 'stepAIC' ne peut poursuivre
> modele.back
Call: glm(formula = occupe ~ nichoir + pelouse, family = binomial,
data = t)
Coefficients:
(Intercept) nichoirgobemouche pelouse
-1.202e-01 -1.645e+01 8.020e-06
Degrees of Freedom: 99 Total (i.e. Null); 97 Residual
Null Deviance: 138.6
Residual Deviance: 128.1 AIC: 134.1
>
>
> modele.trivial=glm(occupe~1,data=t,family=binomial)
> modele.forward=stepAIC(modele.trivial,scope=list(lower="occupe~1", upper="occupe~pose+nichoir+essence+culture+vigne+foret+haie+pelouse+friche+eau+urbain"),direction="forward")
Start: AIC=140.63
occupe ~ 1
Df Deviance AIC
+ nichoir 1 131.44 135.44
+ eau 1 133.63 137.63
+ pelouse 1 134.14 138.14
<none> 138.63 140.63
+ culture 1 137.27 141.27
+ urbain 1 137.86 141.86
+ foret 1 137.94 141.94
+ friche 1 138.42 142.42
+ haie 1 138.52 142.52
+ vigne 1 138.54 142.54
+ pose 2 137.87 143.87
+ essence 10 128.36 150.36
Step: AIC=135.43
occupe ~ nichoir
Df Deviance AIC
+ pelouse 1 128.09 134.09
+ eau 1 128.99 134.99
<none> 131.44 135.44
+ culture 1 130.56 136.56
+ foret 1 131.04 137.04
+ urbain 1 131.21 137.21
+ friche 1 131.29 137.29
+ vigne 1 131.30 137.30
+ haie 1 131.38 137.38
+ pose 2 130.42 138.42
+ essence 10 123.12 147.12
Step: AIC=134.09
occupe ~ nichoir + pelouse
Df Deviance AIC
+ eau 1 125.83 133.83
<none> 128.09 134.09
+ pose 2 125.12 135.12
+ foret 1 127.38 135.38
+ culture 1 127.38 135.38
+ friche 1 127.87 135.87
+ urbain 1 127.93 135.93
+ vigne 1 127.97 135.97
+ haie 1 128.08 136.08
+ essence 10 116.57 142.57
Step: AIC=133.83
occupe ~ nichoir + pelouse + eau
Df Deviance AIC
<none> 125.83 133.83
+ foret 1 125.12 135.12
+ culture 1 125.33 135.33
+ pose 2 123.48 135.48
+ haie 1 125.69 135.69
+ friche 1 125.73 135.73
+ urbain 1 125.76 135.76
+ vigne 1 125.80 135.80
+ essence 10 115.97 143.97
> modele.forward
Call: glm(formula = occupe ~ nichoir + pelouse + eau, family = binomial,
data = t)
Coefficients:
(Intercept) nichoirgobemouche pelouse
8.893e-01 -1.599e+01 8.116e-06
eau
-1.698e-05
Degrees of Freedom: 99 Total (i.e. Null); 96 Residual
Null Deviance: 138.6
Residual Deviance: 125.8 AIC: 133.8
> modele.stepw=glm(occupe~1,data=t,family=binomial)
> modele.step=stepAIC(modele.stepw,scope=list(lower="occupe~1", upper="occupe~pose+nichoir+essence+culture+vigne+foret+haie+pelouse+friche+eau+urbain"),direction="both")
Start: AIC=140.63
occupe ~ 1
Df Deviance AIC
+ nichoir 1 131.44 135.44
+ eau 1 133.63 137.63
+ pelouse 1 134.14 138.14
<none> 138.63 140.63
+ culture 1 137.27 141.27
+ urbain 1 137.86 141.86
+ foret 1 137.94 141.94
+ friche 1 138.42 142.42
+ haie 1 138.52 142.52
+ vigne 1 138.54 142.54
+ pose 2 137.87 143.87
+ essence 10 128.36 150.36
Step: AIC=135.43
occupe ~ nichoir
Df Deviance AIC
+ pelouse 1 128.09 134.09
+ eau 1 128.99 134.99
<none> 131.44 135.44
+ culture 1 130.56 136.56
+ foret 1 131.04 137.04
+ urbain 1 131.21 137.21
+ friche 1 131.29 137.29
+ vigne 1 131.30 137.30
+ haie 1 131.38 137.38
+ pose 2 130.42 138.42
- nichoir 1 138.63 140.63
+ essence 10 123.12 147.12
Step: AIC=134.09
occupe ~ nichoir + pelouse
Df Deviance AIC
+ eau 1 125.83 133.83
<none> 128.09 134.09
+ pose 2 125.12 135.12
+ foret 1 127.38 135.38
+ culture 1 127.38 135.38
- pelouse 1 131.44 135.44
+ friche 1 127.87 135.87
+ urbain 1 127.93 135.93
+ vigne 1 127.97 135.97
+ haie 1 128.08 136.08
- nichoir 1 134.14 138.14
+ essence 10 116.57 142.57
Step: AIC=133.83
occupe ~ nichoir + pelouse + eau
Df Deviance AIC
<none> 125.83 133.83
- eau 1 128.09 134.09
- pelouse 1 128.99 134.99
+ foret 1 125.12 135.12
+ culture 1 125.33 135.33
+ pose 2 123.48 135.48
+ haie 1 125.69 135.69
+ friche 1 125.73 135.73
+ urbain 1 125.76 135.76
+ vigne 1 125.80 135.80
- nichoir 1 129.92 135.92
+ essence 10 115.97 143.97
>
> anova(modele, test = "Chisq")
Analysis of Deviance Table
Model: quasibinomial, link: logit
Response: occupe
Terms added sequentially (first to last)
Df Deviance Resid. Df Resid. Dev Pr(>Chi)
NULL 99 138.63
pose 2 0.7573 97 137.87 0.73627
nichoir 1 7.4518 96 130.42 0.01410
essence 10 8.6237 86 121.80 0.72798
culture 1 0.1801 85 121.62 0.70274
vigne 1 0.0061 84 121.61 0.94398
foret 1 0.2295 83 121.38 0.66663
friche 1 0.8177 82 120.56 0.41614
eau 1 2.2168 81 118.35 0.18062
haie 1 0.1000 80 118.25 0.77613
pelouse 1 7.4698 79 110.78 0.01398
urbain 1 0.2618 78 110.52 0.64546
Au vu des résultats, je peux donc conclure que le test est significatif (H0 est rejeté) pour les facteur pelouse et nichoir. Donc ce sont ces deux facteurs qui peuvent expliquer l'occupation de mes nichoirs si j'ai bien compris ?
Est-il utile de réaliser le même test avec le modèle parcimonieux ? Ou est-ce que j'ai répondu à ma question de base ?
MarionL- Nombre de messages : 5
Date d'inscription : 18/08/2017
Re: Interprétation régression logistique binomiale
Avec family=quasibinomial, vous obtenez un paramètre de dispersion de 1.236706, ce qui est propre (proche de 1). Vos données semblent effectivement coller avec une loi binomiale.
Un point technique cependant, dans le cas de family=quasibinomial, la théorie recommande un test F plutôt qu'un test de chi2, i.e., avec anova(modele, test="F"). (voir la doc on-line de la fonction anova.glm). Mais ça ne changera pas grand-chose dans votre cas.
Pour le reste, oui, les facteurs pelouse et nichoir sont les seuls qui sont significatifs, apparement. A présent :
1) La recherche du modèle le plus parcimonieux est un choix ou non de votre part, pas une obligation. La logique ici, effectivement, serait de reprendre le modèle avec ces deux seuls facteurs pris en compte (et la même démarche de test), mais dans ce cas, des facteurs qui n'étaient pas significatifs peuvent le devenir, si vous tester l'effet de leur ajout, etc. Il y là donc une procédure itérative à réaliser, avec une série d'ajouts et de rejets, jusqu'à ce que ceci se stabilise. Je fais généralement ça à la main (avec des fonctions persos), mais il y a des packages qui font ça sous R (par exemple le package "MuMIn"). A vous de voir.
2) Vous n'avez rentré que les effets principaux dans votre modèle, mais vous pourriez être intéressée par les interactions également, notamment, évidement, par l'interaction pelouse x nichoir (entre d'autres possibles). Vous pouvez aussi tester les interactions avec la même démarche que ce que vous avez fait.
HTH, Eric.
Un point technique cependant, dans le cas de family=quasibinomial, la théorie recommande un test F plutôt qu'un test de chi2, i.e., avec anova(modele, test="F"). (voir la doc on-line de la fonction anova.glm). Mais ça ne changera pas grand-chose dans votre cas.
Pour le reste, oui, les facteurs pelouse et nichoir sont les seuls qui sont significatifs, apparement. A présent :
1) La recherche du modèle le plus parcimonieux est un choix ou non de votre part, pas une obligation. La logique ici, effectivement, serait de reprendre le modèle avec ces deux seuls facteurs pris en compte (et la même démarche de test), mais dans ce cas, des facteurs qui n'étaient pas significatifs peuvent le devenir, si vous tester l'effet de leur ajout, etc. Il y là donc une procédure itérative à réaliser, avec une série d'ajouts et de rejets, jusqu'à ce que ceci se stabilise. Je fais généralement ça à la main (avec des fonctions persos), mais il y a des packages qui font ça sous R (par exemple le package "MuMIn"). A vous de voir.
2) Vous n'avez rentré que les effets principaux dans votre modèle, mais vous pourriez être intéressée par les interactions également, notamment, évidement, par l'interaction pelouse x nichoir (entre d'autres possibles). Vous pouvez aussi tester les interactions avec la même démarche que ce que vous avez fait.
HTH, Eric.
Eric Wajnberg- Nombre de messages : 1238
Date d'inscription : 14/09/2012
Re: Interprétation régression logistique binomiale
Merci pour tous vos conseils. Vous m'avez grandement aidé.
Je vais voir maintenant avec mes responsables si je pousse les tests plus loin avec ce que vous m'avez conseillé.
En tout cas, encore merci !
Marion
Je vais voir maintenant avec mes responsables si je pousse les tests plus loin avec ce que vous m'avez conseillé.
En tout cas, encore merci !
Marion
MarionL- Nombre de messages : 5
Date d'inscription : 18/08/2017
Sujets similaires
» binomiale negative vs regression logistique
» Interprétation Regression logistique
» interprétation régression logistique
» [RStat] régression logistique, graphe et interprétation
» interprétation de la régression logistique sous R
» Interprétation Regression logistique
» interprétation régression logistique
» [RStat] régression logistique, graphe et interprétation
» interprétation de la régression logistique sous R
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum