Comment réduire les prédicteurs de la bonne façon pour un modèle de régression logistique

9

J'ai donc lu quelques livres (ou des parties d'entre eux) sur la modélisation (F. Harrell's "Regression Modeling Strategies" entre autres), car ma situation actuelle est que je dois faire un modèle logistique basé sur des données de réponse binaires. J'ai à la fois des données continues, catégoriques et binaires (prédicteurs) dans mon ensemble de données. En gros, j'ai environ 100 prédicteurs en ce moment, ce qui est évidemment beaucoup trop pour un bon modèle. De plus, beaucoup de ces prédicteurs sont en quelque sorte liés, car ils sont souvent basés sur la même métrique, bien qu'un peu différents.

Quoi qu'il en soit, ce que j'ai lu, en utilisant la régression univariée et les techniques par étapes, est l'une des pires choses que vous puissiez faire afin de réduire la quantité de prédicteurs. Je pense que la technique LASSO est tout à fait correcte (si j'ai bien compris), mais de toute évidence, vous ne pouvez pas l'utiliser sur 100 prédicteurs et pensez que tout cela en résultera.

Alors, quelles sont mes options ici? Dois-je vraiment juste m'asseoir, parler à tous mes superviseurs et aux personnes intelligentes au travail, et vraiment réfléchir à ce que les 5 meilleurs prédicteurs pourraient / devraient être (nous pourrions avoir tort), ou quelle (s) approche (s) devrais-je utiliser envisager à la place?

Et oui, je sais aussi que ce sujet est largement discuté (en ligne et dans les livres), mais cela semble parfois un peu écrasant lorsque vous êtes un peu nouveau dans ce domaine de la modélisation.

ÉDITER:

