Słownik metodologiczny · Modele regresji

Test Hosmera–Lemeshowa – jak ocenić dopasowanie regresji logistycznej?

Test porównuje przewidywane i obserwowane liczby zdarzeń w grupach. Pokazujemy wzór, przykład w R i powód, dla którego wynik tak mocno zależy od liczebności próby.

Strona główna / Słownik / Test Hosmera–Lemeshowa
W skrócie: Test Hosmera–Lemeshowa dzieli próbę na grupy według przewidywanego prawdopodobieństwa i porównuje liczby zdarzeń obserwowanych i oczekiwanych. Wynik nieistotny to tylko brak dowodów złego dopasowania; w małej próbie test ma małą moc, w dużej odrzuca prawie każdy model.

Co to jest test Hosmera–Lemeshowa?

Test Hosmera–Lemeshowa (ang. Hosmer–Lemeshow goodness-of-fit test) sprawdza, czy prawdopodobieństwa przewidywane przez regresję logistyczną zgadzają się z odsetkami zdarzeń obserwowanymi w danych. Hosmer i Lemeshow (1980) zaproponowali statystyki oparte na tabeli, w której liczebności oczekiwane wyznacza się po pogrupowaniu obserwacji. Najczęściej używa się wersji z 10 grupami według decyli przewidywanego prawdopodobieństwa. Hipoteza zerowa mówi, że model jest dobrze dopasowany, więc wynik nieistotny oznacza tylko brak dowodów złego dopasowania.

Jak liczyć?

Ĉ = Σ (Og − Eg)² / [Eg(1 − Eg/ng)],   df = g − 2

Og to liczba zdarzeń w grupie g, Eg – suma przewidywanych prawdopodobieństw w tej grupie, a ng – jej liczebność. Statystykę porównuje się z rozkładem χ².

Przykład

W danych symulowanych rezygnacja z egzaminu zależy od lęku nieliniowo (osoby z bardzo niskim i bardzo wysokim lękiem rezygnują częściej), a model zawiera tylko liniowy składnik lęku. Przy n = 150 test nie wykrył błędu: χ²(8) = 12.66, p = .124 (przy 8 grupach χ²(6) = 10.47, p = .106). Przy tym samym błędzie i n = 3000 wynik to χ²(8) = 226.22, p < .001. Błąd modelu był ten sam, zmieniła się tylko moc testu.

Jak opisać w pracy

Dopasowanie modelu oceniono testem Hosmera–Lemeshowa z 10 grupami wyznaczonymi według decyli przewidywanego prawdopodobieństwa, χ²(8) = 12.66, p = .124. Wynik nie wskazuje na złe dopasowanie, ale przy n = 150 test ma ograniczoną moc.

Na co uważać

  • Wynik nieistotny nie dowodzi, że model jest dobry. W małej próbie test przeoczy nawet pominiętą nieliniowość, jak w przykładzie. Postać związku sprawdź osobno, np. dodając składnik kwadratowy (regresja krzywoliniowa).
  • W dużej próbie test odrzuca model już przy drobnych odchyleniach. Paul, Pennell i Lemeshow (2013) pokazują, że moc rośnie z liczebnością i zależy od liczby grup, i podają zalecenia, jak dobierać liczbę grup do wielkości próby. W pracy podaj, ile grup przyjęto.
  • Nie poprzestawaj na jednym p. Steyerberg i in. (2010) zwracają uwagę na ograniczoną moc i słabą interpretowalność tego testu i zalecają, by zawsze raportować kalibrację (np. wykres i nachylenie kalibracji) oraz dyskryminację (AUC).

Test nie mówi też nic o sile związku – do tego służą ilorazy szans i pseudo-R². Ocenę kalibracji w modelu predykcyjnym omawia wpis Modele predykcyjne: walidacja krzyżowa, przeuczenie i kalibracja.

Przykład reprodukowalny

Test Hosmera–Lemeshowa w R

Funkcja hl_test() dzieli próbę według kwantyli przewidywanego prawdopodobieństwa i liczy statystykę testu. Ten sam błąd specyfikacji sprawdzono w małej i dużej próbie.

Ten sam źle określony model przy n = 150 i n = 3000

Dane wejściowe: rezygnacja z egzaminu (0/1) zależna od lęku nieliniowo; model zawiera tylko liniowy składnik lęku (dane symulowane, set.seed(182)).

Co odczytać: χ², liczbę stopni swobody i p dla 10 i 8 grup przy n = 150 oraz dla 10 grup przy n = 3000.

