larmarange / analyse-R

Introduction à l'analyse d'enquêtes avec R et RStudio
https://larmarange.github.io/analyse-R/
53 stars 40 forks source link

analyse-R/regression-logistique #110

Closed utterances-bot closed 2 years ago

utterances-bot commented 4 years ago

Régression logistique binaire, multinomiale et ordinale

undefined

http://larmarange.github.io/analyse-R/regression-logistique.html

petitscarabee010 commented 4 years ago

bonjour, merci pour ce tutoriel qui est vraiment très bien et qui m'aide énormément. Si je peux toutefois suggérer une amélioration qui serait utile pour les novices comme moi, ce serait de rajouter ponctuellement une petite phrase d'interprétation/explication des sorties, car cela aiderait bien à la compréhension. Encore merci

enzo7-196 commented 4 years ago

Bonjour, Merci encore pour vos tutoriels très édifiants. Ils sont complets et personnellement m'apporte beaucoup, cependant j'ai une petite question s'il vous plaît: Actuellement je travaille sur des données d'enquête pondérées (package "survey" et "weights" déjà installés) et j'aimerais avoir un p-for-trend (autrement dit une p-value de test de tendance) pour des variables de ma base (binaire et continue) en fonction d'une variable catégorielle à 3 classes. D'après vos tutos je pense que la fonction "svyolr" est celle qui me permettra d'avoir ce p-for-trend: me recommandez vous cette approche par une regression logistique ordinale? Si oui dans le script présenté j'aimerais savoir à quoi correspond le "t-value" lorsqu'on execute la fonction "svyolr"... Merci pour vos éclaircissements

loicjochault commented 3 years ago

Bonjour Merci beaucoup pour ce tutoriel très clair, mais je suis confronté à un problème sur le format de ma variable dépendante , j'ai le message suivant :

cplt1<-glm(NB~sex,data=A,family = binomial(link = logit)) Error in weights * y : non-numeric argument to binary operator

Alors que ma variable NB est une variable texte "oui/non", si je passe en 0/1, l'analyse des tableaux all-in-one la considère comme quantitative ....

Je vous remercie par avance de votre aide.

larmarange commented 3 years ago

Il faut la convertir en un facteur avec factor(). De plus, il est important que vous modifier l'ordre du facteur pour que la première modalité soit celle de référence (voir la fonction relevel()).

Cdlt

loicjochault commented 3 years ago

Je vous remercie très chaleureusement pour votre réponse. Bonne journée.

Le mar. 8 déc. 2020 à 14:07, Joseph notifications@github.com a écrit :

Il faut la convertir en un facteur avec factor(). De plus, il est important que vous modifier l'ordre du facteur pour que la première modalité soit celle de référence (voir la fonction relevel()).

Cdlt

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/larmarange/analyse-R/issues/110#issuecomment-740608436, or unsubscribe https://github.com/notifications/unsubscribe-auth/ASBKN6H5C374WNI3CD5A3GLSTYQJ5ANCNFSM4JNMPP2Q .

Gemma92bcn commented 3 years ago

Pouvez-vous parler sur les hypothèses d'utilisation des regressions logiques? Car je veux bien l'appliquer à mes données, mais elles sont à mesures répétées. J'ai lu sur plusieurs sites (et un livre de stats) qu'il n'est pas possible d'utiliser cette méthode avec des mésures répétées...

larmarange commented 3 years ago

En effet, dans le cadre d'une régression logistique classique (avec glm) les différentes observations sont supposées indépendantes. Or ce n'est pas le cas avec des observations répétées. Dans une telle situation, vous devez tenir compte de la répétition en réalisant un modèle mixte avec une variable aléatoire (fonction glmer du package lme4) ou bien réalisé un modèle dit GEE (voir la fonction geeglm du package geepack).

Vous pouvez jeter un oeil à http://larmarange.github.io/analyse-R/modeles-a-effets-aleatoires.html mais ce chapitre (non finalisé) est encore trop ardu dans sa rédaction me semble t il.

Juliagz commented 3 years ago

Bonjour, déjà merci pour vos webinaires, ils sont fabuleux !

