Słownik metodologiczny · Modele regresji

Regresja segmentowa – jak znaleźć punkt, w którym zmienia się nachylenie?

Regresja segmentowa łączy proste w punkcie załamania, po którym zmienia się nachylenie zależności. Pokazujemy model, znany i nieznany punkt załamania, przykład w R z siatką kandydatów i opis do pracy.

Strona główna / Słownik / Regresja segmentowa
W skrócie: Regresja segmentowa opisuje zależność odcinkami prostych połączonymi w punkcie załamania c, po którym zmienia się nachylenie. Gdy c jest znany (np. data interwencji), to zwykła regresja z dodatkową zmienną; gdy nieznany, szacuje się go z danych, a wnioskowanie wymaga ostrożności.

Co to jest regresja segmentowa?

Regresja segmentowa (ang. segmented lub piecewise regression) opisuje zależność dwiema lub kilkoma prostymi połączonymi w punkcie załamania (ang. breakpoint). Po jego przekroczeniu zmienia się nachylenie, a linia pozostaje ciągła. Model ma postać y = β0 + β1x + β2(x − c)+, gdzie (x − c)+ to 0 poniżej c i x − c powyżej. Nachylenie przed punktem to β1, po nim β1 + β2. W odróżnieniu od regresji krzywoliniowej każdy odcinek da się opisać jednym zdaniem.

Znany i nieznany punkt załamania

Gdy c wynika z planu badania, np. z daty wprowadzenia interwencji, model to zwykła regresja liniowa z dodatkową zmienną. Tak działa przerwany szereg czasowy; Wagner i in. (2002) opisali regresję segmentową jako metodę szacowania zmian poziomu i nachylenia po interwencji. Gdy c jest nieznany, staje się parametrem. Muggeo (2003) zaproponował jego szacowanie przez linearyzację; prostszą drogą jest siatka kandydatów i wybór c o najmniejszej sumie kwadratów reszt.

Przykład

W symulowanych danych (n = 120) efekt rósł z dawką powoli, a powyżej 60 mg szybciej. Siatka od 10 do 90 mg wskazała c = 63 mg, 95% CI bootstrap [53.0, 73.5]. Nachylenie wyniosło 0.067 przed punktem i 0.358 po nim (zmiana 0.291, SE = 0.030). Model segmentowy miał AIC = 513.2 (z karą za c) wobec 578.2 dla prostej.

Jak opisać w pracy

Punkt załamania oszacowano przeszukaniem siatki (10–90 mg, krok 0.5 mg) jako c = 63 mg, 95% CI bootstrap [53.0, 73.5]. Poniżej tej dawki efekt rósł o 0.067 na mg, a powyżej o 0.358 na mg. Model segmentowy był lepiej dopasowany niż liniowy (AIC 513.2 wobec 578.2).

Na co uważać

  • Szukany punkt zawyża pewność. Błędy standardowe z lm traktują c jak znany, a p dla zmiany nachylenia po przeszukaniu siatki jest zbyt optymistyczne. Podawaj przedział dla c i porównuj modele kryteriami takimi jak AIC i BIC.
  • Punkt przy brzegu danych. Ogranicz siatkę tak, by po obu stronach zostało dość obserwacji.
  • Dane w czasie. Sprawdź autokorelację reszt.

Zastosowanie w szeregach czasowych pokazuje wpis Regresja segmentowa i przerwany szereg czasowy, a gładkie alternatywy – splajny i modele GAM.

Przykład reprodukowalny

Regresja segmentowa w R

Kod symuluje zależność z punktem załamania, szuka go na siatce kandydatów zwykłą funkcją lm, porównuje model segmentowy z prostą i wyznacza bootstrapowy przedział dla punktu załamania.

Punkt załamania zależności efektu od dawki

Dane wejściowe: 120 obserwacji symulowanych (set.seed(3753)): dawka 0–100 mg i efekt, prawdziwy punkt załamania 60 mg.

Co odczytać: oszacowany punkt załamania, współczynniki (wiersz pmax(dawka - c, 0) to zmiana nachylenia), nachylenia przed i po punkcie, AIC obu modeli oraz 95% przedział percentylowy dla punktu załamania z 500 prób bootstrap.

