Ce problème d'inférence a de nombreux noms, notamment des points de changement, des points de commutation, des points de rupture, une régression en ligne brisée, une régression en bâton cassé, une régression bilinéaire, une régression linéaire par morceaux, une régression linéaire locale, une régression segmentée et des modèles de discontinuité.
Voici un aperçu des packages de points de changement avec des avantages / inconvénients et des exemples pratiques. Si vous connaissez le nombre de points de changement a priori, consultez le mcp
package. Tout d'abord, simulons les données:
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))
Pour votre premier problème, il s'agit de trois segments d'interception uniquement:
model = list(
y ~ 1, # Intercept
~ 1, # etc...
~ 1
)
library(mcp)
fit = mcp(model, df, par_x = "x")
Nous pouvons tracer l'ajustement résultant:
plot(fit)
Ici, les points de changement sont très bien définis (étroits). Résumons l'ajustement pour voir leurs emplacements inférés ( cp_1
et 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
Vous pouvez faire des modèles beaucoup plus compliqués avec mcp
, y compris la modélisation de l'autorégression de Nième ordre (utile pour les séries chronologiques), etc. Avertissement: Je suis le développeur de mcp
.