*! version 1.0.0 17jul2026

help for xtcombreak estimate version 1.0.0 - 17jul2026

Title

xtcombreak estimate -- Estimate the common break date in
panel means and variances, with a confidence interval (Bai 2010).

Syntax

xtcombreak estimate depvar [if] [in]
[, options]

Model
method(ls|qml|gls) break-date estimator; default method(ls)

breaks(#) number of breaks; default breaks(1)

trimming(#) minimum regime length as a fraction of T; default trimming(0)

Inference
level(#) confidence level: 90, 95 or 99 only; default 95

anmethod(het|hom) form of the scale A_N; default anmethod(het)

cimethod(symmetric|literal) CI construction; default cimethod(symmetric)

chow report the per-series Chow test at the estimated break

Reporting
showindex also report break positions as indices 1..T

graph produce the profile and shift plots

profname(name) name for the break-identification graph

shiftname(name) name for the per-series shift graph

The data must be xtset as a balanced panel.

Note: estimate takes exactly one variable and refuses
an indepvars list. This is not a limitation of the implementation -- Bai (2010)
is a pure mean/variance-shift model with no regressors (his eq.1 and eq.15).
Silently accepting regressors would turn it into a different paper. For a common
break in slopes use xtcombreak test,
xtbfkbreak or xtbreak.

Description

xtcombreak estimate implements Bai (2010). The model is

Yit = mui1 + eit t = 1, ..., k0

Yit = mui2 + eit t = k0+1, ..., T

for i = 1..N. Every series breaks at the same unknown date k0, but the
means mui1, mui2 are heterogeneous -- so the shift
mui2-mui1 varies across units and may even be positive for some and
negative for others. This is a genuine incidental-parameter problem, and Bai's
contribution is that consistency survives it.

With method(qml) the model widens to allow a break in the
variance as well (Bai eq.15):

Yit = mui1 + sigmai1*etait t <= k0

Yit = mui2 + sigmai2*etait t > k0

Why a panel changes everything

In one time series, khat - k0 = Op(1) no matter how much data you
have: the break fraction is estimable, the break date is not. Bai's
Theorem 3.1 shows that with a panel, P(khat = k0) -> 1 as N -> infinity. The
date itself is recovered. Identification needs only

N-1/2 * SUMi (mui2-mui1)2 -> infinity

(his Assumption 2), which notably does not require every series to
break.

Consistency also holds when a regime contains a single observation
(his Fig.2, T=10 and k0=9) -- useful when the goal is to detect the onset of a
new regime as early as possible, without waiting for data from it.

Options

Model

method(ls|qml|gls) selects the estimator of the break date.

ls (default) minimises the pooled sum of squared residuals
SSR(k) = SUMi SiT(k) over k in [1, T-1] (Bai p.80). Requires no
distributional assumption beyond a few moments. Cannot detect a break that occurs
only in the variance.

qml minimises Bai's eq.(16),
UNT(k) = k*SUMi log sigma2i1(k) + (T-k)*SUMi log
sigma2i2(k). It is consistent under a break in the mean or in
the variance or both (his Theorem 5.1), and is never less efficient than
LS -- see choosing an estimator.

gls is Bai's two-step feasible GLS (p.85): least squares gives khat,
then sigma2i = SiT(khat)/(T-2), then the break is re-estimated
minimising SUMi SiT(k)/sigma2i. Bai shows it is
asymptotically equivalent to QML.

breaks(#) sets the number of breaks. With breaks(1) (default)
a single break is estimated. With #>1 the one-at-a-time method of Bai (1997a),
described in his sec.6, adds breaks sequentially: at each step the location giving
the largest reduction in the pooled SSR is retained, and the estimates are
relabelled in ascending order. Bai derives no confidence interval for
multiple breaks; the reported interval refers to the first break only.

trimming(#) imposes a minimum regime length of #*T observations.
Default trimming(0). See Trimming -- the
default is deliberate and departing from it is a departure from Bai.

Inference

level(#) sets the confidence level. Only 90, 95 and
99 are accepted, and any other value is an error rather than an
interpolation. The reason is that Bai's interval is built from three simulated
constants

P(|l*| <= 7) ~ 0.90

P(|l*| <= 11) ~ 0.95

P(|l*| <= 20) ~ 0.99

where l* = argminl{|l| + 2W(l)} and W is a two-sided
Gaussian random walk (Bai p.83, his Fig.3). He tabulates only these three.
Inventing a constant for, say, 92% would not be his method.

anmethod(het|hom) selects the form of the scale AN.

het (default) uses Bai's general expression (p.83)

A_N = [SUM_i d_i^2]^2 / [SUM_i d_i^2 * sigma_i^2], with
di = mui2-mui1. Allows cross-sectional heteroskedasticity.

hom reproduces the formula Bai used in his own Monte Carlo (p.83),
A_N = SUM_i d_i^2 / sigma^2 with the pooled
sigma2 = SUMiSUMt e2it/(NT-2N). This is the
homoskedastic special case: when sigma2i is constant the two agree
exactly, which Bai states on p.83. Use it to replicate his Table 1.

cimethod(symmetric|literal) selects how the interval is built from
the scale. This exists because Bai's eq.(13), read literally, is not what he
actually ran -- it contradicts his own prose and his own Table 1.

symmetric (default) uses [khat - ceil(c/A), khat + ceil(c/A)]. This
reproduces Bai's published Table 1: on 300 replications of his own p.83
design it returns his median lengths 9, 5, 5, 3 exactly (N = 5, 10, 15, 20 at the
90% level) and his coverage to within Monte Carlo error.

literal uses [khat - floor(c/A), khat + ceil(c/A)] exactly as
eq.(13) prints it. It is systematically one integer shorter and under-covers:
0.797 / 0.863 / 0.890 / 0.927 against Bai's 0.829 / 0.900 / 0.937 / 0.949.

The giveaway is parity. Under literal, floor = ceil-1 whenever c/A is
not an integer, so the length 2*ceil is always even; Bai's published lengths
are almost all odd, which only 2*ceil+1 gives. And his p.84 sentence -- "the
shortest confidence interval ... would contain three integers (khat-1, khat,
khat+1)" -- is true only of the symmetric form; the literal one bottoms out at two.
Full evidence in help xtcombreak methods.

chow adds the per-series Chow test at the estimated break. Bai (p.84)
shows the standard Chow test with ordinary chi2 critical values is valid
here, provided it is run series by series: as N grows, series i contributes only
O(1/N) of khat, so khat is asymptotically exogenous for series i and needs no
correction for being estimated. The command warns when N is small enough
(N < 15) for that argument to be thin.

Reporting

showindex additionally reports break positions as indices 1..T rather
than only as values of the time variable.

graph produces two figures: a break-identification plot (the
objective function against candidate dates, with khat and the CI marked) and a
per-series shift plot (mui2-mui1 for every unit, coloured by
whether the Chow test rejects). profname() and shiftname() rename
them so they can be graph combined.

Interpreting the output

Header

Estimator -- LS, QML or feasible GLS.

T/N -- the asymptotic regime. Bai's CI needs T large relative to N
(his eq.5). A note appears when T < N.

Trimming -- "none (k in [1, T-1])" means Bai's literal estimator.

Estimated common break date

Break date -- khat in the units of your time variable, with the CI.

Break index -- the same as a position 1..T (showindex).

Break fraction tau0 -- khat/T. Feed this to
xtcombreak test mentally: its critical values depend on
tau0 and are tabulated only over [0.20, 0.80].

The line below the table shows the constant used (7/11/20) and the
realised scale A. A wide interval means a small A: either small breaks, few
series, or noisy series.

A CI of exactly three integers {khat-1, khat, khat+1} is the
narrowest the construction can produce, because of the floor/ceiling in Bai's
eq.(13). He notes this himself (p.84). It does not mean the break is known to
within one period; it means 7/A < 1.

Scale parameters and CI efficiency

A_N -- the least-squares scale. B_N -- the QML/GLS scale.

B_N / A_N >= 1 always, by Cauchy-Schwarz (Bai p.85). A larger scale
gives a narrower interval, so this ratio is the efficiency gain from QML.
It equals 1 exactly when sigma2i is constant across i -- with
homoskedastic panels LS and QML coincide, which Bai states explicitly.

With method(qml) five more parameters appear -- tau (mean-break
signal), omega (variance-break signal), kappa (4th cumulant of eta),
mu3 (3rd moment), pi (mean/variance-break overlap). They feed Bai's
master scale, eq.(19). See xtcombreak_methods.

Which series actually broke

One row per series: the estimated shift, the Chow chi2(1), its p-value and
sigma2i. Bai's assumptions do not require every series to break
(Assumption 2 needs only the sum to diverge), so a mix of rejections and
non-rejections is expected and is not a sign of trouble. Series with the largest
|shift| relative to sigmai reject first. The full matrix is in
r(chow).

Choosing an estimator

Use method(qml) unless you have a reason not to.

Bai's efficiency result (p.85) is strong and easy to miss: QML is more
efficient than least squares even when there is no break in the variance at all.
The reason is that QML is asymptotically minimising SUMi
sigma-2i SiT(k) -- a GLS criterion. It down-weights noisy
series. LS treats a series with sigmai=10 as informative as one with
sigmai=0.1.

Formally AN <= BN by Cauchy-Schwarz, with equality iff
sigma2i is constant. So:

Situation Choice

Homoskedastic panel LS and QML are equivalent; either

Heteroskedastic panel qml or gls -- strictly tighter CI

Variance may also break qml -- LS is blind to a pure variance break

Reluctant to assume normality ls or gls; QML is quasi-ML, so normality is not needed for consistency, but ls needs the fewest moments

Very short regimes wanted ls -- QML needs 2 obs per regime (see below)

A trap Bai flags, worth repeating

You might think that if the variance breaks, you should weight by the
regime-specific variance. Bai shows (p.85) that this weighted least squares
estimator, using even the true sigmai1, sigmai2, is not
consistent. His counter-example: mui2=2mui1 and
sigmai2=2sigmai1. Dividing the second regime by 2 removes the break
from both the mean and the variance, so there is nothing left to find. LS and
QML both survive this; WLS does not. xtcombreak therefore offers no WLS
option.

Trimming: why the default is zero

Nearly every break command trims 15% of the sample at each end. Bai's does
not, and this is not an oversight -- it is the paper's headline. His abstract:
"Consistency is obtainable even when a regime contains a single observation,
making it possible to quickly identify the onset of a new regime." His Fig.2 shows
exactly this with T=10 and k0=9.

A command that trims 15% cannot even consider k0=9 when T=10, so it
cannot reproduce Bai. trimming(0) is therefore the faithful default and
estimate searches k in [1, T-1] exactly as Bai's p.80 defines.

When to depart from it

o QML and GLS force a minimum of 2, whatever you ask for. At k=1 the
first regime has one observation, so sigma2i1(1) = 0 exactly and
log(0) = -infinity: the QML objective is undefined at the boundary. Bai sidesteps
this by assuming k0 = [T*tau0] throughout his sec.5. The command applies the
minimum silently for qml/gls and skips any k where a variance estimate
is non-positive.

o If you want the conventional framework, set trimming(0.15).
Bai's Theorem 3.1 covers both: under Assumption 2 consistency holds "whether or not
k0 is restricted".

o To compare with xtbreak or xtbfkbreak, match their
trimming (0.15 by default) or the break sets differ for reasons unrelated to the
estimator.

Limitations -- what Bai (2010) does not provide

These are stated rather than papered over:

1. No test that a break exists. Bai (p.79): the focus is estimation
"given its existence". If you run estimate on a panel with no break you will
still get a khat and a CI -- both meaningless. Run
xtbreak test first.

2. No test that the break is common. Bai assumes it. Use
xtcombreak test.

3. No established way to choose the number of breaks. Bai's sec.6:
"for panel data, the corresponding criteria are not well understood. Our
preliminary analysis shows that, under fixed T, the AIC criterion is consistent
and the BIC is not, contrary to conventional wisdom ... Further investigation is
called for." breaks(#) is therefore yours to set; no automatic IC selection
is offered, because Bai does not endorse one.

4. No CI for multiple breaks. His eq.(13) is derived for a single
break.

5. Cross-sectional independence is assumed (Assumption 1). Bai notes
consistency survives weak cross-sectional correlation, but the CI relies on a
central limit theorem across i.

6. Serial correlation affects the limiting distribution. Bai's
Theorem 4.2 assumes eit uncorrelated over t; under serial correlation the
theorem still holds but the normal variables become correlated, and the
correlations enter the distribution (p.82). The reported CI does not adjust for
this.

Examples

. webuse grunfeld, clear

. xtset company year

Basic

. xtcombreak estimate invest

. xtcombreak estimate invest, showindex

All three estimators on the same data

. xtcombreak estimate invest, method(ls)

. xtcombreak estimate invest, method(qml)

. xtcombreak estimate invest, method(gls)

Compare the CI efficiency of LS and QML

. quietly xtcombreak estimate invest, method(ls) level(90)

. scalar A = r(AN)

. quietly xtcombreak estimate invest, method(qml) level(90)

. scalar B = r(BN)

. display "B_N/A_N = " B/A " (>= 1 always, = 1 iff homoskedastic)"

Replicate Bai's own Monte Carlo formula

. xtcombreak estimate invest, anmethod(hom)

Which firms broke

. xtcombreak estimate invest, chow

. matrix C = r(chow)

. matrix S = r(shift)

. matlist C

Two breaks

. xtcombreak estimate invest, breaks(2) showindex

Conventional trimming, to line up with xtbreak

. xtcombreak estimate invest, trimming(0.15)

. xtbreak estimate invest, breaks(1)

Graphs

. xtcombreak estimate invest, method(qml) chow graph

. graph combine xtcb_profile xtcb_shift

Stored results

xtcombreak estimate stores the following in r():

Scalars

r(N) number of series

r(T) number of periods

r(khat) estimated break index (1..T)

r(k_breaks) number of breaks estimated

r(nties) number of k attaining the minimum

r(AN) A_N, the least-squares scale (Bai p.83)

r(BN) B_N, the QML/GLS scale (Bai p.85)

r(scale) the scale actually used for the CI

r(tau) tau, the mean-break signal (Bai p.84)

r(omega) omega, the variance-break signal

r(kappa) kappa, 4th cumulant of eta

r(mu3) mu3, 3rd moment of eta

r(piprm) pi, mean/variance-break overlap (Bai eq.19)

r(ssr) minimised objective

r(TNratio) T/N

Macros

r(cmd) xtcombreak estimate

r(method) ls, qml or gls

r(anmethod) het or hom

r(depvar) dependent variable

r(panelvar) panel variable

r(timevar) time variable

Matrices

r(breakdates) 2 x #breaks: row 1 = dates, row 2 = indices

r(ci) 1 x 4: lower date, upper date, lower index, upper index

r(ssrprofile) the objective by candidate date (2 columns)

r(shift) N x 4: id, mu_i2-mu_i1, mu_i1, mu_i2

r(chow) N x 4: id, chi2(1), p-value, sigma_i^2

r(sigma2) N x 4: id, sigma_i^2, sigma_i1^2, sigma_i2^2

Author

Dr Merwan Roudane

merwanroudane920@gmail.com

github.com/merwanroudane