Fourier ARDL Methods: Quantile, Nonlinear, Multi-Threshold & Unit Root Tests
Overview
Implementation of ARDL methods for cointegration analysis with structural breaks and asymmetric effects. Includes: (1) Fourier Quantile ARDL (FQARDL), quantile regression with Fourier approximation following the quantile ARDL of Cho, Kim and Shin (2015) doi:10.1016/j.jeconom.2015.05.003; (2) Fourier Nonlinear ARDL (FNARDL), asymmetric cointegration with partial sum decomposition following Shin, Yu and Greenwood-Nimmo (2014) doi:10.1007/978-1-4899-8008-3_9; (3) a deprecated Multi-Threshold NARDL (MTNARDL) function; (4) Fourier unit root tests, ADF and KPSS tests with Fourier terms following Enders and Lee (2012) doi:10.1016/j.econlet.2012.04.081 and Becker, Enders and Lee (2006) doi:10.1111/j.1467-9892.2006.00478.x. Features automatic lag and frequency selection, Wald bounds statistics with the tables of Pesaran, Shin and Smith (2001) doi:10.1002/jae.616 (no verdict with Fourier terms, for which the tables are not valid), recursive bootstrap bounds tests 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, Wald tests for asymmetry, multiplier computation, and visualizations.
Breaking changes
fqardl(bootstrap = TRUE)/bootstrap_bounds_test()andfnardl(bootstrap = TRUE)/bootstrap_nardl()use a new bootstrap (below). Bootstrap p-values, critical values and decisions change. Thedecisionelement of the bootstrap result is now a code ("COINTEGRATION","NO_COINTEGRATION","DEGENERATE_1","DEGENERATE_2","UNDETERMINED") with the text inlabel; failed replications areNAand counted inn_validinstead of being dropped. Thetauargument ofbootstrap_bounds_test()is no longer used.bootstrap_nardl()(internal) has new arguments: the original regressors, their names and the decomposed variables.perform_bounds_test()and the bounds test offnardl()give no analytical verdict when the regression contains Fourier terms, which is always the case forfqardl()andfnardl(); the decision now reads "No analytical verdict: the PSS bounds are for the model without Fourier terms and are not valid with Fourier terms", followed by "; use the bootstrap (bootstrap = TRUE)" whenfqardl()orfnardl()was called without the bootstrap. The per-quantiledecision_Fanddecision_tread "not available (Fourier terms)" and thedecisioncolumn ofbounds_test$summarycarries the new text. The F and t statistics are unchanged (see below for the fnardl F statistic); the PSS bounds are still returned, labelled "Bounds for the model without Fourier terms; not valid with Fourier terms", with the new elementsbounds_validandbounds_note. The evidence that the PSS (2001) bounds do not apply with Fourier terms is the Monte Carlo below, not a published result.bootstrap_bounds_test()no longer emits its "indicative only" warning; its argumentscaseandtaunow have the defaults 3 andNULL.- The fnardl and mtnardl bounds tests read the PSS table at k equal to the number of level regressors, so
cv_5andt_cv_5change whenever the old count (all_lag1terms minus one) differed, and the mtnardl verdict can change with the corrected F and bounds. orig_tof the fnardl bootstrap result keeps its namey_lag1as in 1.0.6; its value is now the OLS t statistic of the same model.- The header printed by
print()for mtnardl objects is now "Multi-Threshold NARDL Model (fqardl, deprecated)".plot()on an fqardl mtnardl object now stops with an informative error (methodplot.fqardl_mtnardl) instead of dispatching through the inherited class to the plot method of ardlverse, which failed with "argument is of length zero". mtnardl()is deprecated and will be removed in fqardl 2.0.0; useardlverse::mtnardl(). The first call in a session gives a warning that also states that the conventions differ (p in ardlverse equals p - 1 here; thresholds are a single numeric vector there, a named list here). Its results change: the bounds F statistic is corrected when the selected p or q exceeds 1 (example below), thresholds other than 0 and cases other than 3 give an error, and the object has classc("fqardl_mtnardl", "mtnardl").decompose_multi_threshold()gives an error for thresholds other than 0.
Bootstrap bounds tests (fqardl and fnardl)
- Up to 1.0.6 each replication regressed a new Gaussian random walk on the fixed observed regressors and Fourier terms (
fqardl: quantile regression at the first quantile;fnardl: OLS, t test only, without any warning), andfqardldeclared cointegration when the F or the t test rejected. This is not a bootstrap under the null of the estimated model and it was oversized (Monte Carlo below). - The pseudo-samples now come from the shared recursive bootstrap engine
R/ardl_boot_engine.R(engine version 1.1.0, copied verbatim from the package ardlverse; a test checks its version and checksum). Under each null the restricted conditional ECM and a marginal model for the differenced regressors are estimated by OLS, and y* and x* are generated recursively from resampled, recentred residuals.boot_scheme = "bvz"(default) follows Bertelli, Vacca and Zoia (2022): a separate restricted model for each statistic, marginal VECM, recentring after each draw, initial values from a random block, with the levels of the regressors and partial sums continuing from the block; the x equation has as many lags as the y equation has lagged differences of y (BVZ eq. 19).boot_scheme = "mcnown"applies the Fov null for all statistics (McNown, Sam and Goh 2018, Steps 1-8) to the conditional ECM (package choice; MSG write the y equation in unconditional form): the null of the overall F test generates the samples for all statistics, unrestricted x equation, residuals mean-centred once.
Show all changes in 1.1.0Hide the rest of the changes in 1.1.0
- The statistics are OLS statistics of the package's own design (
build_ardl_design()for fqardl,build_nardl_design()for fnardl): the overall F test on the lagged levels of y and the regressors (Fov), the t ratio on the lagged level of y (t) and the F test on the lagged levels of the regressors (Find). For fnardl the positive and negative partial sums are rebuilt from x* with the package's own decomposition (starting at zero). The Fourier terms are held fixed in the data generating process. - The Fourier frequency and the lag orders are re-selected in every replication (a package choice: Bertelli, Vacca and Zoia 2022, step 5(c), re-estimate the unrestricted model on each bootstrap sample but do not discuss re-selection) with the criteria of
select_fourier_frequency()andselect_optimal_lags()(computed withqr()for speed; a test checks that the choices are identical). The new argumentfourier_koffqardl()andfnardl()fixes the frequency in advance; it is then held fixed in the bootstrap. - Decision: AND rule. Cointegration only if Fov, t and Find all reject at 5 percent (bootstrap order-statistic critical values); Fov rejecting without t, and Fov and t rejecting without Find, are reported as the degenerate cases of the first and second type. Cointegration is never declared from a single test (no OR rule).
- The quantile ARDL of Cho, Kim and Shin (2015) has no bounds test and no bootstrap for the null of no cointegration, so no quantile-specific bootstrap statistic is computed; the quantile Wald bounds statistics of
perform_bounds_test()are descriptive. - New arguments:
fqardl(fourier_k, boot_scheme),fnardl(fourier_k, boot_scheme, seed),bootstrap_bounds_test(reselect, scheme, level, seed). Aseedgiven to the bootstrap functions is used locally and the caller's random number state is restored.fqardl(seed)still callsset.seed()at the start, as before.
Bounds statistics
fnardl(): the bounds F statistic tested every coefficient whose name ended in_lag1, so with p > 1 or q > 1 it also testeddy_lag1and the lagged differences of the regressors. It now tests only the lagged level of y and the lagged levels of the regressors, with k equal to the number of level regressors. With p = q = 1 the value is unchanged. Examples with dataset.seed(s); n <- 120; x1 <- cumsum(rnorm(n)); x2 <- cumsum(rnorm(n)); y <- 0.5 * x1 + cumsum(rnorm(n, sd = 0.5)); d <- data.frame(y, x1, x2)andfnardl(y ~ x1 + x2, d, decompose = "x1", max_k = 3, max_p = 3, max_q = 3)(selected p = 2, q = 1): s = 1, F 4.9160 becomes 6.1315; s = 2, 2.2814 becomes 2.8463; s = 42, 6.2361 becomes 7.5356. The bounds test also returnst_cv_5,Find_statandk.mtnardl(): same correction (defect F1 of the 2026-10-03 audit); with the data above, s = 2, andmtnardl(y ~ x1, d, max_p = 3, max_q = 3)(selected p = 2, q = 1), F 1.5051 becomes 1.9533; k for the PSS table is the number of level regressors (partial sums and undecomposed variables), a package choice pending verification against Shin, Yu and Greenwood-Nimmo (2014) and Pal and Mitra (2016). The decision is the F-based three-way verdict, as before.
mtnardl (deprecated)
- F2: the multi-threshold decomposition was mathematically wrong. With a nonzero threshold (0 is always added) the regime increments did not sum to the change of the variable (for example, with thresholds -2, 0 and 2 the changes -3, -1, 1, 3 and 0.5 gave regime increments summing to -5, 1, 3, 5 and 2.5; with the single threshold 2 the changes -3 and -1 gave -5 and -3). Thresholds other than 0 now give an informative error in
mtnardl()anddecompose_multi_threshold(); with threshold 0 (the default) the decomposition is the standard pair of partial sums and results other than the bounds F are unchanged. - F3:
casewas ignored in the bounds test and forced to 3 in the lag selection; cases other than 3 now give an error. - The print and summary methods are registered for class
"fqardl_mtnardl"only, so they no longer mask the methods of ardlverse for its"mtnardl"objects when both packages are loaded.
Printing
summary()of an fnardl object printed the long-run multipliers asNA(the elements ofmultipliers$long_run_positiveandlong_run_negativeare named<var>.<var>_pos_lag1and were indexed by<var>). The printout now shows the values; the stored values are unchanged.- Author names in the documentation and in the headers printed by the Fourier unit root tests are joined with "and" instead of "&"; the help page of
get_pss_critical_values()now describes the function as implemented since 1.0.4.
Monte Carlo (size at the 5 percent level)
y and x independent random walks, n = 100, 200 replications, B = 199, default calls (BIC, max_p = max_q = 4, max_k = 3); rejection rates with their Monte Carlo standard errors sqrt(r(1 - r)/200) in parentheses. Before: fqardl 1.0.6 (audit of 2026-10-03, same data seeds).
| Statistic | 1.0.6 | 1.1.0 |
|---|---|---|
| fqardl bootstrap, Fov | 0.085 (0.020) | 0.065 (0.017) |
| fqardl bootstrap, t | 0.120 (0.023) | 0.100 (0.021) |
| fqardl bootstrap, Find | not computed | 0.075 (0.019) |
| fqardl bootstrap, decision | 0.130 (0.024) (F or t) | 0.035 (0.013) (Fov and t and Find) |
| fnardl bootstrap, Fov | not computed | 0.060 (0.017) |
| fnardl bootstrap, t | 0.170 (0.027) | 0.105 (0.022) |
| fnardl bootstrap, Find | not computed | 0.100 (0.021) |
| fnardl bootstrap, decision | none | 0.030 (0.012) (Fov and t and Find) |
| fqardl analytical decision (Fourier) | 0.100 (0.021) | no verdict |
| fnardl analytical decision (Fourier) | 0.475 (0.035) | no verdict |
The table shows the run with engine 1.1.0. A run with engine 1.0.0 on the same data seeds gave identical fqardl rates and, for fnardl, Fov 0.060 (0.017), t 0.120 (0.023), Find 0.105 (0.022), decision 0.035 (0.013); an independent review run gave for fnardl a decision rate of 0.055 (0.016) and t and Find rates of 0.120 (0.023). Across these runs the combined decisions are close to the nominal level (0.030 to 0.055). The individual t tests and the fnardl Find test remain above 5 percent (0.100 to 0.120) with the frequency and lags re-selected in every replication; read them through the combined decision.
Unchanged
- QARDL point estimates, quantile standard errors and covariances, long-run and short-run multipliers, the quantile Wald bounds F and t statistics,
quantile_wald_test(), the fnardl and mtnardl coefficients, multipliers and asymmetry tests, the fnardl and mtnardl t statistics, the Fourier frequency and lag selection, and the Fourier unit root tests are identical to 1.0.6 (checked on five simulated data sets).
From NEWS.md in the release
Install
Health
- OK13 OK2026-08-05
- NOTE12 OK, 1 NOTE2026-08-01
- OK13 OK2026-06-09
- NOTE12 OK, 1 NOTE2026-06-08
- OK5 OK2026-03-18
Documentation
- Help pages
- 57 (26 internal)includes a package overview page
- Examples that run
- 33%2 run in a plain check · 4 only when donttest examples are enabled (R CMD check --as-cran)
- Exported functions with examples
- 16%
- Documented parameters
- 100%
- Return-value docs
- 100%
- Help pages citing references
- 16%
Downloads
Repository
- PRs merged (all time)
- 100%
- Median days to close, 50 most recently updated closed issues
- not measured
- Median days to close, 50 most recently updated closed PRs
- 8
Stars over time
Releases over time
Issues over time
PRs over time
Commits over time
Commit identities over time
2 development-tooling and community-health practices detected across 2 families in the upstream repository
Checks run against github.com/muhammedalkhalaf/fqardl on 2026-10-21.
The repository owner accepts GitHub Sponsors
This repository shows signs of AI coding tools.
- Claude Codefirst seen 2026-09-27Commits: at least 5 crediting it in the message
- Claude Opus 5.53 commits · Sep to Oct 2026
- Claude Fable 5.12 commits · Sep 2026
Dependencies
Code & Tests
Datasets
People & History
Pick two releases to compare their code metrics.
- 1.1.0Latest2026-10-10 · current release · diff ↗ ·
6 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. - 1.0.62026-09-30 · diff ↗
- 1.0.52026-09-28 · diff ↗
- 1.0.42026-08-23 · diff ↗
- RR 4.6.0 released · 2026-04-24
- 1.0.22026-03-17
- RR 4.5.0 released · 2025-04-11
Package metadata
- First published
- 2026-03-17
- Total releases
- 5 / 1 yrs
- License
- GPL-3 OSI
- Minimum R
- ≥ 3.5.0
- Bundled data
- 6.9 KB / 2 files
- Download size
- 94 KB
Cite
Cite this package
Run in R for the authors' preferred citation:
citation("fqardl")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-23, which the citation names so these numbers can be found later. More on citing and the projects behind them.