Skip to content

analyse-R/regression-logistique #110

Closed

Description

@utterances-bot

Régression logistique binaire, multinomiale et ordinale

undefined

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

Activity

  1. petitscarabee010 commented on Nov 14, 2019

    @petitscarabee010

    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

  2. enzo7-196 commented on Mar 13, 2020

    @enzo7-196

    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

  3. loicjochault commented on Dec 8, 2020

    @loicjochault

    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.

  4. larmarange commented on Dec 8, 2020

    @larmarange
    Owner

    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

  5. loicjochault commented on Dec 9, 2020

    @loicjochault
  6. Gemma92bcn commented on Jan 23, 2021

    @Gemma92bcn

    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...

  7. larmarange commented on Jan 26, 2021

    @larmarange
    Owner

    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.

  8. Juliagz commented on Jun 22, 2021

    @Juliagz

    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 !

  9. larmarange commented on Jun 23, 2021

    @larmarange
    Owner

    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.

  10. Juliagz commented on Jun 23, 2021

    @Juliagz
  11. enzo7-196 commented on Jun 23, 2021

    @enzo7-196

    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.

  12. larmarange commented on Jun 23, 2021

    @larmarange
    Owner

    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 ) ?

  13. enzo7-196 commented on Jun 23, 2021

    @enzo7-196

    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 )

  14. larmarange commented on Jun 23, 2021

    @larmarange
    Owner

    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)

  15. larmarange commented on Jun 23, 2021

    @larmarange
    Owner

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

    • beta10 est l'intercept pour l'outcome 1 versus 0
    • beta20 est l'intercept pour l'outcome 2 versus 0
    • factor(time)6:1 est l'OR de la modalité 6 de factor(time) (versus time = 0) pour y = 1 vs y=0
    • factor(time)6:2 est l'OR de la modalité 6 de factor(time) pour y = 2 vs y=0
  16. enzo7-196 commented on Jun 24, 2021

    @enzo7-196

    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

  17. larmarange commented on Jun 24, 2021

    @larmarange
    Owner

    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

  18. enzo7-196 commented on Jun 24, 2021

    @enzo7-196

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

  19. Lion766 commented on Jun 26, 2021

    @Lion766

    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

  20. larmarange commented on Jun 27, 2021

    @larmarange
    Owner

    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

  21. larmarange commented on Jun 27, 2021

    @larmarange
    Owner

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

  22. Lion766 commented on Jun 27, 2021

    @Lion766
  23. Repository owner locked and limited conversation to collaborators on Oct 22, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions