Как уменьшить предикторы правильным способом для модели логистической регрессии

9

Поэтому я читал некоторые книги (или их части) по моделированию (в частности, «Стратегии регрессионного моделирования» Ф. Харрелла), поскольку моя текущая ситуация сейчас заключается в том, что мне нужно создать логистическую модель, основанную на данных двоичного отклика. У меня есть как непрерывные, категориальные, так и двоичные данные (предикторы) в моем наборе данных. В основном у меня сейчас около 100 предикторов, что явно слишком много для хорошей модели. Кроме того, многие из этих предикторов в некотором роде связаны, поскольку они часто основаны на одной и той же метрике, хотя и немного другой.

Как бы то ни было, то, что я читал, используя одномерные регрессионные и пошаговые методы, - это одна из худших вещей, которые вы можете сделать, чтобы уменьшить количество предикторов. Я думаю, что с техникой LASSO все в порядке (если я правильно понял), но, очевидно, вы просто не сможете использовать это на 100 предикторах и думаете, что от этого будет какая-то польза.

Итак, какие у меня есть варианты? Должен ли я просто сесть, поговорить со всеми моими руководителями и умными людьми на работе и действительно подумать о том, какими могут / должны быть лучшие 5 лучших предсказателей (мы можем ошибаться), или какой подход (ы) я должен рассмотреть вместо этого?

И да, я также знаю, что эта тема широко обсуждается (в Интернете и в книгах), но иногда кажется, что вы немного новички в этой области моделирования.

РЕДАКТИРОВАТЬ:

Прежде всего, мой размер выборки составляет +1000 пациентов (что очень много в моей области), и из них есть от 70 до 170 положительных ответов (то есть 170 ответов «да» против примерно 900 ответов в одном случае) , В основном идея заключается в прогнозировании токсичности после лучевой терапии. У меня есть некоторые предполагаемые данные бинарного отклика (т.е. токсичность, либо у вас есть (1), либо у вас нет (0)), а затем у меня есть несколько типов метрик. Некоторые показатели специфичны для пациента, например, возраст, используемые лекарства, объем органа и мишени, диабет и т. Д., А затем у меня есть некоторые специфические показатели лечения, основанные на смоделированном поле лечения для цели. Из этого я могу извлечь несколько предикторов, что часто очень актуально в моей области, так как большая часть токсичности тесно связана с количеством получаемой радиации (iedose). Так, например, если я лечу опухоль легкого, есть риск поражения сердца некоторым количеством дозы. Затем я могу рассчитать, сколько х-объема объема сердца получает х-количество дозы, например: Для начала просто выберите один (хотя это, конечно, то, что пытались сделать в прошлых экспериментах, и то, что я хотел бы также сделать), потому что мне нужно знать «точно», в какой степени на самом деле существует большая корреляция между сердечной токсичностью и объемная доза (опять же, в качестве примера, существуют другие похожие показатели, где применяется та же стратегия). Так что да, именно так выглядит мой набор данных. Некоторые разные метрики, и некоторые метрики, которые несколько похожи. Для начала просто выберите один (хотя это, конечно, то, что пытались сделать в прошлых экспериментах, и то, что я хотел бы также сделать), потому что мне нужно точно знать, в какой степени на самом деле существует большая корреляция между сердечной токсичностью и объемная доза (опять же, в качестве примера, существуют другие похожие показатели, где применяется та же стратегия). Так что да, именно так выглядит мой набор данных. Некоторые разные метрики, и некоторые метрики, которые несколько похожи. Очень похоже на то, как выглядит мой набор данных. Некоторые разные метрики, и некоторые метрики, которые несколько похожи. Очень похоже на то, как выглядит мой набор данных. Некоторые разные метрики, и некоторые метрики, которые несколько похожи.

Затем я хочу создать прогностическую модель, чтобы я мог предсказать, какие пациенты рискуют получить какую-то токсичность. И поскольку данные ответов являются двоичными, моей главной идеей, конечно же, было использование модели логистической регрессии. По крайней мере, это то, что другие люди сделали в моей области. Однако при просмотре многих из этих работ, где это уже было сделано, некоторые из них просто кажутся неправильными (по крайней мере, при чтении этих конкретных типов книг по моделированию, таких как книги Ф. Харреля). Многие используют одномерный регрессионный анализ для выбора предикторов и используют их в многомерном анализе (что не рекомендуется, если я не ошибаюсь), а также многие используют пошаговые методы для уменьшения количества предикторов. Конечно, не все так плохо. Многие используют LASSO, PCA, перекрестную проверку, загрузку и т. Д., Но те, на которые я смотрел,