Tout d'abord, la taille de mon échantillon est de +1000 patients (ce qui est beaucoup dans mon domaine), et parmi ceux-ci, il y a entre 70 et 170 réponses positives (soit 170 réponses oui contre environ 900 pas de réponses dans l'un des cas) . Fondamentalement, l'idée est de prédire la toxicité après une radiothérapie. J'ai quelques données prospectives sur la réponse binaire (c'est-à-dire la toxicité, soit vous l'avez (1), soit vous ne l'avez pas (0)), puis j'ai plusieurs types de mesures. Certaines mesures sont spécifiques au patient, par exemple l'âge, les médicaments utilisés, le volume des organes et des cibles, le diabète, etc., puis j'ai des mesures spécifiques au traitement basées sur le champ de traitement simulé pour la cible. À partir de cela, je peux récupérer plusieurs prédicteurs, ce qui est souvent très pertinent dans mon domaine, car la plupart de la toxicité est fortement corrélée avec la quantité de rayonnement (iedose) reçue. Ainsi, par exemple, si je traite une tumeur pulmonaire, il y a un risque de toucher le cœur avec une certaine dose. Je peux ensuite calculer la quantité de x du volume cardiaque qui reçoit la quantité de x, par exemple " t juste en choisir un pour commencer (bien que ce soit ce que les expériences passées ont essayé bien sûr, et ce que je souhaite faire aussi), parce que j'ai besoin de savoir "exactement" à quel degré il y a réellement une grande corrélation entre la toxicité cardiaque et la dose volumique (là encore, à titre d'exemple, il existe d'autres paramètres similaires, où la même stratégie est appliquée). Alors oui, c'est à peu près à quoi ressemble mon ensemble de données. Certaines mesures différentes et certaines mesures quelque peu similaires. t juste en choisir un pour commencer (bien que ce soit ce que les expériences passées ont essayé bien sûr, et ce que je souhaite faire aussi), parce que j'ai besoin de savoir "exactement" à quel degré il y a réellement une grande corrélation entre la toxicité cardiaque et la dose volumique (là encore, à titre d'exemple, il existe d'autres paramètres similaires, où la même stratégie est appliquée). Alors oui, c'est à peu près à quoi ressemble mon ensemble de données. Certaines mesures différentes et certaines mesures quelque peu similaires. s à peu près à quoi ressemble mon ensemble de données. Certaines mesures différentes et certaines mesures quelque peu similaires. s à peu près à quoi ressemble mon ensemble de données. Certaines mesures différentes et certaines mesures quelque peu similaires.

Ce que je veux ensuite faire, c'est créer un modèle prédictif afin de pouvoir, je l'espère, prédire quels patients présenteront un risque de toxicité. Et comme les données de réponse sont binaires, mon idée principale était bien sûr d'utiliser un modèle de régression logistique. C'est du moins ce que d'autres ont fait dans mon domaine. Cependant, lorsque vous parcourez bon nombre de ces articles, alors que cela a déjà été fait, certains d'entre eux semblent tout simplement faux (du moins lors de la lecture de ces types spécifiques de livres de modélisation comme ceux de F. Harrel). Beaucoup utilisent une analyse de régression univariée pour choisir des prédicteurs et les utilisent dans une analyse multivariée (ce qui est déconseillé si je ne me trompe pas), et beaucoup utilisent également des techniques par étapes pour réduire le nombre de prédicteurs. Bien sûr, tout n'est pas mauvais. Beaucoup utilisent LASSO, PCA, la validation croisée, le bootstrap, etc., mais ceux que j'ai examinés,

En ce qui concerne la sélection des fonctionnalités, c'est probablement où j'en suis maintenant. Comment choisir / trouver les bons prédicteurs à utiliser dans mon modèle? J'ai essayé ces approches univariées / pas à pas, mais à chaque fois je pense: "Pourquoi même le faire, si c'est faux?". Mais c'est peut-être une bonne façon de montrer, au moins à la fin, comment un «bon modèle» fait de la bonne façon se heurte à un «mauvais modèle» fait de la mauvaise façon. Donc je pourrais probablement le faire de manière quelque peu erronée maintenant, ce dont j'ai besoin d'aide, c'est d'obtenir une direction pour le faire de la bonne façon.

Désolé pour le montage, et c'est si long.

EDIT 2: Juste un petit exemple de l'apparence de mes données:

'data.frame':   1151 obs. of  100 variables:
 $ Toxicity              : Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 1 ...
 $ Age                   : num  71.9 64 52.1 65.1 63.2 ...
 $ Diabetes              : Factor w/ 2 levels "n","y": 1 1 1 1 1 1 1 1 1 1 ...
 $ Risk.Category         : Ord.factor w/ 3 levels "LOW"<"INTERMEDIATE"<..: 1 1 1 1 2 1 1 1 1 3 ...
 $ Organ.Volume.CC       : num  136.1 56.7 66 136.6 72.8 ...
 $ Target.Volume.CC      : num  102.7 44.2 58.8 39.1 56.3 ...
 $ D1perc                : num  7961 7718 7865 7986 7890 ...
 $ D1.5CC                : num  7948 7460 7795 7983 7800 ...
 $ D1CC                  : num  7996 7614 7833 7997 7862 ...
 $ D2perc                : num  7854 7570 7810 7944 7806 ...
 $ D2.5CC                : num  7873 7174 7729 7952 7604 ...
 $ D2CC                  : num  7915 7313 7757 7969 7715 ...
 $ D3perc                : num  7737 7379 7758 7884 7671 ...
 $ D3.5CC                : num  7787 6765 7613 7913 7325 ...
 $ D3CC                  : num  7827 6953 7675 7934 7480 ...
 $ D4perc                : num  7595 7218 7715 7798 7500 ...
 $ D5perc                : num  7428 7030 7638 7676 7257 ...
 $ DMEAN                 : num  1473 1372 1580 1383 1192 ...
 $ V2000CGY              : num  24.8 23.7 25.9 22.3 19.3 ...
 $ V2000CGY_CC           : num  33.7 13.4 17.1 30.4 14 ...
 $ V2500CGY              : num  22.5 21.5 24 20.6 17.5 ...
 $ V2500CGY_CC           : num  30.7 12.2 15.9 28.2 12.7 ...
 $ V3000CGY              : num  20.6 19.6 22.4 19.1 15.9 ...
 $ V3000CGY_CC           : num  28.1 11.1 14.8 26.2 11.6 ...
 $ V3500CGY              : num  18.9 17.8 20.8 17.8 14.6 ...
 $ V3500CGY_CC           : num  25.7 10.1 13.7 24.3 10.6 ...
 $ V3900CGY              : num  17.5 16.5 19.6 16.7 13.6 ...
 $ V3900CGY_CC           : num  23.76 9.36 12.96 22.85 9.91 ...
 $ V4500CGY              : num  15.5 14.4 17.8 15.2 12.2 ...
 $ V4500CGY_CC           : num  21.12 8.18 11.76 20.82 8.88 ...
 $ V5000CGY              : num  13.9 12.8 16.4 14 11 ...
 $ V5000CGY_CC           : num  18.91 7.25 10.79 19.09 8.03 ...
 $ V5500CGY              : num  12.23 11.14 14.84 12.69 9.85 ...
 $ V5500CGY_CC           : num  16.65 6.31 9.79 17.33 7.17 ...
 $ V6000CGY              : num  10.56 9.4 13.19 11.34 8.68 ...
 $ V6000CGY_CC           : num  14.37 5.33 8.7 15.49 6.32 ...
 $ V6500CGY              : num  8.79 7.32 11.35 9.89 7.44 ...
 $ V6500CGY_CC           : num  11.96 4.15 7.49 13.51 5.42 ...
 $ V7000CGY              : num  6.76 5.07 9.25 8.27 5.86 ...
 $ V7000CGY_CC           : num  9.21 2.87 6.1 11.3 4.26 ...
 $ V7500CGY              : num  4.61 2.37 6.22 6.13 4 ...
 $ V7500CGY_CC           : num  6.27 1.34 4.11 8.38 2.91 ...
 $ V8000CGY              : num  0.7114 0.1521 0.0348 0.6731 0.1527 ...
 $ V8000CGY_CC           : num  0.9682 0.0863 0.023 0.9194 0.1112 ...
 $ V8200CGY              : num  0.087 0 0 0 0 ...
 $ V8200CGY_CC           : num  0.118 0 0 0 0 ...
 $ V8500CGY              : num  0 0 0 0 0 0 0 0 0 0 ...
 $ V8500CGY_CC           : num  0 0 0 0 0 0 0 0 0 0 ...
 $ n_0.02                : num  7443 7240 7371 7467 7350 ...
 $ n_0.03                : num  7196 6976 7168 7253 7112 ...
 $ n_0.04                : num  6977 6747 6983 7055 6895 ...
 $ n_0.05                : num  6777 6542 6811 6871 6693 ...
 $ n_0.06                : num  6592 6354 6649 6696 6503 ...
 $ n_0.07                : num  6419 6180 6496 6531 6325 ...
 $ n_0.08                : num  6255 6016 6350 6374 6155 ...
 $ n_0.09                : num  6100 5863 6211 6224 5994 ...
 $ n_0.1                 : num  5953 5717 6078 6080 5840 ...
 $ n_0.11                : num  5813 5579 5950 5942 5692 ...
 $ n_0.12                : num  5679 5447 5828 5809 5551 ...
 $ n_0.13                : num  5551 5321 5709 5681 5416 ...
 $ n_0.14                : num  5428 5201 5595 5558 5285 ...
 $ n_0.15                : num  5310 5086 5485 5439 5160 ...
 $ n_0.16                : num  5197 4975 5378 5324 5039 ...
 $ n_0.17                : num  5088 4868 5275 5213 4923 ...
 $ n_0.18                : num  4982 4765 5176 5106 4811 ...
 $ n_0.19                : num  4881 4666 5079 5002 4702 ...
 $ n_0.2                 : num  4783 4571 4985 4901 4597 ...
 $ n_0.21                : num  4688 4478 4894 4803 4496 ...
 $ n_0.22                : num  4596 4389 4806 4708 4398 ...
 $ n_0.23                : num  4507 4302 4720 4616 4303 ...
 $ n_0.24                : num  4421 4219 4636 4527 4210 ...
 $ n_0.25                : num  4337 4138 4555 4440 4121 ...
 $ n_0.26                : num  4256 4059 4476 4355 4035 ...
 $ n_0.27                : num  4178 3983 4398 4273 3951 ...
 $ n_0.28                : num  4102 3909 4323 4193 3869 ...
 $ n_0.29                : num  4027 3837 4250 4115 3790 ...
 $ n_0.3                 : num  3955 3767 4179 4039 3713 ...
 $ n_0.31                : num  3885 3699 4109 3966 3639 ...
 $ n_0.32                : num  3817 3633 4041 3894 3566 ...
 $ n_0.33                : num  3751 3569 3975 3824 3496 ...
 $ n_0.34                : num  3686 3506 3911 3755 3427 ...
 $ n_0.35                : num  3623 3445 3847 3689 3361 ...
 $ n_0.36                : num  3562 3386 3786 3624 3296 ...
 $ n_0.37                : num  3502 3328 3725 3560 3233 ...
 $ n_0.38                : num  3444 3272 3666 3498 3171 ...
 $ n_0.39                : num  3387 3217 3609 3438 3111 ...
 $ n_0.4                 : num  3332 3163 3553 3379 3053 ...
 $ n_0.41                : num  3278 3111 3498 3321 2996 ...
 $ n_0.42                : num  3225 3060 3444 3265 2941 ...
 $ n_0.43                : num  3173 3010 3391 3210 2887 ...
 $ n_0.44                : num  3123 2961 3339 3156 2834 ...
 $ n_0.45                : num  3074 2914 3289 3103 2783 ...
 $ n_0.46                : num  3026 2867 3239 3052 2733 ...
 $ n_0.47                : num  2979 2822 3191 3002 2684 ...
 $ n_0.48                : num  2933 2778 3144 2953 2637 ...
 $ n_0.49                : num  2889 2734 3097 2905 2590 ...

Et si je lance table(data$Toxicity)la sortie, c'est:

> table(data$Toxicity)
   0    1 
1088   63 

Encore une fois, c'est pour un type de toxicité. J'en ai aussi 3 autres.

Denver Dang
la source
1
Que comptez-vous faire? Prédiction ou inférence, ou autre chose?
Stephan Kolassa
C'est ce qu'on appelle la sélection des fonctionnalités . Si vous devez utiliser la régression, les entités catégorielles doivent être ponctuelles, mais pour les méthodes d'arborescence, vous pouvez les utiliser telles quelles. Vous pouvez même déterminer vos termes d'interaction ou d'association à n-way les plus prédictifs et les utiliser.
smci
"Dois-je vraiment juste m'asseoir, parler aux gens et vraiment penser / raisonner sur les prédicteurs top-n?" Enfer non, l'intuition est un point de départ, mais c'est pourquoi il existe des méthodes de sélection des fonctionnalités; résulte de beaucoup d'expérimentation bat l'intuition.
smci
1
@smci désolé de ne pas être clair. Donc, dans mon domaine (radio-oncologie), nous faisons des plans de traitement, qui sont essentiellement une représentation 3D de la façon dont le rayonnement / la dose est distribué autour d'une cible. Malheureusement, cela ne peut se faire sans toucher au moins une petite quantité de tissus sains. Ainsi, à partir de cette carte 3D, pour ainsi dire, je peux par exemple obtenir des informations sur la taille d'un volume qui reçoit une quantité x de rayonnement / dose. Mais comme vous pouvez l'imaginer, je peux «demander» par étapes comme «combien de rayonnement 1% de ce volume de structure reçoit-il», puis 2%, 3%. En principe, les valeurs seront quelque peu similaires.
Denver Dang
1
@smci, si la prédiction est l'objectif des PO, alors la corrélation ne devrait pas être un problème. Une corrélation élevée entre les variables ne serait vraiment une grande préoccupation que pour essayer d'interpréter les variables incluses dans le modèle.
StatsStudent

Réponses:

4

Certaines des réponses que vous avez reçues concernant la sélection de la fonction push sont hors base.

Le lasso ou mieux le filet élastique fera la sélection des fonctionnalités mais comme indiqué ci-dessus, vous serez très déçu de la volatilité de l'ensemble des fonctionnalités "sélectionnées". Je crois que le seul véritable espoir dans votre situation est la réduction des données, c'est-à-dire l'apprentissage non supervisé, comme je le souligne dans mon livre. La réduction des données apporte plus d'interprétabilité et surtout plus de stabilité. Je recommande fortement les composants principaux clairsemés, ou le clustering variable suivi de composants principaux réguliers sur les clusters.

Le contenu des informations dans votre ensemble de données est beaucoup, beaucoup trop faible pour qu'un algorithme de sélection d'entités soit fiable.

Frank Harrell
la source
Tout d'abord, merci d'avoir pris le temps de commenter. Deuxièmement, si je ne me trompe pas, l'apprentissage non supervisé consiste à ne pas utiliser (ou ne pas avoir) la réponse particulière des variables de réponse (c.-à-d. 1 ou 0), et à faire deviner l'ordinateur "comment la distribution doit être divisée. Mais la régression logistique (et linéaire) est supervisée pour autant que je sache? Votre recommandation est donc d'abandonner cette méthodologie? D'une part, j'aime l'idée, mais d'autre part, la régression logistique et probit est la façon dont presque tous les papiers de modélisation dans mon domaine (des données similaires aux miennes) ont fait jusqu'à présent.
Denver Dang
Alors, ne sortirais-je pas sur une branche ici, ou dois-je simplement supposer que tout le monde l'a fait "mal" depuis toujours?
Denver Dang
3
Pas tout le monde, mais la plupart des gens se trompent définitivement. Ce fut un facteur de motivation principal pour écrire des stratégies de modélisation de régression . L'objectif de la réduction des données est de réduire la quantité d'apprentissage supervisé que la régression logistique est invitée à faire. Par exemple, vous pouvez réduire 100 fonctionnalités candidates à 5 scores de cluster efficaces, puis ne devez estimer que 5 paramètres + interception.
Frank Harrell
2
Que pensez-vous des modèles à coefficient variable dans ce cas (comme je l'ai ajouté à ma réponse)?
Ben Bolker
@FrankHarrell, cela semble plutôt intéressant. Mais désolé de demander, pourquoi l'apprentissage supervisé est-il mauvais, ou du moins quelque peu mauvais, comme il semble que vous l'imaginez?
Denver Dang
8

+1 pour "semble parfois un peu écrasant". Cela dépend vraiment (comme le dit clairement Harrell; voir la section à la fin du chapitre 4) si vous voulez faire

  • Vous devrez utiliser la validation croisée pour choisir le degré de pénalisation, ce qui détruira votre capacité à faire de l'inférence (construire des intervalles de confiance sur les prédictions) à moins que vous n'utilisiez des méthodes d'inférence de haute dimension de pointe (par exemple Dezeure et al 2015 ; I n'ont pas essayé ces approches mais elles semblent raisonnables ...)

  • analyse exploratoire : amusez-vous, soyez transparent et honnête, ne citez pas de valeurs p.

Pour le cas d'utilisation particulier que vous venez de décrire (un groupe de vos prédicteurs représente essentiellement une distribution cumulative de la dose reçue par différentes fractions du cœur), vous voudrez peut-être examiner des modèles à coefficient variable (un peu difficile à rechercher) , qui correspondent essentiellement à une courbe lisse pour l'effet du CDF (ceux-ci peuvent être implémentés dans le mgcvpackage de R ).

Ben Bolker
la source
La taille de mon échantillon est +1000, et en fonction de la variable de réponse (j'en ai 4), j'ai entre 75-170 réponses positives (ou négatives, selon la façon dont vous le regardez) des +1000. Je ne sais pas si cela facilite quelque chose, c'est-à-dire que je peux ignorer certaines étapes car le jeu d'échantillons est plutôt énorme (au moins dans mon domaine).
Denver Dang
La validation croisée détruirait-elle la capacité de faire de l'inférence? Peut être. Je pense que l'on pourrait bootstrap avant la validation croisée pour obtenir des intervalles de confiance pour les prédictions. Cela peut être faisable avec 1000 observations.
JTH
l'inférence post-sélection est vraiment difficile; si vous utilisez l'ensemble des données pour régler les hyperparamètres (comme la force de la pénalisation), alors vous êtes dans la même situation. Vous devez décrire votre approche bootstrap + CV avant de pouvoir dire si je pense que cela pourrait fonctionner ...
Ben Bolker
0

Il existe de nombreuses approches différentes. Ce que je recommanderais, c'est d'essayer quelques simples, dans l'ordre suivant:

resnet
la source
1
Je pense que ces trois méthodes seront instables.
Frank Harrell
cela dépend de la façon dont vous définissez instable. Dans la pratique, vous utilisez généralement une sorte de validation croisée comme k-fold ou Leave-One-Out et jugez en fonction des performances globales + variance (alias la méthode 1SE) qui caractérisent les fonctionnalités que vous finissez par choisir.
resnet
L'amorçage et la validation croisée valident uniquement certains indices prédictifs pour le processus générant le modèle. Il en résulte une bonne estimation de cet indice pour un modèle sélectionné à l' aide de ce processus mais n'apporte aucun confort à la structure d'un modèle qui a été développé une fois, c'est-à-dire le modèle global. Examinez la structure sélectionnée (c.-à-d. Les caractéristiques sélectionnées) à travers les rééchantillons pour voir la volatilité.
Frank Harrell