R
set.seed(3753)
n <- 120
dawka <- sort(runif(n, 0, 100))                          # dawka (mg)
efekt <- 10 + 0.05 * dawka + 0.30 * pmax(dawka - 60, 0) + rnorm(n, sd = 2)
dane  <- data.frame(dawka, efekt)                        # prawdziwy punkt załamania: 60 mg

dopasuj <- function(c, d) lm(efekt ~ dawka + pmax(dawka - c, 0), data = d)
siatka  <- seq(10, 90, by = 0.5)                         # kandydaci na punkt załamania
rss     <- sapply(siatka, function(c) deviance(dopasuj(c, dane)))
c_hat   <- siatka[which.min(rss)]
m_seg   <- dopasuj(c_hat, dane)
m_lin   <- lm(efekt ~ dawka, data = dane)

c(punkt_zalamania = c_hat)
round(coef(summary(m_seg)), 3)
round(c(nachylenie_przed = unname(coef(m_seg)[2]),
        nachylenie_po    = unname(coef(m_seg)[2] + coef(m_seg)[3])), 3)
round(c(AIC_liniowy = AIC(m_lin), AIC_segmentowy = AIC(m_seg) + 2), 1)   # +2: punkt załamania to też parametr

boot_c <- replicate(500, {                               # bootstrap przypadków dla punktu załamania
  d <- dane[sample(n, replace = TRUE), ]
  siatka[which.min(sapply(siatka, function(c) deviance(dopasuj(c, d))))]
})
quantile(boot_c, c(0.025, 0.975))
Wynik w R
punkt_zalamania
             63
                   Estimate Std. Error t value Pr(>|t|)
(Intercept)           9.443      0.470  20.071        0
dawka                 0.067      0.011   5.905        0
pmax(dawka - c, 0)    0.291      0.030   9.540        0
nachylenie_przed    nachylenie_po
           0.067            0.358
   AIC_liniowy AIC_segmentowy
         578.2          513.2
 2.5% 97.5%
 53.0  73.5

Bibliografia oprogramowania

Wyniki pochodzą z uruchomienia pokazanego kodu w R 4.5.3 (bez dodatkowych pakietów). W pracy podaj wersje faktycznie użytych pakietów (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

Czym regresja segmentowa różni się od przerwanego szeregu czasowego?

Przerwany szereg czasowy to schemat badania: pomiary przed interwencją i po niej. Regresja segmentowa to model, którym zwykle się go analizuje, z punktem załamania w dacie interwencji i często ze zmianą poziomu. Sam model stosuje się też poza czasem, np. dla dawki czy wieku.

Czy punkt załamania może oznaczać skok, a nie tylko zmianę nachylenia?

Tak. Dodanie zmiennej 0/1 dla obserwacji powyżej c pozwala na nieciągłość, czyli zmianę poziomu. W przerwanym szeregu czasowym to standard (Wagner i in., 2002), ale przy nieznanym c skok trzeba uzasadnić teorią.

Jak policzyć regresję segmentową w R bez pakietu segmented?

Dla znanego punktu: lm(y ~ x + pmax(x - c, 0)). Dla nieznanego dopasuj ten model dla siatki wartości c, wybierz najmniejszą sumę kwadratów reszt (deviance()) i oszacuj przedział dla c bootstrapem.

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. Muggeo, V. M. R. (2003). Estimating regression models with unknown break-points. Statistics in Medicine, 22(19), 3055–3071. https://doi.org/10.1002/sim.1545
  2. Wagner, A. K., Soumerai, S. B., Zhang, F., & Ross-Degnan, D. (2002). Segmented regression analysis of interrupted time series studies in medication use research. Journal of Clinical Pharmacy and Therapeutics, 27(4), 299–309. https://doi.org/10.1046/j.1365-2710.2002.00430.x

Cytowania BibTeX

@article{muggeo2003estimating, author={Muggeo, Vito M. R.}, title={{Estimating regression models with unknown break-points}}, journal={Statistics in Medicine}, year={2003}, volume={22}, number={19}, pages={3055--3071}, doi={10.1002/sim.1545}}
@article{wagner2002segmented, author={Wagner, A. K. and Soumerai, S. B. and Zhang, F. and Ross-Degnan, D.}, title={{Segmented regression analysis of interrupted time series studies in medication use research}}, journal={Journal of Clinical Pharmacy and Therapeutics}, year={2002}, volume={27}, number={4}, pages={299--309}, doi={10.1046/j.1365-2710.2002.00430.x}}
R