Что касается выбора функций, это, вероятно, где я сейчас нахожусь. Как выбрать / найти правильные предикторы для использования в моей модели? Я попробовал эти одномерные / пошаговые подходы, но каждый раз я думаю: «Зачем вообще это делать, если это неправильно?». Но, возможно, это хороший способ показать, по крайней мере, в конце, как «хорошая модель», сделанная правильно, идет вразрез с «плохой моделью», сделанной неправильно. Таким образом, я мог бы, вероятно, сделать это несколько неправильным образом сейчас, для чего мне нужна помощь, чтобы получить направление в правильном направлении.

Извините за редактирование, и это так долго.

РЕДАКТИРОВАТЬ 2: Просто быстрый пример того, как мои данные выглядят так:

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

И если я запускаю table(data$Toxicity)вывод:

> table(data$Toxicity)
   0    1 
1088   63 

Опять же, это для одного типа токсичности. У меня есть еще 3 человека.

Денвер Данг
источник
1
Что ты собираешься делать? Прогноз или умозаключение или что-то еще?
Стефан Коласса
Это называется выбором функции . Если вы должны использовать регрессию, то категориальные функции должны быть в одном месте, но для древовидных методов вы можете использовать их как есть. Вы могли бы даже определить свои наиболее предсказуемые термины n-way взаимодействия или ассоциации и использовать их.
smci
«Неужели мне просто нужно сесть, поговорить с людьми и действительно подумать / обдумать топ-n предикторов?» Черт возьми, интуиция - это отправная точка, но именно поэтому существуют методы выбора функций; Результаты многих экспериментов побеждают интуицию.
smci
1
@smci извините за неясность. Поэтому в моей области (радиационная онкология) мы составляем планы лечения, которые в основном представляют собой трехмерное представление о том, как излучение / доза распределяется вокруг цели. К сожалению, этого нельзя сделать, не поразив хотя бы небольшое количество здоровой ткани. Итак, с этой трехмерной карты, например, я могу получить информацию о том, насколько большой объем получает x-количество радиации / дозы. Но, как вы можете себе представить, я могу «спросить» поэтапно, например, «сколько радиации получает 1% этого объема конструкции», а затем 2%, 3%. В принципе значения будут несколько похожи.
Денвер Данг
1
@smci, если прогноз является целью ОП, то корреляция не должна быть проблемой. Высокая корреляция между переменными действительно будет иметь большое значение только при попытке интерпретировать переменные, включенные в модель.
StatsStudent

Ответы:

4

Некоторые из ответов, которые вы получили при выборе функции push, не соответствуют требованиям.

Лассо или лучше эластичная сетка будет делать выбор функции , но , как указано выше вас будет весьма разочарован волатильности набора «избранных» функций. Я полагаю, что единственная реальная надежда в вашей ситуации - это сокращение данных, т.е. обучение без учителя, как я подчеркиваю в своей книге. Сокращение данных приносит большую интерпретируемость и особенно большую стабильность. Я очень рекомендую разреженные главные компоненты или кластеризацию переменных, за которыми следуют обычные главные компоненты в кластерах.

Содержимое информации в вашем наборе данных слишком много, слишком мало, чтобы любой алгоритм выбора функции был надежным.

Фрэнк Харрелл
источник
Прежде всего, спасибо, что нашли время для комментариев. Во-вторых, если я не ошибаюсь, неконтролируемое обучение - это когда вы не используете (или не используете) конкретный ответ переменной (ей) ответа (то есть 1 или 0) и заставляете компьютер «угадывать» «Как распределение должно быть разделено. Но логистическая регрессия (и линейная) контролируется, насколько я знаю? Итак, вы рекомендуете отказаться от этой методологии? С одной стороны, мне нравится идея, но с другой, логистическая и пробит-регрессия - это то, как почти все работы по моделированию в моей области (данные, аналогичные моей) делали до сих пор.
Денвер Данг
Так разве я не буду выходить здесь на конечности или я просто должен предположить, что все остальные делали это "неправильно" вечно?
Денвер Данг
3
Не все, но большинство людей определенно делают это неправильно. Это было основным мотиватором для написания стратегий регрессионного моделирования . Целью сокращения данных является уменьшение объема контролируемого обучения, которое предлагается выполнить логистической регрессии. Например, вы можете сократить 100 возможных объектов до 5 баллов кластера, а затем оценить только 5 параметров + перехват.
Фрэнк Харрелл
2
Как вы относитесь к моделям с переменным коэффициентом в этом случае (как я добавил к своему ответу)?
Бен Болкер
@FrankHarrell это звучит довольно интересно. Но извините за вопрос, почему контролируемое обучение плохо или, по крайней мере, несколько плохо, как кажется, вы намекаете?
Денвер Данг
8

