Interactive Fixed Effects (IFE) estimator of Bai
(2009), via model = "ife" in dcce(). Iterates
between pooled OLS and principal-component extraction of
factors/loadings until convergence. The number of factors can be
specified or selected automatically via the BIC3 criterion of Bai &
Ng (2002). Unlike CCE, IFE estimates factors and loadings directly
rather than proxying them with cross-sectional averages.
Pooled CCE (CCEP) estimator, via
model = "ccep" in dcce(). Constrains slopes to
be identical across units (precision-weighted pooled OLS with
cross-sectional averages), as proposed by Pesaran (2006) alongside the
existing CCE-MG. More efficient than CCE-MG when slopes are truly
homogeneous.
Dumitrescu-Hurlin (2012) panel Granger causality
test via the new exported function granger_test().
Reports the W-bar statistic (cross-sectional average of unit Wald
statistics), the Z-bar (large-T standardised), and the Z-bar tilde
(small-sample adjusted) statistics.
IPS and LLC panel unit root tests via
panel_ur_test(). Implements Im, Pesaran & Shin (2003)
IPS t-bar and Levin, Lin & Chu (2002) LLC common-root tests. These
do not correct for CSD (use cips_test() for that); they are
included as standard benchmarks.
Pedroni and Kao panel cointegration tests via
panel_coint_test(). Reports the Pedroni (1999, 2004)
group-mean t and group-mean rho statistics, or the Kao (1999) ADF
statistic.
Impulse response functions via the new exported
function irf(). Computes IRFs from fitted dynamic panel
models (DCCE, CS-ARDL, PMG) using the MG ARDL lag polynomial. Optional
cross-section bootstrap for confidence bands. Includes
print.dcce_irf() and plot.dcce_irf()
methods.
Half-panel jackknife bias correction (Chudik
& Pesaran 2015) via
bias_correction = "half_panel_jackknife" in
dcce(). Splits each unit’s time series in half, fits on
each half, and corrects the full-sample MG estimate: b_hpj = 2b_full
- 0.5(b_half1 + b_half2). Targets the Nickell bias in dynamic
CCE.
.github/workflows/R-CMD-check.yaml): runs
R CMD check --as-cran on Ubuntu, Windows, and macOS on
every push/PR to main._pkgdown.yml) with grouped reference index.cran-comments.md added for CRAN
submission readiness.structural_break_test(type = "unknown") now
uses the correct asymptotic distribution for the sup-Wald
statistic. The previous implementation applied a Bonferroni
correction over the candidate breakdate grid, which was wildly
over-conservative and routinely inflated borderline p-values all the way
to 1. The sup-Wald statistic has a non-standard asymptotic distribution
(supremum of a squared Brownian bridge) whose critical values were
tabulated by Andrews (1993, Econometrica 61(4), Table I).
dcce now ships those critical values as internal data and
reports p-values by interpolating on the log-scale between the tabulated
1%, 5%, and 10% levels. Values above the 1% critical value are reported
as p <= 0.01; below the 10% critical value they are
reported as p > 0.10.print.dcce_break() for unknown-date tests now displays
the full set of Andrews critical values next to the sup-Wald statistic,
and formats the p-value as a human-readable bracket (“> 0.10”, “<=
0.01”, or the interpolated value) instead of a bare number. The
known-date (Chow) path is unchanged and still uses the standard
chi-square p-value.dcce_break object now carries a
critical_values element (a named vector with
cv10, cv05, cv01) and a
trim element so downstream code and custom print methods
can access them.src/unit_ols.cpp now defines ARMA_WARN_LEVEL 0
in addition to ARMA_DONT_PRINT_ERRORS, fully suppressing
the solve(): system is singular messages that used to leak
through to the console during structural_break_test() and
near-rank-deficient CCE fits. The R-level .unit_ols()
fallback still handles rank deficiency via pinv() and
continues to log its own cli_warn diagnostics where
appropriate.test-structural-break.R covering the
Andrews critical-value lookup, p-value interpolation, and a regression
test reproducing the v0.3.1 Bonferroni blow-up (sup-Wald = 7.20, q = 3,
pi0 = 0.15) to lock in the fix.dcce_bootstrap() alias.
broom exports a function called bootstrap()
(for resampling data frames) that has a completely different signature
from dcce::bootstrap(). If broom is loaded
after dcce, the broom version masks ours on the search path
and calls of the form
bootstrap(fit, type = "crosssection", reps = 199) fail with
an “unused arguments” error. This release adds
dcce_bootstrap(), an exported alias with identical
semantics to dcce::bootstrap() but a conflict-free name.
bootstrap() itself is unchanged and still available; users
who previously wrote dcce::bootstrap(fit, ...) can keep
doing so.?bootstrap now documents the conflict and three
workarounds.dcce_rolling() for rolling-window
estimation. Fits a sequence of dcce() models on
overlapping time windows and returns a dcce_rolling object
containing the full list of fits and a tidy tibble of coefficients
indexed by window end-date. Includes print.dcce_rolling()
and a plot.dcce_rolling() method that draws one
coefficient-path panel per regressor with a 95% confidence ribbon.
Useful for detecting parameter drift and regime shifts in long
panels.
absorb argument for high-dimensional fixed
effects. A new argument to dcce() that accepts a
one-sided formula (or character vector) naming grouping factors to
project out of and before the main unit loop runs. A single factor uses
the within transformation; multiple factors use the alternating
projections of Guimaraes & Portugal (2010) / Correia (2016). The
unit fixed effects of CCE estimators are still kept via unit intercepts
— absorb is for additional categorical effects on
top of the cross-section (e.g. industry, region, sub-period
dummies).
Spatial CCE via the new spatial_weights
argument. When supplied with an row-normalised weight matrix,
dcce() replaces the global cross-sectional averages of
classical CCE with local, unit-specific weighted
averages . The matrix is automatically row-normalised, its diagonal is
zeroed, and rows/columns are aligned to the panel’s unit identifiers if
they are named. This enables spatial CCE estimation that respects the
topology of cross-sectional dependence (geographical contiguity, trade
links, input-output connections).
structural_break_test() for panel structural
breaks. New exported function implementing a Wald-type Chow
test at a known break date, a sup-Wald test over a trimmed candidate
window for an unknown break date, and a sequential Bai & Perron
(1998) procedure for multiple breaks. Returns a dcce_break
object with the test statistic, p-value, estimated break date(s), the
full Wald profile across candidates, and fitted dcce_fit
objects for the pre- and post-break regimes. Works with any base
estimator supported by dcce(). References: Andrews (1993);
Bai & Perron (1998); Ditzen, Karavias & Westerlund (2024). This
closes the gap with Stata’s xtbreak package.
R/rolling.R, R/absorb.R,
R/spatial_cce.R, and
R/structural_break.R.ARMA_DONT_PRINT_ERRORS to
src/unit_ols.cpp to silence Armadillo diagnostics on
near-singular XtX matrices. The R-level
.unit_ols() fallback still handles rank deficiency via
pinv().RcppArmadillo C++ inner OLS loop for the
unit-level estimator. The pure-R .unit_ols() is retained as
an automatic fallback, and the new fast = TRUE argument to
dcce() controls which path is used. Pure-R and C++ paths
are numerically identical to well under the 1e-6 tolerance
on all bundled tests. Compilation requires the standard R toolchain
(Rtools on Windows, Xcode command-line tools on macOS).
Parallel unit-level estimation via the new
n_cores argument to dcce(). When
n_cores > 1L on Unix/macOS, the unit loop is dispatched
to parallel::mclapply(); on Windows the argument is
silently ignored.
Augmented Mean Group (AMG) estimator (Eberhardt
& Teal 2010; Bond & Eberhardt 2013), available as
model = "amg" in dcce(). The estimator
extracts a Common Dynamic Process (CDP) from a pooled first-difference
regression with time dummies, cumulates it within each unit, and adds
the level-form CDP as a nuisance regressor in the unit-level OLS. The
CDP is stored on the fit object as fit$cdp.
Westerlund (2007) panel cointegration tests
exposed via the new exported function cointegration_test().
Supports all four statistics from Westerlund (2007): Gt, Ga, Pt, Pa.
Asymptotic p-values use the Westerlund (2007) Table 3 critical values; a
cross-sectional bootstrap path (n_bootstrap > 0) is also
provided for dependence-robust inference. Returns a
dcce_cointegration object with a dedicated print
method.
dcce_workflow() diagnostic pipeline
that runs the recommended pre-estimation sequence and returns a
structured report plus a printable recommended dcce() call.
Steps include the panel summary, CIPS unit root tests on each variable,
a pooled CD test, (conditionally) the Westerlund cointegration test, the
rank condition classifier, and IC-based CSA lag selection. Returns a
dcce_workflow object.
marginaleffects compatibility. S3
methods on the internal marginaleffects generics
(get_coef, get_vcov, get_predict,
find_predictors, find_response) are registered
dynamically in .onLoad() when the
marginaleffects package is available, enabling
avg_slopes(), avg_predictions(), and
hypotheses() on dcce_fit objects.
marginaleffects is in Suggests only, so the
integration is a zero-cost soft dependency.
predict.dcce_fit() now supports
newdata. When a new data frame is supplied,
predictions are computed using the Mean Group coefficients on the
structural regressors.
src/unit_ols.cpp with RcppArmadillo
implementations of unit_ols_cpp() and
batch_ols_cpp().src/Makevars and src/Makevars.win
linking to R’s LAPACK_LIBS, BLAS_LIBS, and
FLIBS.Rcpp (>= 1.0.0) to Imports; added
Rcpp and RcppArmadillo to
LinkingTo.marginaleffects and parallel to
Suggests..run_unit_loop() dispatcher in
R/est_mg.R..onLoad() hook in R/zzz.R for
dynamic method registration.