Jak zmniejszyć predyktory we właściwy sposób dla modelu regresji logistycznej

9

Czytałem więc kilka książek (lub ich części) na temat modelowania (między innymi „Strategie modelowania regresji” F. Harrella, ponieważ moja obecna sytuacja jest taka, że ​​muszę zrobić model logistyczny oparty na danych binarnych odpowiedzi. W moim zestawie danych mam zarówno dane ciągłe, jakościowe, jak i binarne (predyktory). Zasadniczo mam teraz około 100 predyktorów, co oczywiście jest o wiele za dużo dla dobrego modelu. Ponadto wiele z tych predyktorów jest w pewnym sensie powiązanych, ponieważ często są one oparte na tej samej metryki, choć nieco inne.

W każdym razie to, co czytałem, stosując regresję jednowymiarową i techniki krok po kroku, to jedne z najgorszych rzeczy, które możesz zrobić, aby zmniejszyć liczbę predyktorów. Myślę, że technika LASSO jest całkiem dobra (jeśli dobrze to zrozumiałem), ale oczywiście nie można jej użyć na 100 predyktorach i sądzę, że z tego wyniknie jakaś korzyść.

Więc jakie są moje opcje tutaj? Czy naprawdę muszę po prostu usiąść, porozmawiać ze wszystkimi moimi przełożonymi i inteligentnymi ludźmi w pracy i naprawdę pomyśleć o tym, jakie 5 najlepszych predyktorów może / powinno być (możemy się mylić), lub które podejście powinien rozważyć zamiast?

I tak, wiem również, że ten temat jest szeroko dyskutowany (online i w książkach), ale czasami wydaje się nieco przytłaczający, gdy jesteś nowy w tej dziedzinie modelowania.

EDYTOWAĆ:

Po pierwsze, moja próbka wynosi +1000 pacjentów (co jest bardzo dużo w mojej dziedzinie), a spośród nich jest 70-170 pozytywnych odpowiedzi (tj. 170 odpowiedzi tak w porównaniu z około 900 odpowiedzi braku w jednym z przypadków) . Zasadniczo chodzi o to, aby przewidzieć toksyczność po radioterapii. Mam pewne potencjalne dane binarnej odpowiedzi (tj. Toksyczność, albo masz ją (1), albo nie masz (0)), a następnie mam kilka rodzajów wskaźników. Niektóre wskaźniki są specyficzne dla pacjenta, np. Wiek, zastosowane leki, objętość narządu i celu, cukrzyca itp., A następnie mam pewne wskaźniki specyficzne dla leczenia oparte na symulowanym polu leczenia dla celu. Na tej podstawie mogę pobrać kilka predyktorów, co jest często bardzo istotne w mojej dziedzinie, ponieważ większość toksyczności jest silnie skorelowana z ilością otrzymanego promieniowania (dawki). Na przykład, jeśli leczę guz płuca, istnieje ryzyko uderzenia w serce pewną dawką. Następnie mogę obliczyć, ile x objętości serca otrzymuje x dawki, np. „ po prostu wybierz jedną z nich (chociaż to właśnie próbowały wcześniejsze eksperymenty i co też chcę zrobić), ponieważ muszę wiedzieć „dokładnie”, w jakim stopniu faktycznie istnieje duża korelacja między toksycznością serca i dawkę objętościową (ponownie, na przykład, istnieją inne podobne wskaźniki, w których stosuje się tę samą strategię). Tak, tak wygląda mój zestaw danych. Niektóre różne metryki i niektóre metryki, które są nieco podobne. po prostu wybierz jedną z nich (chociaż to właśnie próbowały wcześniejsze eksperymenty i co też chcę zrobić), ponieważ muszę wiedzieć „dokładnie”, w jakim stopniu faktycznie istnieje duża korelacja między toksycznością serca i dawkę objętościową (ponownie, na przykład, istnieją inne podobne wskaźniki, w których stosuje się tę samą strategię). Tak, tak wygląda mój zestaw danych. Niektóre różne metryki i niektóre metryki, które są nieco podobne. prawie jak wygląda mój zestaw danych. Niektóre różne metryki i niektóre metryki, które są nieco podobne. prawie jak wygląda mój zestaw danych. Niektóre różne metryki i niektóre metryki, które są nieco podobne.

Następnie chcę zrobić model predykcyjny, aby, mam nadzieję, przewidzieć, którzy pacjenci będą mieli ryzyko wystąpienia jakiejś toksyczności. A ponieważ dane odpowiedzi są binarne, moim głównym pomysłem było oczywiście użycie modelu regresji logistycznej. Przynajmniej tak zrobili inni ludzie w mojej dziedzinie. Jednak podczas przeglądania wielu z tych artykułów, w których już to zrobiono, niektóre z nich wydają się po prostu błędne (przynajmniej podczas czytania tych konkretnych rodzajów książek o modelowaniu, takich jak F. Harrel). Wielu używa analizy regresji jednoczynnikowej do wybierania predyktorów i używa ich w analizie wielowymiarowej (rzecz, której odradzam, jeśli się nie mylę), a także wielu stosuje techniki stopniowe, aby zmniejszyć liczbę predyktorów. Oczywiście nie wszystko jest złe. Wiele używa LASSO, PCA, walidacji krzyżowej, ładowania początkowego itp., Ale te, na które patrzyłem,

Jeśli chodzi o wybór funkcji, to chyba tutaj jestem. Jak wybrać / znaleźć odpowiednie predyktory do użycia w moim modelu? Próbowałem tych podejść jednowymiarowych / krokowych, ale za każdym razem myślę: „Po co to robić, jeśli jest źle?”. Ale może to dobry sposób na pokazanie, przynajmniej na końcu, w jaki sposób „dobry model” zrobiony w prawidłowy sposób idzie w parze z „złym modelem” wykonanym w niewłaściwy sposób. Więc prawdopodobnie mógłbym to zrobić teraz w nieco niewłaściwy sposób, potrzebuję pomocy, aby uzyskać odpowiedni kierunek.

Przepraszam za edycję i trwa ona tak długo.

EDYCJA 2: Szybki przykład tego, jak wyglądają moje dane:

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

A jeśli uruchomię, table(data$Toxicity)dane wyjściowe to:

> table(data$Toxicity)
   0    1 
1088   63 

Ponownie, dotyczy to jednego rodzaju toksyczności. Mam też 3 inne.

Denver Dang
źródło
1
Co zamierzasz zrobić? Prognozy lub wnioskowanie, czy coś jeszcze?
Stephan Kolassa
Nazywa się to wyborem funkcji . Jeśli musisz użyć regresji, funkcje kategorialne mają charakter jednobryłowy, ale w przypadku metod drzewa możesz używać ich bez zmian. Możesz nawet wymyślić swoje najbardziej przewidywalne warunki interakcji lub skojarzeń n-way i użyć ich.
smci
„Czy naprawdę muszę po prostu usiąść, porozmawiać z ludźmi i naprawdę wymyślić / uzasadnić najlepsze predyktory?” Do diabła nie, intuicja jest punktem wyjścia, ale właśnie dlatego istnieją metody wyboru funkcji; wyniki wielu eksperymentów biją intuicję.
smci
1
@smci przepraszam, że jestem niejasny. Tak więc w mojej dziedzinie (radioterapia onkologiczna) tworzymy plany leczenia, które w zasadzie są trójwymiarowym przedstawieniem, w jaki sposób promieniowanie / dawka rozkłada się wokół celu. Niestety, nie można tego zrobić bez uderzenia w co najmniej niewielką ilość zdrowej tkanki. Tak więc z tej mapy 3D, że tak powiem, mogę na przykład uzyskać informacje o tym, jak duża objętość odbiera x ilość promieniowania / dawki. Ale jak możesz sobie wyobrazić, mogę „zapytać” w krokach takich jak „ile promieniowania otrzymuje 1% objętości tej struktury”, a następnie 2%, 3%. Zasadniczo wartości będą nieco podobne.
Denver Dang
1
@smci, jeśli przewidywanie jest celem PO, to korelacja nie powinna mieć znaczenia. Wysoka korelacja między zmiennymi byłaby naprawdę poważnym problemem tylko podczas próby interpretacji zmiennych zawartych w modelu.
StatsStudent

Odpowiedzi:

4

Niektóre odpowiedzi, które otrzymałeś w związku z wyborem funkcji wypychania, są poza bazą.

Lasso lub lepsza elastyczna siatka zrobi wybór funkcji, ale jak wskazano powyżej was będzie dość rozczarowany zmienności zbioru „wybranych” cech. Uważam, że jedyną prawdziwą nadzieją w twojej sytuacji jest redukcja danych, tj. Uczenie się bez nadzoru, jak podkreślam w mojej książce. Redukcja danych zapewnia większą interpretowalność, a zwłaszcza większą stabilność. Bardzo polecam rzadkie główne składniki lub zmienne grupowanie, a następnie regularne główne składniki w klastrach.

Zawartość informacji w twoim zestawie danych jest zdecydowanie zbyt niska, aby dowolny algorytm wyboru funkcji był wiarygodny.

Frank Harrell
źródło
Przede wszystkim dziękuję za poświęcenie czasu na komentowanie. Po drugie, jeśli się nie mylę, uczenie się bez nadzoru odbywa się wtedy, gdy nie używasz (lub nie masz) konkretnej odpowiedzi zmiennych odpowiedzi (tj. 1 lub 0) i sprawiasz, że komputer „zgaduje „w jaki sposób należy podzielić dystrybucję. Ale o ile wiem, regresja logistyczna (i liniowa) jest nadzorowana? Więc zalecasz zrezygnować z tej metodologii? Z jednej strony podoba mi się ten pomysł, ale z drugiej regresja logistyczna i probitowa jest tym, co robi prawie każdy papier modelarski w mojej dziedzinie (dane podobne do moich).
Denver Dang
Czyż nie miałbym tutaj wyjść na kończynę, czy też muszę po prostu założyć, że wszyscy inni robili to „źle” na zawsze?
Denver Dang
3
Nie wszyscy, ale większość ludzi zdecydowanie robi to źle. To był główny motywator do pisania strategii modelowania regresji . Celem redukcji danych jest zmniejszenie ilości nadzorowanego uczenia, o którą prosi regresja logistyczna. Na przykład możesz zredukować 100 elementów kandydujących do efektywnie 5 wyników klastra, a następnie oszacować tylko 5 parametrów + przechwycenie.
Frank Harrell
2
Co sądzisz o modelach o zmiennym współczynniku w tym przypadku (jak dodałem do mojej odpowiedzi)?
Ben Bolker
@FrankHarrell brzmi raczej interesująco. Ale przepraszam, że pytasz, dlaczego nadzorowane uczenie się jest złe, a przynajmniej trochę złe, skoro wygląda na to, że sugerujesz?
Denver Dang
8

+1 za „czasem wydaje się nieco przytłaczające”. To naprawdę zależy (jak wyraźnie stwierdza Harrell; patrz sekcja na końcu rozdziału 4), czy chcesz to zrobić

  • analiza potwierdzająca ( zredukuj złożoność predyktora do rozsądnego poziomu bez patrzenia na odpowiedzi, przez PCA lub rozważania dotyczące obszaru tematycznego lub ...)
  • analiza predykcyjna (stosować odpowiednie metody karania). Lasso mógłby bardzo dobrze pracować ze 100 predyktorami, jeśli masz dość dużą próbkę. Wybór funkcji będzie niestabilny, ale jest OK, jeśli liczy się tylko przewidywanie. Osobiście preferuję podejścia kalenicowe, które technicznie „nie wybierają funkcji” (ponieważ nigdy nie redukują żadnego parametru do zera), ale cokolwiek działa ...

    Będziesz musiał zastosować walidację krzyżową, aby wybrać stopień karania, co zniszczy twoją zdolność wnioskowania (konstruowania przedziałów ufności na podstawie prognoz), chyba że zastosujesz najnowocześniejsze metody wnioskowania wielowymiarowego (np. Dezeure i in. 2015 ; I już nie próbował tych podejść ale wydają rozsądne ...)

  • analiza eksploracyjna : baw się dobrze, bądź przejrzysty i uczciwy, nie podawaj żadnych wartości p.

W konkretnym przypadku użycia, który właśnie opisałeś (kilka predyktorów zasadniczo reprezentuje skumulowany rozkład dawki otrzymanej przez różne ułamki serca), możesz przyjrzeć się modelom o różnym współczynniku (trochę trudnym do wyszukania) , które w zasadzie pasują do gładkiej krzywej efektu CDF (można je zaimplementować w mgcvpakiecie R. )

Ben Bolker
źródło
Rozmiar mojej próbki wynosi +1000, a zależnie od tego, która zmienna odpowiedzi (mam 4), mam między 75-170 pozytywnych (lub negatywnych, w zależności od tego, jak na to spojrzeć) odpowiedzi +1000. Nie wiem, czy to cokolwiek ułatwia, tzn. Mogę odrzucić niektóre kroki, ponieważ zestaw próbek jest dość ogromny (przynajmniej w mojej dziedzinie).
Denver Dang
Czy weryfikacja krzyżowa zniszczyłaby zdolność wnioskowania? Może. Myślę, że można by uruchomić bootstrap przed weryfikacją krzyżową, aby uzyskać przedziały ufności dla prognoz. Może to być wykonalne przy 1000 obserwacji.
JTH
wnioskowanie po selekcji jest naprawdę trudne; jeśli użyjesz całego zestawu danych do dostrojenia hiperparametrów (takich jak siła penalizacji), to znajdziesz się w tej samej sytuacji. Musiałbyś nakreślić swoje podejście bootstrap + CV, zanim będę mógł powiedzieć, że wierzę, że to
zadziała
0

Istnieje wiele różnych podejść. Polecam wypróbować kilka prostych, w następującej kolejności:

resnet
źródło
1
Wierzę, że wszystkie trzy z tych metod okażą się niestabilne.
Frank Harrell,
zależy to od tego, jak zdefiniujesz niestabilność. W praktyce zwykle używasz pewnego rodzaju krzyżowej walidacji, takiej jak k-fold lub out-one-out i oceniaj na podstawie ogólnej wydajności + wariancji (zwanej również metodą 1SE), którą wybrałeś.
resnet
Ładowanie początkowe i sprawdzanie poprawności sprawdzają tylko pewien indeks predykcyjny dla procesu generującego model. Daje to dobre oszacowanie tego wskaźnika dla modelu wybranego przy użyciu tego procesu, ale nie zapewnia żadnej wygody dla struktury modelu, który został opracowany raz, tj. Dla całego modelu. Spójrz na wybraną strukturę (tj. Wybrane funkcje) w próbkach, aby zobaczyć zmienność.
Frank Harrell