+1 за "иногда кажется немного подавляющим". Это действительно зависит (как четко говорит Харрелл; см. Раздел в конце главы 4), хотите ли вы сделать

  • Вам придется использовать перекрестную проверку, чтобы выбрать степень наказания, которая разрушит вашу способность делать выводы (строить доверительные интервалы на предсказаниях), если вы не используете передовые методы многомерного вывода (например, Dezeure et al 2015 ; I еще не пробовал эти подходы , но они , кажется разумным ...)

  • предварительный анализ: веселиться, быть прозрачным и честным, не указывать p-значения.

Для конкретного случая использования, который вы сейчас описали (группа ваших предикторов, по сути, представляет собой совокупное распределение дозы, получаемой различными частями сердца), вы можете захотеть взглянуть на модели с различными коэффициентами (поиск которых немного сложен) , который в основном соответствует гладкой кривой для эффекта CDF (они могут быть реализованы в mgcvпакете R ).

Бен Болкер
источник
Мой размер выборки +1000, и в зависимости от того, какая переменная ответа (у меня 4), у меня есть 75-170 положительных (или отрицательных, в зависимости от того, как вы на это смотрите) ответов +1000. Я не знаю, облегчает ли это что-то, то есть я могу пропустить некоторые шаги, поскольку набор образцов довольно велик (по крайней мере, в моей области).
Денвер Данг
Будет ли перекрестная проверка уничтожать способность делать выводы? Может быть. Я думаю, что можно выполнить предварительную проверку перед перекрестной проверкой, чтобы получить доверительные интервалы для прогнозов. Это может быть осуществимо с 1000 наблюдений.
JTH
вывод после выбора действительно труден; если вы используете весь набор данных для настройки гиперпараметров (например, уровня штрафов), то вы попадаете в ту же ситуацию. Вы должны были бы наметить свой подход к начальной загрузке + CV, прежде чем я смогу сказать, если бы я поверил, что это может
сработать
0

Есть много разных подходов. Я бы порекомендовал попробовать несколько простых в следующем порядке:

  • Регуляризация L1 (с увеличением штрафа; чем больше коэффициент регуляризации, тем больше функций будет исключено)
  • Устранение рекурсивных признаков ( https://scikit-learn.org/stable/modules/feature_selection.html#recursive-feature-elvention ) - постепенное удаление элементов путем исключения элементов, связанных с наименьшими коэффициентами модели (при условии, что они являются наименьшими когда-то важно, очевидно, здесь очень важно нормализовать функции ввода)
  • Последовательный выбор объектов ( http://rasbt.github.io/mlxtend/user_guide/feature_selection/SequentialFeatureSelector/ ) - удаляет функции в зависимости от их важности для прогнозной производительности
RESNET
источник
1
Я считаю, что все эти три метода будут признаны нестабильными.
Фрэнк Харрелл
это зависит от того, как вы определяете нестабильно. На практике вы обычно используете какую-то перекрестную проверку, такую ​​как k-fold или left-one-out, и судите по общей производительности + дисперсии (так называемый метод 1SE), которые вы выбираете.
Resnet
Начальная загрузка и перекрестная проверка только проверяют некоторый прогнозный индекс для процесса, генерирующего модель. Это приводит к хорошей оценке этого индекса для модели, выбранной с использованием этого процесса, но не обеспечивает какого-либо комфорта для структуры модели, которая была разработана один раз, то есть для всей модели. Посмотрите на выбранную структуру (т. Е. Выбранные объекты) через повторные выборки, чтобы увидеть изменчивость.
Фрэнк Харрелл