J'ai plusieurs erreurs qui sortent lorsque je lance les opérations sur mon modèle de régression logistique multinomiale. Après avoir lancé la commande pour set ma valeur de référence, je lance un check de VIF, et reçoit "in multinom (...) group '0' 'na' are empty". Si je continue sur le code en ignorant ce message, divers autres erreurs apparaissent au fur et à mesure que j'éxecute les autres : "NaNs produced" (avec odds.ratio et step), "broom::tidy failed to tidy the model" (avec tbl_regression et ggcoef_multinom). J'imagine qu'il s'est passé quelque chose lors de la création du modèle, mais comment l'analyser et trouver l'origine de l'erreur (puis bien sur, le corriger) ?

J'ai également une autre question : peut-on définir comme une référence pour chacune des variables explicatives ? Par exemple, déterminer une observation globale de référence comprenant une modalité de chaque variable explicative que je définirai moi-même. Si oui, comment ?

Merci d'avance !

larmarange commented 3 years ago

Bonjour,

difficile de vous répondre sans exemple reproductible (voir http://adv-r.had.co.nz/Reproducibility.html )

En premier lieu, je ne suis pas certain que la fonction car::vif() fonctionne avec les modèles nnet::multinom(). Voir https://stackoverflow.com/questions/61083073/vif-function-from-car-package-returns-nas-when-assessing-multinomial-logistic

Pour questionr::odds.ratio() et broom::tidy(), il faudrait un exemple reproductible pour comprendre d'où vient l'erreur.

peut-on définir comme une référence pour chacune des variables explicatives ? Par exemple, déterminer une observation globale de référence comprenant une modalité de chaque variable explicative que je définirai moi-même. Si oui, comment ?

Je ne suis pas sur d'avoir compris la question.

Juliagz commented 3 years ago

Bonjour Joseph,

Merci pour ce retour rapide !

Je n'ai pas réussi à attacher proprement mes données avec la fonction dput, mais je vous ajoute le fichier .csv en pièce jointe, ainsi que le code (c'est ce que je fais de mon côté).

J'ai rajouté des commentaires là où les erreurs viennent, ainsi que la base de la création de mon dataframe au cas où je l'aurais mal pensé et que cela induirait ces erreurs.

Je vous remercie d'avance pour votre temps et votre aide !

Julia

Le mer. 23 juin 2021 à 09:22, Joseph @.***> a écrit :

Bonjour,

