*! version 1.5.9 06aug2026 Ozan Eruygur

Title

lumpapell -- Lumsdaine-Papell unit root test allowing for two unknown breaks

Syntax

lumpapell varname [if] [in] [, options]

break(type) break specification: intercept (default), trend, both, or ca

method(type) lag selection: input (default), aic, bic, hq, or ttest

lags(#) number of augmenting lags with method(input), or the maximum to consider otherwise

maxlags(#) same role as lags(); lags() takes precedence if both are given

signif(#) cutoff significance level for method(ttest); default is signif(0.10)

pi(#) trimming fraction and minimum gap between breaks; default is pi(0.15)

cv(source) critical values: rats (default) or paper

tcrit(#) fixed cutoff for the last-lag |t| in method(ttest)

paper article mode: grid, per-combination lag selection, and critical values of Lumsdaine and Papell (1997)

graph graph the series with vertical lines at the estimated break dates

noprint suppress the report

title(string) title for the report

The data must be tsset as a single time series without gaps in the estimation window;
panel data are not allowed.

Description

lumpapell implements the unit root test of Lumsdaine and Papell (1997), which extends
the endogenous single-break methodology of Zivot and Andrews (1992) to an alternative
hypothesis with two structural breaks at unknown dates. Four break specifications are
available; the first three are named as in the article. Model AA lets both breaks shift
the intercept:

dy(t) = mu + beta*t + theta1*DU1(t) + theta2*DU2(t) + alpha*y(t-1) + c(1)*dy(t-1) + ... + c(k)*dy(t-k) + e(t)

Model CC lets each break shift both the intercept and the slope:

dy(t) = mu + beta*t + theta1*DU1(t) + gamma1*DT1(t) + theta2*DU2(t) + gamma2*DT2(t) + alpha*y(t-1) + c(1)*dy(t-1) + ... + c(k)*dy(t-k) + e(t)

Model CA is the mixed case: the first break shifts the intercept and the slope, the
second shifts the intercept only:

dy(t) = mu + beta*t + theta1*DU1(t) + gamma1*DT1(t) + theta2*DU2(t) + alpha*y(t-1) + c(1)*dy(t-1) + ... + c(k)*dy(t-k) + e(t)

Finally, the break(trend) specification, which the article does not consider, lets
each break shift the slope only:

dy(t) = mu + beta*t + gamma1*DT1(t) + gamma2*DT2(t) + alpha*y(t-1) + c(1)*dy(t-1) + ... + c(k)*dy(t-k) + e(t)

where, for a break date TB, the intercept shift dummy is DU(t) = 1 if t > TB and the trend
shift dummy is DT(t) = (t - TB) if t > TB and 0 otherwise. A reported break date TB is thus
the last period of the old regime; the shift takes effect in the period after TB (in the
article's application, TB = 1929 for the Great Crash means the level shift begins in 1930).
The null hypothesis is a unit root, alpha = 0, with no breaks; as the article notes, breaks
are permitted under the alternative only. The break dates are chosen by estimating the
regression at every admissible combination of break dates and minimizing the t statistic on
alpha; the reported test statistic is that minimized t statistic.

With zero breaks the test is the standard augmented Dickey-Fuller test, and with one
break it is the Zivot-Andrews (1992) test; the zero- and one-break cases are therefore
not offered separately in the command syntax. The Lumsdaine-Papell test of the article
is the two-break case, and lumpapell implements exactly that.

What the command does, step by step.

Step 1, sample and model. The usable range of the series and its first lag is
determined and the first difference dy is built. The estimated regression is equation (1)
of Lumsdaine and Papell (1997): dy(t) on y(t-1), the break dummies, a constant, a linear
trend, and k lagged differences. break() chooses the model: AA, CA, or CC in the
article's notation.
Following footnote 2 of the article, no breaks are permitted under the unit-root null;
they enter only under the alternative.

Step 2, maximum lag. The upper bound kmax is taken from lags() or
maxlags(); if neither is given it is trunc(T^0.25). The
article fixes kmax = 8 for every series and, following footnote 8, does not raise the
bound when the selected lag equals it; this implementation behaves the same way.

Step 3, candidate break dates. By default candidates are at
least trunc(pi*T') observations from the sample ends and from each other, with T' the
usable length. In the article mode the article's grid is built instead: candidate dates
run from the second observation of the series to the next-to-last one, matching the
article's search over break fractions from 2/T to (T-1)/T, and the only separation
requirement is that the two dates not be consecutive. For model CA the pairs are
enumerated in both time orders, since the article's table 4 reports TB1 after TB2 for
several series.

Step 4, lag selection. By default the number of lags is selected once, on the base
model without break dummies, over the fixed sample that kmax allows. In the article mode
the selection is repeated for every candidate
break combination with the break dummies included, following the practice of Zivot and
Andrews (1992): starting at kmax, the general-to-specific rule of Perron (1989) keeps the
first k whose last included lag satisfies |t| >= 1.60 (the article's cutoff, adjustable
via tcrit()), and sets k = 0 if none does. The k columns of the article's tables 2
to 4 differ across models for the same series, which identifies the selection as
per-combination.

Step 5, estimation and minimization. At every admissible break combination the
regression is estimated with the selected k and the t statistic on y(t-1) is recorded.
The test statistic is the minimum of these t statistics over the whole grid, and the
estimated break dates are the minimizers; ties keep the first combination encountered.
Combinations whose regressors are collinear on the available sample are inadmissible and
skipped.

Step 6, inference. The minimized t statistic is compared with the critical values:
the default table, or with cv(paper) the article's finite-sample values,
simulated under the null with T = 125, 500 replications, and endogenous lag selection,
including the 2.5 percent level. One star marks rejection at the 5 percent level, two
stars at the 1 percent level.

Step 7, report, dummies, and stored results. The default report shows the settings,
the test statistic against the critical values with a rejection verdict per level, the
break dates with their observation numbers, and the break regression. In addition the
command writes the break dummies, the trend variable, and nothing else to the dataset
under the lumpapell_ prefix (lumpapell_du1, lumpapell_dt1, ..., and
lumpapell_trend), and prints below the regression a plain regress command
that reproduces the break regression from those variables; the same command string is
stored in r(regcmd). Every reported quantity is stored in r() as listed
below.

Options

break(type) selects which deterministic components break at the two break dates, and
thereby the model in the nomenclature of the article. break(intercept) is model AA,
both breaks in the intercept only. break(both) is model CC, both breaks in the
intercept and the slope. break(ca) is the mixed model CA: the first
break date shifts the intercept and the slope, the second shifts the intercept only. Model CA
requires the paper option; the two dates of model CA are not restricted to be in chronological order, and the
reported TB1 is the intercept-and-slope break wherever it falls in time, as in table 4 of
the article. break(trend) is a trend-only specification the article does not consider. The default is intercept.

method(type) selects how the number of augmenting lags k is determined. With
input (the default) the number given by lags() or maxlags() is used as
is. With aic, bic, or hq the criterion-minimizing lag between 0 and the
maximum is chosen. With ttest (general-to-specific) the
procedure of Perron (1989) followed by the article is used: start at the maximum lag and
prune downward until the last included lag is significant; if no lag is significant, k = 0.
By default the significance of the last lag is judged by its exact two-sided Student t
p-value against signif(); the article instead used the
approximate 10 percent value of the asymptotic normal distribution, 1.60, as the cutoff,
which is available through tcrit() and is the default in the article mode.

lags(#) and maxlags(#) give the number of lags (method(input)) or the
maximum number of lags to consider (other methods). If neither is given, the maximum is
trunc(T^0.25), with T the number of usable observations of the series and one lag. The
article sets the maximum to 8 and, following Perron (1989) and Zivot and Andrews (1992),
does not increase the upper bound when the selected lag equals the maximum; this
implementation behaves the same way.

signif(#) is the two-sided significance cutoff for method(ttest). The default
is 0.10, the level used in the article. It is ignored when tcrit() is active.

pi(#) sets the fraction of the sample excluded at each end as break candidates and
the minimum gap between breaks, converted to an observation count by truncation. The
default is 0.15. This option has no effect on the grid in the article mode.

cv(source) chooses the critical value table. rats (the default without
paper) uses the critical value table of the procedure lpunit.src. paper uses
the finite-sample critical values of Lumsdaine and Papell (1997), simulated under the
null with 125 observations, 500 replications, and endogenous lag selection, and including
the 2.5 percent level; these are available for break(intercept), break(ca),
and break(both). The paper option sets cv(paper) by default. There are
no cv(rats) values for model CA, so break(ca) always uses cv(paper).

tcrit(#) makes method(ttest) keep the first lag length
whose last included lag satisfies |t| >= #, instead of applying the p-value cutoff of
signif(). The article uses 1.60, following Perron (1989); the paper option
therefore sets tcrit(1.60) by default when method(ttest) is chosen.

paper switches on the article mode of Lumsdaine and Papell (1997): the article's
break grid, per-combination lag selection with the 1.60 cutoff, the article's
finite-sample critical values, and model CA. The default behavior is completely unchanged
when this option is not given.

graph draws a time-series plot of the series with vertical lines at the estimated
break dates. The graph is produced even under noprint.

noprint suppresses the report; all results remain available in r().

title(string) replaces the default report title.

Examples

The examples below use the quarterly Canadian data and, for the article mode, the extended
Nelson-Plosser annual data as distributed in the R package urca, truncated at 1970 so that
every series ends where the article's samples end.

Setup

. use https://eruygurakademi.com/datasets/lumpapell/Canada.dta, clear

Two breaks in the intercept (model AA form), fixed lag length of 2

. lumpapell prod, lags(2)

Model CC form: two breaks in intercept and trend, lags chosen by AIC from at most 8

. lumpapell prod, break(both) method(aic) maxlags(8)

Breaks in the slope only

. lumpapell prod, break(trend) method(bic) maxlags(8)

Model AA with ttest lag selection

. lumpapell prod, break(intercept) method(ttest) maxlags(8) signif(0.10)

Hannan-Quinn lag selection, and a stricter pruning level

. lumpapell prod, break(both) method(hq) maxlags(8)

. lumpapell prod, break(both) method(ttest) maxlags(8) signif(0.05)

Wider break grid through a smaller trimming fraction

. lumpapell prod, break(both) method(aic) maxlags(8) pi(0.10)

Restricting the estimation range and skipping observations

. lumpapell prod in 5/80, break(both) method(aic) maxlags(8)

. lumpapell prod if qdate<=tq(1998q4), break(both) method(aic) maxlags(8)

Graph and a custom title

. lumpapell prod, break(both) method(aic) maxlags(8) graph title("Canadian productivity")

Suppressing the report and reading the stored results

. lumpapell prod, break(both) method(aic) maxlags(8) noprint

. display %12.6f r(cdstat)

. display %tq r(break1)

. display %tq r(break2)

Article mode. The following commands run the three specifications of Lumsdaine and
Papell (1997) for real GNP on the Nelson-Plosser data: model AA (table 2), model CC
(table 3), and model CA (table 4).

. use https://eruygurakademi.com/datasets/lumpapell/np.dta, clear

. lumpapell realgnp, break(intercept) method(ttest) maxlags(8) paper

. lumpapell realgnp, break(both) method(ttest) maxlags(8) paper

. lumpapell realgnp, break(ca) method(ttest) maxlags(8) paper

Article mode combined with cv(rats)

. lumpapell realgnp, break(intercept) method(ttest) maxlags(8) paper cv(rats)

Replication with WinRATS. The default mode of lumpapell is a port of the RATS
procedure lpunit.src, option for option, and the two programs print identical results. In
the WinRATS output the lumpapell test statistic is the t statistic printed on the Y{1}
row, that is, the coefficient on y(-1); the default report of lumpapell prints the
same number on the t(alpha) line.

To run the WinRATS side, create a folder c:\lumpapell_test and download the
following two files into it:

https://eruygurakademi.com/datasets/lumpapell/canada_prod.txt

https://eruygurakademi.com/datasets/lumpapell/lpunit.src

First pair: breaks in intercept and trend, AIC lag selection. In Stata:

. use https://eruygurakademi.com/datasets/lumpapell/Canada.dta, clear

. lumpapell prod, break(both) method(aic) maxlags(8)

and in WinRATS:

cal(q) 1980:1

allocate 2000:4

open data c:\lumpapell_test\canada_prod.txt

data(format=free,org=columns) 1980:1 2000:4 prod

source c:\lumpapell_test\lpunit.src

@lpunit(break=both,method=aic,maxlags=8) prod

Second pair: intercept breaks, general-to-specific lag selection. In Stata:

. lumpapell prod, break(intercept) method(ttest) maxlags(8) signif(0.10)

and in WinRATS, after the same data and source lines:

@lpunit(break=intercept,method=ttest,maxlags=8,signif=0.10) prod

Stored results

lumpapell stores the following in r():

Scalars

r(cdstat) test statistic (minimized t on y(t-1))

r(N) number of observations in the reported regression

r(autop) number of augmenting lags in the reported regression

r(lags) same as r(autop)

r(maxlag) maximum number of lags considered

r(pinobs) trimming window of the break grid in observations

r(pi) trimming fraction

r(signif) significance cutoff for t-test pruning

r(cv1) 1 percent critical value

r(cv25) 2.5 percent critical value, when cv(paper)

r(cv5) 5 percent critical value

r(cv10) 10 percent critical value

r(tcrit) last-lag |t| cutoff, when tcrit() is active

r(minent) first reported break date as a time value

r(maxent) second reported break date as a time value

r(break1), r(break2), ... break dates as time values

Macros

r(cmd) lumpapell

r(varname) name of the tested series

r(break) break specification

r(method) lag selection method

r(mode) rats or paper

r(cvsource) source of the critical values

r(regcmd) regress command reproducing the break regression

r(breakdates) formatted break dates

r(tsfmt) time variable display format

Matrices

r(b) coefficient row vector, in the order Y1, break dummies, Constant, Trend, lags

r(t) t statistics, same order

r(breaks) break dates as time values, 1 x 2

References

Doan, T. 2017. lpunit.src: RATS procedure for the Lumsdaine-Papell unit root test,
revision 05/2017. Evanston, IL: Estima.

Lumsdaine, R. L., and D. H. Papell. 1997. Multiple trend breaks and the unit-root
hypothesis. Review of Economics and Statistics 79: 212-218.

Nelson, C. R., and C. I. Plosser. 1982. Trends and random walks in macroeconomic time
series: Some evidence and implications. Journal of Monetary Economics 10: 139-162.

Perron, P. 1989. The great crash, the oil price shock, and the unit root hypothesis.
Econometrica 57: 1361-1401.

Zivot, E., and D. W. K. Andrews. 1992. Further evidence on the great crash, the
oil-price shock, and the unit-root hypothesis.
Journal of Business and Economic Statistics 10: 251-270.

Author

H. Ozan Eruygur

AHBV University, Ankara, Turkiye.

Department of Economics

https://www.ozaneruygur.com

eruygur@gmail.com

Eruygur Academy and Consulting (Eruygur Akademi ve Danismanlik), Ankara, Turkiye.

https://www.eruygurakademi.com

eruygurakademi@gmail.com

This command is a faithful Stata/Mata port of the RATS procedure lpunit.src
(revision 05/2017) by Tom Doan, Estima, extended with an article mode
implementing the two-break models of Lumsdaine and Papell (1997), including
model CA.

lumpapell v1.5.9 - August 2026

Please cite as:

Eruygur, H. O. 2026. lumpapell: Lumsdaine-Papell unit root test with
structural breaks. Stata package version 1.5.9. Available from:
https://www.eruygurakademi.com