Introduction to makicoint

Merwan Roudane

2026-06-30

Overview

makicoint implements the Maki (2012) residual-based test for cointegration that allows for an unknown number of structural breaks. It extends the Gregory-Hansen (one break) and Hatemi-J (two breaks) tests to any feasible number of breaks. The null hypothesis is no cointegration; the alternative is cointegration with up to m breaks.

library(makicoint)

How it works

Breaks are placed one at a time by a sequential Bai-Perron procedure. At each candidate break the cointegrating regression is fitted and its residual is tested with an augmented Dickey-Fuller (ADF) regression. The test statistic is the minimum ADF t-statistic over all candidates and all steps; reject the null when it falls below the critical value.

Four deterministic models are available: level shift (model = 0), level shift with trend (1), regime shift (2), and regime shift with trend (3).

Example: a single level break

set.seed(123)
n <- 100
x <- cumsum(rnorm(n))
y <- 0.5 * x + cumsum(rnorm(n))
y[51:100] <- y[51:100] + 2          # a level break at observation 50

res <- coint_maki(cbind(y, x), m = 1, model = 0)
res
#> 
#> Maki (2012) Cointegration Test with Multiple Structural Breaks
#> --------------------------------------------------------------
#> Model        : Level Shift (model = 0)
#> Engine       : GAUSS/tspdlib-compatible
#> Observations : 100    Regressors: 1    Trimming: 0.10
#> Lag rule     : tsig (max 12, used 3)
#> Dependent    : y    Regressor(s): x
#> --------------------------------------------------------------
#> Test statistic :    -3.1616
#> Critical values: 1% = -5.709   5% = -4.602   10% = -4.354  [table]
#> 
#> Estimated breaks (obs : fraction):
#>   break 1 : 34 : 0.3400
#> --------------------------------------------------------------
#> Fail to reject H0: no evidence of cointegration.

The break is detected near observation 50 and, if the series are cointegrated with that break, the statistic falls below the critical value.

The diagnostic plot

If ggplot2 is installed, plot() draws a two-panel dashboard: the series with its break-adjusted long-run fit, and the cointegrating residual.

plot(res)

Two-panel Maki test dashboard

Two engines

The break dates can be chosen two ways; both give the same test statistic. The default reproduces the original ‘GAUSS’/‘tspdlib’ implementation. With engine = "paper", each break minimises the cointegrating-regression sum of squared residuals, the rule in Maki (2012, Steps 2 and 4).

g <- coint_maki(cbind(y, x), m = 2, model = 2)                 # default (GAUSS)
p <- coint_maki(cbind(y, x), m = 2, model = 2, engine = "paper")
c(gauss = g$statistic, paper = p$statistic)
#>     gauss     paper 
#> -3.621283 -4.386842
rbind(gauss = g$breakpoints, paper = p$breakpoints)
#>       [,1] [,2]
#> gauss   34   63
#> paper   19   63

Critical values

cv_coint_maki() returns the Maki (2012) Table 1 values, which depend on the number of regressors (1-4), the number of breaks (1-5) and the model.

cv_coint_maki(k = 2, m = 3, model = 2)
#> [1] -7.031 -6.516 -6.210

More than five breaks

Maki’s Table 1 stops at five breaks (his footnote 5 notes more are possible). makicoint estimates the statistic and breaks for any feasible number, and for more than five it can simulate the critical values by Maki’s own Monte-Carlo design. The simulation reruns the whole search every replication, so it is heavy; use a few thousand replications for reported work.

# (not run here; can take minutes)
coint_maki(cbind(y, x), m = 7, simcv = 2000, simt = 500)

Accessing results

res$statistic
#> [1] -3.161558
res$breakpoints
#> [1] 34
res$critical_values
#> [1] -5.709 -4.602 -4.354
res$cv_source
#> [1] "table"

Reference

Maki, D. (2012). Tests for cointegration allowing for an unknown number of breaks. Economic Modelling, 29, 2011-2015. https://doi.org/10.1016/j.econmod.2012.04.022