Questo problema di inferenza ha molti nomi, inclusi punti di cambiamento, punti di commutazione, punti di interruzione, regressione della linea spezzata, regressione del bastone rotto, regressione bilineare, regressione lineare a tratti, regressione lineare locale, regressione segmentata e discontinuità.
Ecco una panoramica dei pacchetti di punti di cambiamento con pro / contro ed esempi funzionanti. Se conosci il numero di punti di cambio a priori, controlla il mcp
pacchetto. Innanzitutto, simuliamo i dati:
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))
Per il tuo primo problema, sono tre segmenti di sola intercettazione:
model = list(
y ~ 1, # Intercept
~ 1, # etc...
~ 1
)
library(mcp)
fit = mcp(model, df, par_x = "x")
Possiamo tracciare la misura risultante:
plot(fit)
Qui, i punti di cambio sono molto ben definiti (stretto). Riassumiamo l'adattamento per vedere le loro posizioni dedotte ( cp_1
e 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
Puoi realizzare modelli molto più complicati mcp
, inclusa la modellazione dell'autoregressione di ordine n. (Utile per le serie storiche), ecc. Disclaimer: sono lo sviluppatore di mcp
.