Ця проблема висновку має багато назв, включаючи точки зміни, точки перемикання, точки розриву, регресію безперервної лінії, регресію зламаної палиці, білінеарну регресію, кусочно-лінійну регресію, локальну лінійну регресію, сегментовану регресію та розриви моделей.
Ось огляд пакетів змінних точок із плюсами та мінусами та відпрацьованими прикладами. Якщо ви знаєте кількість точок зміни апріорі, ознайомтеся з mcp
пакетом. Спочатку давайте змоделюємо дані:
df = data.frame(x = seq(1, 12, by = 0.1))
df$y = c(rnorm(21, 0, 5), rnorm(80, 180, 5), rnorm(10, 20, 5))
Для вашої першої проблеми - це три сегменти, які відповідають лише перехопленню:
model = list(
y ~ 1, # Intercept
~ 1, # etc...
~ 1
)
library(mcp)
fit = mcp(model, df, par_x = "x")
Ми можемо побудувати отриману форму:
plot(fit)
Тут точки зміни дуже чітко визначені (вузькі). Давайте підведемо підсумки, щоб побачити їхні висновки ( cp_1
і cp_2
):
summary(fit)
Family: gaussian(link = 'identity')
Iterations: 9000 from 3 chains.
Segments:
1: y ~ 1
2: y ~ 1 ~ 1
3: y ~ 1 ~ 1
Population-level parameters:
name mean lower upper Rhat n.eff
cp_1 3.05 3.0 3.1 1 6445
cp_2 11.05 11.0 11.1 1 6401
int_1 0.14 -1.9 2.1 1 5979
int_2 179.86 178.8 180.9 1 6659
int_3 22.76 19.8 25.5 1 5906
sigma_1 4.68 4.1 5.3 1 5282
Ви можете робити набагато складніші моделі mcp
, включаючи моделювання авторегресії N-го порядку (корисно для часових рядів) тощо. Відмова: Я розробник mcp
.