Comprehensive ARDL: Panel, Bootstrap and Fourier Methods
Overview
A unified framework for Autoregressive Distributed Lag (ARDL) modeling and cointegration analysis. Implements Panel ARDL with Pooled Mean Group (PMG), Mean Group (MG), and Dynamic Fixed Effects (DFE) estimators following Pesaran, Shin and Smith (1999) doi:10.1080/01621459.1999.10474156. Provides the bounds test of Pesaran, Shin and Smith (2001) doi:10.1002/jae.616 with the critical values of Kripfganz and Schneider (2020) doi:10.1111/obes.12377 and with recursive bootstrap critical values following Bertelli, Vacca and Zoia (2022) doi:10.1016/j.econmod.2022.105987 and McNown, Sam and Goh (2018) doi:10.1080/00036846.2017.1366643. Includes Quantile Nonlinear ARDL (QNARDL) combining distributional and asymmetric effects based on Shin, Yu and Greenwood-Nimmo (2014) doi:10.1007/978-1-4899-8008-3_9, Fourier ARDL for modeling smooth structural breaks following Enders and Lee (2012) doi:10.1016/j.econlet.2012.04.081, and Fourier (bootstrap) nonlinear ARDL. Features include Augmented ARDL (AARDL) with deferred t and F tests, Multiple-Threshold NARDL for complex asymmetries, Rolling/Recursive ARDL for time-varying relationships, and Panel NARDL for nonlinear panel cointegration. All methods include comprehensive diagnostics, publication-ready outputs, and visualization tools.
Monte Carlo rates below: y and x independent random walks, n = 100, 200 samples, B = 199, nominal level 5%; Monte Carlo standard errors in parentheses.
Breaking changes
boot_ardl(): the bootstrap is now recursive and its default follows Bertelli, Vacca and Zoia (2022, Section 3): one restricted model per statistic (Fov, t, Find), y* and x* generated observation by observation (x* from the marginal model of the differenced regressors with p - 1 lags, BVZ eq. 19), residuals recentred after each draw and a random block of initial values.nulls = "joint"uses the null of the Fov test for all statistics (McNown, Sam and Goh, 2018, Steps 1-8) applied to the conditional ECM, a package choice (MSG write the y equation without the contemporaneous differences). The 2.0.3 bootstrap regenerated only the dependent variable and kept the lagged levels and differences of the data fixed, with one null for F and t; it rejected in 29.0% (3.2%) (F) and 53.0% (3.5%) (t) of the samples. The new bootstrap rejects in 4.5% (1.5%) (Fov), 7.5% (1.9%) (t) and 10.0% (2.1%) (Find); withnulls = "joint"7.0% (1.8%), 8.0% (1.9%) and 8.5% (2.0%). All bootstrap p-values and critical values change.boot_ardl(): the conclusion was "cointegration" when F OR t was significant. Cointegration is now concluded only when Fov, t and Find all reject; Fov rejecting without t is reported as the degenerate case of the first type, Fov and t rejecting without Find as the degenerate case of the second type. The new fielddecisionholds the code ("COINTEGRATION","NO_COINTEGRATION","DEGENERATE_1","DEGENERATE_2","UNDETERMINED"). The rate of a "cointegration" conclusion under the null fell from 57.5% (3.5%) to 3.0% (1.2%).boot_ardl(): new statisticFind_stat(F test on the lagged regressors) withboot_Find,cv_Find,p_value_Find. Critical values are order statistics of the bootstrap distribution (BVZ eqs. 24-25) at 10%, 5%, 2.5% and 1% (names"90%","95%","97.5%","99%"for the F tests,"10%","5%","2.5%","1%"for t) instead ofquantile().parallelandncoresare deprecated and ignored.boot_ardl(p = 0)now gives an error. In 2.0.3 it ran and gave the same model and F statistic asp = 1(an ARDL(0, q) has no lagged level of y, so the bounds test is not defined);pmust be at least 1.aardl(), types"bootstrap","bnardl","fbootstrap"and"fbnardl": same recursive bootstrap (new argumentnulls); the partial sums are rebuilt from x* with the same decomposition as the data and the Fourier terms atfourier_kare held fixed. The 2.0.3 bootstrap kept the design fixed, used one null and did not recentre the residuals; its rejection rates were 32.0% (3.3%) to 86.0% (2.5%) (F), 50.5% (3.5%) to 97.5% (1.1%) (t) and 18.0% (2.7%) to 49.5% (3.5%) (F_ind). New rates: F 4.0% (1.4%) to 9.0% (2.0%), t 6.5% (1.7%) to 12.0% (2.3%), F_ind 6.5% (1.7%) to 16.0% (2.6%), and 2.0% (1.0%) to 6.0% (1.7%) for a "cointegration" decision (14.5% (2.5%) to 47.0% (3.5%) in 2.0.3). F_ind over-rejects with Fourier terms and partial sums (type"fbnardl": 16.0% (2.6%); an independent review Monte Carlo gave 11.3% (1.8%)). The decision codes are those ofboot_ardl()(the former"INCONCLUSIVE"for F and t significant without F_ind is now"DEGENERATE_2"), and the bootstrap distributions keep failed replications asNA.aardl(), types"fourier"and"fnardl": the bounds decision with Fourier terms is removed (no valid bounds exist for the bounds test with Fourier terms; under the null its rejection rate was 22.5% (3.0%) and 28.5% (3.2%)). The decision is now"NOT_AVAILABLE", and the bounds shown are labelled as bounds for the model without Fourier terms, not valid with Fourier terms, consistent withfourier_bounds_test(); the short-run count of these bounds no longer includes the Fourier terms.mtnardl(): the dynamic multipliers were wrong (the level coefficient was used as a short-run coefficient and the lagged dynamics were ignored; for example regime 2 at horizon 0 gave 0.090 instead of 0.303). They are now computed by the full recursion of the estimated ECM, equal to the simulated response of the level of y to a permanent unit increase in each partial sum, for horizons 0 tohorizon(new argument, default 30;multipliers$cumulativenow hashorizon + 1rows andmultipliers$horizonsstarts at 0).mtnardl(): coefficient names changed. The coefficients were named after the design matrix (designy_lag,designd.<y>.l1, and the differenced partial sums had no names); they are nowy_lag, the regime names,dy_l1, ... andd_<regime>_l<i>for the differenced partial sums, with the same names invcov().mtnardl(): the bounds used k = number of original regressors. The default is now k = number of level regressors (partial sums plus linear regressors), withbounds_k = "original"for the former choice; this is a package choice pending verification against Pal and Mitra (2016) and Shin, Yu and Greenwood-Nimmo (2014). The asymptotic decision now requires both the F and the t statistic beyond their I(1) bounds (it used F only).mtnardl(bootstrap = TRUE): the recursive bootstrap replaces the fixed-design bootstrap (rejection rates 46.0% (3.5%) for F and 73.0% (3.1%) for t in 2.0.3; now 3.5% (1.3%), 7.0% (1.8%) and 9.5% (2.1%) for Fov, t and Find), the Find statistic is added (Find_stat) and the decision requires Fov, t and Find.
Show all changes in 2.1.0Hide the rest of the changes in 2.1.0
mtnardl(auto_select = TRUE, n_thresholds = 1)always returned 0 because the internal call failed silently; it now returns the threshold that minimises the AIC over 0 and the deciles of the changes.mtnardl():asymmetry_tests[[v]]gains an elementjoint(Wald test of equal level coefficients across all regimes, chi-squared with R - 1 degrees of freedom) and every test a fielddf.boot_ardl(),aardl()andmtnardl()usedall.vars()on the formula, which silently turnedlog(y) ~ log(x)intoy ~ x; transformed terms and interactions now give an informative error. Missing values give an error instead of being dropped (dropping rows closed gaps in the series).boot_ardl(),aardl()andmtnardl()calledset.seed()on the session's generator; the seed is now used locally and the caller's random number state is restored.
New features
- New exported function
fbnardl(): Fourier (bootstrap) nonlinear ARDL with positive and negative partial sums, selection of the Fourier frequency (integer frequencies chosen by minimum SSR as in Enders and Lee (2012, Oxford Bulletin of Economics and Statistics) by default, or a fractional grid) and of the lags by AIC or BIC on a common sample, Kripfganz and Schneider (2020) bounds without Fourier terms, recursive bootstrap with the frequency and lags selected again on every bootstrap sample (package choice; BVZ step 5(c) re-estimates the unrestricted model but does not discuss re-selection; or fixed withkstarandlags), delta-method long-run coefficients and symmetry test, a short-run symmetry test on the sum over lags, cumulative dynamic multipliers by full recursion with parametric bands, and diagnostics. Withbootstrap = "bvz"the default x model is the marginal model of BVZ eqs. 19-20 (xdgp = "vecm");xdgp = "rw"regresses the differences on the intercept, Fourier terms andexogonly (a package choice).bootstrap = "mcnown"uses the Fov null for all statistics applied to the conditional ECM (package choice). The R code is a port written for this package, following the Stata module fbnardl; it corrects the long-run Wald gradient (13.36 instead of 631.90 in the reference example), the fixed-design bootstrap, the hard-coded asymptotic case III bounds, the use of bounds with Fourier terms, the lag selection on different samples, the multipliers without lagged short-run terms (0.928 instead of 0.986 at horizon 1 in the reference example), and the storage of failed replications as 0 found in the stand-alone version 1.0.2. Rejection rates with the frequency and lags selected again in each bootstrap sample (package choice; BVZ step 5(c) re-estimates the unrestricted model but does not discuss re-selection): 7.0% (1.8%) (Fov), 11.5% (2.3%) (t), 11.5% (2.3%) (Find), 3.5% (1.3%) for a "cointegration" decision (stand-alone 1.0.2: 98.5% (0.9%), 99.0% (0.7%), 67.5% (3.3%)). mtnardl(): long-run coefficients with delta-method standard errors computed with the full covariance matrix (long_run_table), delta-method differences of the long-run coefficients between regimes (lr_differences), the Find statistic,decompose(a subset of regressors to decompose; the others enter linearly) andthreshold_type = "quantile"(thresholds given as probabilities and converted to quantiles of the changes of each variable), which give a migration path fromfqardl::mtnardl().- New internal file
R/ardl_boot_engine.R(engine version 1.1.0): the recursive bootstrap engine shared by all bootstrap tests, with a reproduction check (the recursion with the original residuals reproduces the data), a design check (the bootstrap model equals the estimated model), failed replications stored asNAwith a warning and counts, order-statistic critical values and the combined decision. With a random block of initial values the partial sums continue the data's levels in the block, so the generating model is the estimated restricted model. The x equation has p lags of the differences when the y equation has p lagged differences of y (BVZ eq. 19). The argumentj0 = 1gives the unconditional y equation of MSG eq. 12 (no contemporaneous differences). Recentring once (MSG eq. 13) subtracts the residual mean: eq. 13 divides the sum of the residuals by n - q - 1, the number of residuals of their ARDL(1,1) model, and applies no rescaling factor.
Other changes
- DESCRIPTION: "bootstrap-based bounds testing per Pesaran, Shin and Smith (2001)" replaced by a description of the bounds test with Kripfganz and Schneider (2020) critical values and recursive bootstrap critical values (Bertelli, Vacca and Zoia, 2022; McNown, Sam and Goh, 2018).
boot_ardl()documentation: it no longer claims to follow McNown, Sam and Goh (2018) for a scheme that differed from it, documents thatF_overallequalsF_stat, and documents the decision rule.aardl()documentation no longer attributes its bootstrap to McNown, Sam and Goh (2018) and Sam, McNown and Goh (2019).- The start-up message showed version 1.0.0; it now shows the installed version.
- Examples run with small numbers of bootstrap replications.
- Tests: statistics against independent
lm()/anova()computations, bootstrap draws against an independent recursion (BVZ with partial sums and a random block; MSG joint null), and size Monte Carlo tests (skipped on CRAN) forboot_ardl(),aardl(),mtnardl()andfbnardl().
Pending verification
The following papers were not available for this release; the choices below are documented as package choices:
- Pal and Mitra (2016) and Shin, Yu and Greenwood-Nimmo (2014): k in the bounds of
mtnardl(), regime formation, multiplier definition and sign convention for negative partial sums, the short-run symmetry test on the sum over lags infbnardl(). - Yilanci, Bozoklu and Gorus (2020) and Omay (2015): the fractional frequency grid of
fbnardl()and its validity; the default is the integer grid. - Sam, McNown and Goh (2019): bootstrap details of the augmented ARDL test in
aardl().
From NEWS.md in the release
Install
Health
- OK13 OK2026-08-05
- NOTE12 OK, 1 NOTE2026-08-01
- OK7 OK2026-03-12
Documentation
- Help pages
- 79 (51 internal)includes a package overview page
- Examples that run
- 43%9 run in a plain check · 10 only when donttest examples are enabled (R CMD check --as-cran) · 2 never run
- Exported functions with examples
- 94%
- Documented parameters
- 99%
- Return-value docs
- 100%
- Help pages citing references
- 16%
Downloads
Repository
Stars over time
Forks over time
Releases over time
Issues over time
PRs over time
Commits over time
Commit identities over time
3 development-tooling and community-health practices detected across 3 families in the upstream repository
Checks run against github.com/muhammedalkhalaf/ardlverse on 2026-10-22.
The repository owner accepts GitHub Sponsors
This repository shows signs of AI coding tools.
- Claude Codefirst seen 2026-09-27Commits: at least 7 crediting it in the message
- Claude Opus 5.54 commits · Sep to Oct 2026
- Claude Fable 5.13 commits · Sep 2026
Dependencies
Code & Tests
Datasets
People & History
Pick two releases to compare their code metrics.
- 2.1.0Latest2026-10-10 · current release · diff ↗ ··
added 1 export
fbnardl6 days in CRAN's queue
Listed in CRAN's incoming queue from 2026-10-03 21:57 to 2026-10-10 03:36 UTC, in 28 readings. - 2.0.32026-09-30 · diff ↗
- 2.0.22026-09-28 · diff ↗
- 2.0.02026-06-29 · diff ↗
- RR 4.6.0 released · 2026-04-24
- 1.1.32026-03-14 · diff ↗
- 1.1.22026-03-11
- RR 4.5.0 released · 2025-04-11
Package metadata
- First published
- 2026-03-11
- Total releases
- 6 / 1 yrs
- License
- GPL-3 OSI
- Minimum R
- ≥ 4.0.0
- Bundled data
- 21 KB / 3 files
- Download size
- 317 KB
Cite
Cite this package
Run in R for the authors' preferred citation:
citation("ardlverse")This package has no citation file, so citation() returns this entry built from DESCRIPTION.
Cite the R Observatory
For a number measured here: a download total, a coverage figure, an archival date.
From data release v2026-10-24, which the citation names so these numbers can be found later. More on citing and the projects behind them.