difficile de vous répondre sans exemple reproductible (voir http://adv-r.had.co.nz/Reproducibility.html )

En premier lieu, je ne suis pas certain que la fonction car::vif() fonctionne avec les modèles nnet::multinom(). Voir https://stackoverflow.com/questions/61083073/vif-function-from-car-package-returns-nas-when-assessing-multinomial-logistic

Pour questionr::odds.ratio() et broom::tidy(), il faudrait un exemple reproductible pour comprendre d'où vient l'erreur.

peut-on définir comme une référence pour chacune des variables explicatives ? Par exemple, déterminer une observation globale de référence comprenant une modalité de chaque variable explicative que je définirai moi-même. Si oui, comment ?

Je ne suis pas sur d'avoir compris la question.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/larmarange/analyse-R/issues/110#issuecomment-866596070, or unsubscribe https://github.com/notifications/unsubscribe-auth/AUSQI2P4TEL2U7O5QH55Z6LTUGDRXANCNFSM4JNMPP2Q .

--

enzo7-196 commented 3 years ago

Bonjour Joseph,

Une fois de plus merci pour ce tutoriel que vous nous partagez et qui nous aide beaucoup en soutien statistique dans notre quotidien. Je vous contacte car j'aimerais avoir votre avis sur un package développé par Touloumis en 2013, le package "multgee" qui permet l'analyse de modèles GEE pour les outcomes à plus de 2 modalités (multinomiaux et ordinaux) : https://cran.r-project.org/web/packages/multgee/multgee.pdf https://onlinelibrary.wiley.com/doi/full/10.1111/biom.12054

Les 2 principales fonctions sont nomLORgee et ordLORgee. Son approche consiste à estimer des Odds ratio locaux à partir du paramètre "alpha" (intercept) qui prend en compte les covariables, les modalités de la variable réponse, et la mesure des corrélations et non indépendance des données. La sortie R nous présente des coefficients, erreurs standards et p-value classiques, et en plus une matrice d'OR locaux dont je n'arrive pas à comprendre l'interprétation.

J'aimerais savoir si ces OR locaux sont différents des OR classiques, estimés à partir de l'exponentiel du coefficient "beta" des covariables dans un modèle uni ou multivarié, et comment les interpréter ? Et comment obtenir des OR associés aux covariables dans un modèle GEE multinomial car la méthode exp(coef(modèle)) semble ne pas marcher.

Merci d'avance.

larmarange commented 3 years ago

Le package multgee est effectivement le plus adapté pour des modèles GEE logistiques multinomiaux et ordinaux.

Concernant la question sur les sorties R, aurions-vous un exemple concret (voir http://adv-r.had.co.nz/Reproducibility.html ) ?

enzo7-196 commented 3 years ago

Merci beaucoup pour votre réponse rapide.

En effet voici un exemple issu de la librairie de la fonction "nomLORgee", celle sur laquelle j'ai des difficultés actuellement dans l'analyse de mes données :

Editeur R :

library(multgee) data(housing) fitmod <- nomLORgee(y ~ factor(time), data = housing, id = id, repeated = time) summary(fitmod)

Console R (output):

fitmod <- nomLORgee(y ~ factor(time), data = housing, id = id,

  • repeated = time) summary(fitmod) GEE FOR NOMINAL MULTINOMIAL RESPONSES version 1.6.0 modified 2017-07-10

Link : Baseline Category Logit

Local Odds Ratios: Structure: time.exch Model: 3way Homogenous scores: TRUE

call: nomLORgee(formula = y ~ factor(time), data = housing, id = id, repeated = time)

Summary of residuals: Min. 1st Qu. Median Mean 3rd Qu. Max. -0.498615 -0.363966 -0.126836 -0.002905 0.501385 0.889580

Number of Iterations: 2

Coefficients: Estimate san.se san.z Pr(>|san.z|)
beta10 1.38629 0.16667 8.3178 < 2.2e-16 factor(time)6:1 -2.51068 0.21679 -11.5813 < 2.2e-16 factor(time)12:1 -2.94657 0.23682 -12.4421 < 2.2e-16 factor(time)24:1 -2.81595 0.22938 -12.2763 < 2.2e-16 beta20 1.10599 0.17197 6.4312 < 2.2e-16 factor(time)6:2 -1.10949 0.19952 -5.5607 < 2.2e-16 factor(time)12:2 -1.47350 0.20820 -7.0772 < 2.2e-16 factor(time)24:2 -1.53984 0.20433 -7.5361 < 2.2e-16

Signif. codes: 0 ‘’ 0.001 ‘’ 0.01 ‘’ 0.05 ‘.’ 0.1 ‘ ’ 1

Local Odds Ratios Estimates: [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [1,] 0.000 0.000 1.359 1.882 1.359 1.882 1.359 1.882 [2,] 0.000 0.000 1.882 3.687 1.882 3.687 1.882 3.687 [3,] 1.359 1.882 0.000 0.000 1.359 1.882 1.359 1.882 [4,] 1.882 3.687 0.000 0.000 1.882 3.687 1.882 3.687 [5,] 1.359 1.882 1.359 1.882 0.000 0.000 1.359 1.882 [6,] 1.882 3.687 1.882 3.687 0.000 0.000 1.882 3.687 [7,] 1.359 1.882 1.359 1.882 1.359 1.882 0.000 0.000 [8,] 1.882 3.687 1.882 3.687 1.882 3.687 0.000 0.000

p-value of Null model: < 0.0001

La variable "y" a 3 modalités : 0, 1, 2

la variable "time" a 3 modalités : 6, 12, 24

Généralement, nous pouvons faire un exp(coef(fitmod)) pour récupérer les OR, et éventuellement un confint(fitmod) pour les Intervalles de confiance à 95 %. Cependant, en utilisant cette syntaxe, je n'obtiens pas des OR, enfin j'obtiens des valeurs mais qui ne correspondent probablement pas à des OR dans cet exemple

Console R (output):

exp(coef(fitmod)) beta10 factor(time)6:1 factor(time)12:1 factor(time)24:1 beta20 factor(time)6:2 factor(time)12:2 factor(time)24:2 4.00000000 0.08121302 0.05251965 0.05984777 3.02222222 0.32972804 0.22912259 0.21441438

Ainsi je me demande à quoi correspond donc les estiamtions des coefficients dans le "summary", et surtout comment lire et interpréter la matrice de "local Odds Ratios Estimates" à la fin de la sortie.

Merci d'avance et désolé pour cette illustration car je ne suis pas parvenu à reproduire cet exemple via (http://adv-r.had.co.nz/Reproducibility.html )

larmarange commented 3 years ago

Ce sont les premiers coefficients qui sont les plus importants et qui correspondent aux différents odds ratios. Les local OR traduisent quant à eux les ajustements pris en compte par le GEE pour tenir de la répétition des observations.

Il n'y a pas de méthode tidy pour ces modèles. Mais il est possible d'avoir recours aux fonctions génériques coef() et confint(). La fonction générique tidy_model() que j'ai développé dans JLutils fonctionne aussi pour ces modèles. Voir exemple ci-dessous.

library(multgee)
#> Le chargement a nécessité le package : gnm
data(housing)
fitmod <- nomLORgee(y ~ factor(time), data = housing, id = id,
                    repeated = time)
summary(fitmod)
#> GEE FOR NOMINAL MULTINOMIAL RESPONSES 
#> version 1.6.0 modified 2017-07-10 
#> 
#> Link : Baseline Category Logit 
#> 
#> Local Odds Ratios:
#> Structure:         time.exch
#> Model:             3way
#> Homogenous scores: TRUE
#> 
#> call:
#> nomLORgee(formula = y ~ factor(time), data = housing, id = id, 
#>     repeated = time)
#> 
#> Summary of residuals:
#>      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
#> -0.498615 -0.363966 -0.126836 -0.002905  0.501385  0.889580 
#> 
#> Number of Iterations: 2 
#> 
#> Coefficients:
#>                  Estimate   san.se    san.z Pr(>|san.z|)    
#> beta10            1.38629  0.16667   8.3178    < 2.2e-16 ***
#> factor(time)6:1  -2.51068  0.21679 -11.5813    < 2.2e-16 ***
#> factor(time)12:1 -2.94657  0.23682 -12.4421    < 2.2e-16 ***
#> factor(time)24:1 -2.81595  0.22938 -12.2763    < 2.2e-16 ***
#> beta20            1.10599  0.17197   6.4312    < 2.2e-16 ***
#> factor(time)6:2  -1.10949  0.19952  -5.5607    < 2.2e-16 ***
#> factor(time)12:2 -1.47350  0.20820  -7.0772    < 2.2e-16 ***
#> factor(time)24:2 -1.53984  0.20433  -7.5361    < 2.2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Local Odds Ratios Estimates:
#>       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
#> [1,] 0.000 0.000 1.359 1.882 1.359 1.882 1.359 1.882
#> [2,] 0.000 0.000 1.882 3.687 1.882 3.687 1.882 3.687
#> [3,] 1.359 1.882 0.000 0.000 1.359 1.882 1.359 1.882
#> [4,] 1.882 3.687 0.000 0.000 1.882 3.687 1.882 3.687
#> [5,] 1.359 1.882 1.359 1.882 0.000 0.000 1.359 1.882
#> [6,] 1.882 3.687 1.882 3.687 0.000 0.000 1.882 3.687
#> [7,] 1.359 1.882 1.359 1.882 1.359 1.882 0.000 0.000
#> [8,] 1.882 3.687 1.882 3.687 1.882 3.687 0.000 0.000
#> 
#> p-value of Null model: < 0.0001

coef(fitmod)
#>           beta10  factor(time)6:1 factor(time)12:1 factor(time)24:1 
#>         1.386294        -2.510680        -2.946568        -2.815951 
#>           beta20  factor(time)6:2 factor(time)12:2 factor(time)24:2 
#>         1.105992        -1.109487        -1.473498        -1.539845
exp(coef(fitmod))
#>           beta10  factor(time)6:1 factor(time)12:1 factor(time)24:1 
#>       4.00000000       0.08121300       0.05251965       0.05984775 
#>           beta20  factor(time)6:2 factor(time)12:2 factor(time)24:2 
#>       3.02222222       0.32972801       0.22912260       0.21441433

confint(fitmod)
#>                       2.5 %     97.5 %
#> beta10            1.0596337  1.7129550
#> factor(time)6:1  -2.9355743 -2.0857855
#> factor(time)12:1 -3.4107321 -2.4824036
#> factor(time)24:1 -3.2655290 -2.3663738
#> beta20            0.7689289  1.4430559
#> factor(time)6:2  -1.5005438 -0.7184306
#> factor(time)12:2 -1.8815702 -1.0654259
#> factor(time)24:2 -1.9403234 -1.1393666
exp(confint(fitmod))
#>                       2.5 %     97.5 %
#> beta10           2.88531390 5.54532386
#> factor(time)6:1  0.05310021 0.12420951
#> factor(time)12:1 0.03301702 0.08354218
#> factor(time)24:1 0.03817673 0.09382032
#> beta20           2.15745426 4.23361336
#> factor(time)6:2  0.22300886 0.48751675
#> factor(time)12:2 0.15235070 0.34458108
#> factor(time)24:2 0.14365749 0.32002165

source(url("https://raw.githubusercontent.com/larmarange/JLutils/master/R/tidy_model.R"))
tidy_model(fitmod, conf.int = TRUE, exponentiate = TRUE)
#>               term   estimate std.error statistic p.value   conf.low  conf.high
#> 1           beta10 3.99998256   0.16667   8.31777       0 2.88531390 5.54532386
#> 2           beta20 3.02221498   0.17197   6.43115       0 2.15745426 4.23361336
#> 3 factor(time)12:1 0.05251954   0.23682 -12.44208       0 0.03301702 0.08354218
#> 4 factor(time)12:2 0.22912215   0.20820  -7.07719       0 0.15235070 0.34458108
#> 5 factor(time)24:1 0.05984784   0.22938 -12.27633       0 0.03817673 0.09382032
#> 6 factor(time)24:2 0.21441541   0.20433  -7.53609       0 0.14365749 0.32002165
#> 7  factor(time)6:1 0.08121300   0.21679 -11.58133       0 0.05310021 0.12420951
#> 8  factor(time)6:2 0.32972708   0.19952  -5.56072       0 0.22300886 0.48751675

Created on 2021-06-23 by the reprex package (v2.0.0)

larmarange commented 3 years ago

Pour rappel, c'est un modèle multinomial et la variable y prend trois valeurs : 0, 1, 2

enzo7-196 commented 3 years ago

Bonjour, merci beaucoup pour votre intervention et pour ces illustrations.

En effet j'en étais arrivé aux mêmes conclusions que vous, que les OR qui nous interressent sont ceux obtenus à partir de l'exponentiel des coefficients du modèle. Cependant ces OR obtenus me semblent très faibles. Vous remarquerez qu'ils sont tous inférieurs à 1 (les OR qui correspondent aux modalités de la covariable "time"), et c'est le cas également lorsque j'applique cette formule aux données sur lesquelles je travaille. J'obtiens toujours des chiffres très bas, pour mon outcome à 3 catégories.

C'est ce qui m'interroge le plus sur la pertinence des OR obtenus par cette fonction.

Gildas

larmarange commented 3 years ago

Tout dépend de vos données. S'il y a peu d'individus dont la situation change au cours du temps, il est normal que les OR soient faibles

enzo7-196 commented 3 years ago

D'accord je comprends. Merci beaucoup pour vos explications !

Lion766 commented 3 years ago

Bonjour, Je voulais savoir s'il y a une fonction plus simple qui permet de générer les résultats(OR, IC95%, p-value) d'analyse multivariée et univariées d'une régression logistique dans un même tableau d'un coup svp? J'essaie d'utiliser tbl_régression mais ça me génère uniquement les résultat de la régression multivariée. J'ai 25 variable indépendante à utiliser pour l'analyse univariée et ceux pour 5 critères de jugements....Merci

larmarange commented 3 years ago

Bonjour

tbl_uvregression() permets de réaliser les multiples régressions univariées en une seule opération et un seul tableau.

tbl_merge() permets de fusionner deux tableaux en un seul.

J'ai ajouté un exemple concret dans le chapitre sur la régression logistique : https://larmarange.github.io/analyse-R/regression-logistique.html#gtsummary

larmarange commented 3 years ago

Pour la régression logistique, vous pouvez également regarder du côté de l'extension finalfit également présentée dans ce chapitre.

Lion766 commented 3 years ago

Bonjour, Merci beaucoup de votre retour. 🙏🏾

Le 27 juin 2021 à 13:28, Joseph @.***> a écrit :

 Bonjour

tbl_uvregression() permets de réaliser les multiples régressions univariées en une seule opération et un seul tableau.

tbl_merge() permets de fusionner deux tableaux en un seul.

J'ai ajouté un exemple concret dans le chapitre sur la régression logistique : https://larmarange.github.io/analyse-R/regression-logistique.html#gtsummary

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.