Regresja logistyczna w R doprowadziła do idealnej separacji (zjawisko Haucka-Donnera). Co teraz?

56

Staram się przewidzieć wynik binarny przy użyciu 50 ciągłe zmienne objaśniające (w zakresie od najbardziej zmiennych jest do ). Mój zestaw danych ma prawie 24 000 wierszy. Kiedy biegnę w R, otrzymuję:-glm

Warning messages:  
1: glm.fit: algorithm did not converge  
2: glm.fit: fitted probabilities numerically 0 or 1 occurred 

Przeczytałem inne odpowiedzi, które sugerują, że może wystąpić idealna separacja, ale jestem pewien, że nie ma tego w moich danych (chociaż może istnieć quasi-pełna separacja; jak mogę sprawdzić, czy tak jest?) . Jeśli usunę niektóre zmienne, błąd „nie zbiegnie się” może zniknąć. Ale nie zawsze tak się dzieje.

Próbowałem użyć tych samych zmiennych w bayesglmfunkcji i dostałem te same błędy.

Jakie kroki byś podjął, aby dowiedzieć się dokładnie, co się tutaj dzieje? Jak ustalić, które zmienne powodują problemy?

Ciastko
źródło
5
Dlaczego masz pewność, że separacja nie występuje? W tej bayesglmpracy , oni, że oddzielenie jest „wspólny problem, nawet, jeśli rozmiar próbki jest większy, a ilość predykcyjnych jest mały”
David J. Harris
2
Inna myśl: bayesglmpróbuje uniknąć separacji, dodając przeor, ale przy 24 000 rzędach przeor najprawdopodobniej zostanie zalany przez prawdopodobieństwo. Spróbuj zmniejszyć prior.scale, prawdopodobnie o dużą ilość. Rozważ również zwiększenie stopnia swobody przeora, co pomoże wykluczyć duże wartości związane z separacją.
David J. Harris
Dzięki za sugestie David. Nie sądzę, że występuje separacja, ponieważ kiedy sortuję każdą ze zmiennych objaśniających, zmienna zależna nie zawsze jest prawdziwa lub fałszywa dla wysokich lub niskich wartości zmiennych objaśniających. O ile nie uważa się tego za separację: zmienna zależna jest prawdziwa dla wszystkich x7> 32, ale x7 jest tylko> 32 w 10 przypadkach. Czy istnieje sposób zweryfikowania separacji poza regresją logistyczną? Lub zobaczyć, która zmienna powoduje separację? Wypróbowałem twoje sugestie bayesglm (ustawiłem prior.scale na 1 i prior.df na Inf) i nadal dostaję błędy Hauck Donner.
Dcook
1
powiązane pytania
user603
„Jak ustalić, które zmienne powodują problemy?” Wyszukiwanie binarne zawsze stanowi dobrą rezerwę. Masz tylko 50 zmiennych, więc jeśli jest idealnie oddzielona jedną pojedynczą zmienną, winowajcą będzie 6 iteracji. Jeśli są to dwie zmienne, znajdzie to co najwyżej 49 + 6 = 55 iteracji, w najgorszym przypadku.
smci

Odpowiedzi:

55

Przy tak dużej przestrzeni projektowej ( !) Możliwe jest uzyskanie idealnej separacji bez konieczności oddzielania żadnej zmiennej indywidualnie. Poparłbym nawet komentarz Davida J. Harrisa, mówiąc, że jest to prawdopodobne.R50

Możesz łatwo sprawdzić, czy Twoje klasy są idealnie oddzielone w twojej przestrzeni projektowej. Sprowadza się to do rozwiązania problemu programowania liniowego. Implementacja R tego „testu” (nie testu w znaczeniu statystycznym) jest zaimplementowana w pakiecie safeBinaryRegression .

Jeśli okaże się, że separacja jest rzeczywiście problemem, a jeśli interesuje Cię zwykłe waniliowe użycie glm (np. Glm nie jest wywoływany przez funkcję wyższego poziomu, ale przez ciebie), to istnieje implementacja R algorytmów, które nieznacznie modyfikuje klasyczny, aby uczynić go „odpornym” na separację. Jest zaimplementowany w pakiecie hlr

użytkownik603
źródło
4
Bardzo fajna i przydatna odpowiedź! Będę musiał zajrzeć do tych pakietów. (+1)
Peter Flom - Przywróć Monikę
1
FWIW tutaj jest opis innego solidnego algorytmu: win-vector.com/blog/2012/10/rudie-cant-fail-if-majorized
Alex
2
@Alex: dzięki za link. Jeśli glm nie jest zbieżny z powodu złych startów, mogę zobaczyć, jak ta metoda pomoże w tym. Z drugiej strony, jeśli problem jest spowodowany idealną separacją, nie jest dla mnie jasne, w jaki sposób pomysł MM mógłby to rozwiązać. Zastanawiałem się, czy możesz to skomentować (mogę w końcu opublikować to jako osobne pytanie).
user603
Doskonałe (+1)! Ja również będę musiał zajrzeć do tych pakietów.
jbowman
1
Dzięki za odpowiedź @ user603! Użyłem safeBinaryRegression, a separacja rzeczywiście występowała w przypadku kilku zmiennych. Następnie próbowałem użyć MEL w pakiecie hlr, aby zbudować model odporny na tę separację. Jednak współczynniki są ogromne (tak jak byłyby, gdy separacja następuje w normalnym glm), a oto liczby df i dewiacji: Stopnie swobody: 19112 Razem (tj. Null); 19063 Resztkowe odchylenie zerowe: 24990 Resztkowe odchylenie: 626000 AIC: 626000 Czy myślisz, że zrobiłem coś złego?
Dcook 14.12