library("strucchange")
data("durab")
## use AR(1) model as in Hansen (2001) and Zeileis et al. (2005)
durab.model <- y ~ lag
## historical tests
## OLS-based CUSUM process
ols <- efp(durab.model, data = durab, type = "OLS-CUSUM")
plot(ols)


## monitoring
Durab <- window(durab, start=1964, end = c(1979, 12))
ols.efp <- efp(durab.model, type = "OLS-CUSUM", data = Durab)
newborder <- function(k) 1.723 * k/192
ols.mefp <- mefp(ols.efp, period=2)
ols.mefp2 <- mefp(ols.efp, border=newborder)
Durab <- window(durab, start=1964)
ols.mon <- monitor(ols.mefp)Break detected at observation # 437
ols.mon2 <- monitor(ols.mefp2)Break detected at observation # 416

## Note: critical value for linear boundary taken from Table III
## in Zeileis et al. 2005: (1.568 + 1.896)/2 = 1.732 is a linear
## interpolation between the values for T = 2 and T = 3 at
## alpha = 0.05. A typo switched 1.732 to 1.723.
## dating
bp <- breakpoints(durab.model, data = durab)
summary(bp)
Optimal (m+1)-segment partition:
Call:
breakpoints.formula(formula = durab.model, data = durab)
Breakpoints at observation number:
m = 1 418
m = 2 221 530
m = 3 114 225 530
m = 4 114 221 418 531
m = 5 114 221 319 418 531
Corresponding to breakdates:
m = 1 1981(12)
m = 2 1965(7) 1991(4)
m = 3 1956(8) 1965(11) 1991(4)
m = 4 1956(8) 1965(7) 1981(12) 1991(5)
m = 5 1956(8) 1965(7) 1973(9) 1981(12) 1991(5)
Fit:
m 0 1 2 3 4 5
RSS 5.586e-02 5.431e-02 5.325e-02 5.220e-02 5.171e-02 5.157e-02
BIC -4.221e+03 -4.220e+03 -4.213e+03 -4.207e+03 -4.194e+03 -4.176e+03

plot(ols)
lines(breakpoints(bp, breaks = 1), col = 3)
lines(breakpoints(bp, breaks = 2), col = 4)
plot(fs)
lines(breakpoints(bp, breaks = 1), col = 3)
lines(breakpoints(bp, breaks = 2), col = 4)