R
# Test Hosmera–Lemeshowa liczony ręcznie (dane symulowane)
hl_test <- function(y, p, g = 10) {
  grupa <- cut(p, breaks = unique(quantile(p, probs = seq(0, 1, length.out = g + 1))),
               include.lowest = TRUE)
  obs <- tapply(y, grupa, sum); ocz <- tapply(p, grupa, sum); n_g <- tapply(y, grupa, length)
  chi2 <- sum((obs - ocz)^2 / (ocz * (1 - ocz / n_g)))
  df <- nlevels(grupa) - 2
  c(chi2 = round(chi2, 2), df = df, p = round(pchisq(chi2, df, lower.tail = FALSE), 3))
}
symuluj <- function(n, seed) {
  set.seed(seed)
  lek <- rnorm(n)                                  # lęk przed egzaminem (wynik z)
  y <- rbinom(n, 1, plogis(-1 + 0.5 * lek + 0.5 * lek^2))   # 1 = rezygnacja z egzaminu
  m <- glm(y ~ lek, family = binomial)             # model pomija składnik kwadratowy
  list(y = y, p = fitted(m))
}
male <- symuluj(150, 182); duze <- symuluj(3000, 182)
rbind(n150_g10 = hl_test(male$y, male$p, 10),
      n150_g8  = hl_test(male$y, male$p, 8),
      n3000_g10 = hl_test(duze$y, duze$p, 10))
Wynik w R
            chi2 df     p
n150_g10   12.66  8 0.124
n150_g8    10.47  6 0.106
n3000_g10 226.22  8 0.000

Bibliografia oprogramowania

Wyniki pochodzą z uruchomienia pokazanego kodu w R 4.5.3 (funkcje pakietów base i stats). W pracy podaj wersję R, której faktycznie użyto (sessionInfo()).

  1. R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/

Najczęstsze pytania

Co oznacza nieistotny wynik testu Hosmera–Lemeshowa?

Brak dowodów na rozbieżność przewidywanych i obserwowanych odsetków. Nie dowodzi, że model jest dobry: w małej próbie test często przeoczy nawet wyraźny błąd specyfikacji.

Ile grup przyjąć w teście Hosmera–Lemeshowa?

Zwykle 10 grup według decyli przewidywanego prawdopodobieństwa. Przy bardzo dużych próbach Paul i in. (2013) zalecają dobierać liczbę grup do liczebności. W pracy zawsze podaj liczbę grup.

Jak zrobić test Hosmera–Lemeshowa w SPSS i R?

W SPSS zaznacz opcję „Hosmer-Lemeshow goodness-of-fit” w oknie Options regresji logistycznej. W R użyj np. funkcji DescTools::HosmerLemeshowTest() albo policz statystykę ręcznie, jak w przykładzie.

Powiązane hasła

Poradniki, w których użyjesz tego pojęcia

Potrzebujesz wsparcia w analizie danych?

Wybierz ofertę dopasowaną do pracy dyplomowej albo profesjonalnego projektu naukowego.

Wyceń analizęOferta dla studentów

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Hosmer, D. W., & Lemeshow, S. (1980). Goodness of fit tests for the multiple logistic regression model. Communications in Statistics – Theory and Methods, 9(10), 1043–1069. https://doi.org/10.1080/03610928008827941
  2. Paul, P., Pennell, M. L., & Lemeshow, S. (2013). Standardizing the power of the Hosmer–Lemeshow goodness of fit test in large data sets. Statistics in Medicine, 32(1), 67–80. https://doi.org/10.1002/sim.5525
  3. Steyerberg, E. W., Vickers, A. J., Cook, N. R., Gerds, T., Gonen, M., Obuchowski, N., Pencina, M. J., & Kattan, M. W. (2010). Assessing the performance of prediction models: A framework for traditional and novel measures. Epidemiology, 21(1), 128–138. https://doi.org/10.1097/ede.0b013e3181c30fb2 ● Otwarty dostęp: pełny tekst

Cytowania BibTeX

@article{hosmer1980goodness, author={Hosmer, David W. and Lemeshow, Stanley}, title={{Goodness of fit tests for the multiple logistic regression model}}, journal={Communications in Statistics – Theory and Methods}, year={1980}, volume={9}, number={10}, pages={1043--1069}, doi={10.1080/03610928008827941}}
@article{paul2013standardizing, author={Paul, Prabasaj and Pennell, Michael L. and Lemeshow, Stanley}, title={{Standardizing the power of the Hosmer–Lemeshow goodness of fit test in large data sets}}, journal={Statistics in Medicine}, year={2013}, volume={32}, number={1}, pages={67--80}, doi={10.1002/sim.5525}}
@article{steyerberg2010assessing, author={Steyerberg, Ewout W. and Vickers, Andrew J. and Cook, Nancy R. and Gerds, Thomas and Gonen, Mithat and Obuchowski, Nancy and Pencina, Michael J. and Kattan, Michael W.}, title={{Assessing the performance of prediction models: A framework for traditional and novel measures}}, journal={Epidemiology}, year={2010}, volume={21}, number={1}, pages={128--138}, doi={10.1097/ede.0b013e3181c30fb2}}
R