Эта проблема логического вывода имеет много названий, включая точки изменения, точки переключения, точки разрыва, регрессию ломаной линии, регрессию ломаной палочки, билинейную регрессию, кусочно-линейную регрессию, локальную линейную регрессию, сегментированную регрессию и модели разрыва.
Вот обзор пакетов точек изменения с плюсами / минусами и проработанными примерами. Если вы знаете количество точек изменения априори, ознакомьтесь с 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
.