R implementation of the Johansen cointegration test with Fourier-type smooth nonlinear deterministic trends restricted to cointegrating relations of
Kurita, T. & Shintani, M. (2025). Johansen test with Fourier-type smooth nonlinear trends in cointegrating relations. Econometric Reviews, 44(10), 1589–1616. DOI: 10.1080/07474938.2025.2530640
The package also bundles the FGLS Wald test of
Perron, P., Shintani, M. & Yabu, T. (2017, 2021). Testing for flexible nonlinear trends with an integrated or stationary noise component. OBES 79, 822–850.
used as a frequency-selection pre-step.
Author: Merwan Roudane —
merwanroudane920@gmail.comRepository: https://github.com/merwanroudane/fjohansen
A sibling Python package with identical functionality is available on PyPI.
CNR, LNR,
CNU, LNU, constant,
linear.ggplot2 figures matching the paper’s style.# Development version from GitHub
# install.packages("remotes")
remotes::install_github("merwanroudane/fjohansen", subdir = "fjohansenR")Dependencies: ggplot2, scales,
knitr (all available on CRAN). Suggested extras:
testthat, kableExtra,
patchwork.
library(fjohansen)
# 1. Synthetic JGB-style dataset (Section 6 of the paper)
data <- sample_jgb_data(T = 108)
# 2. Pick the number of Fourier frequencies (PSY 2021)
sel <- select_frequencies(data, n_max = 5, p_d = 1, sig_level = 0.10)
print(sel) # n_selected, per_series, detail
# 3. Estimate the Johansen-Fourier (CNR) model
res <- johansen_fourier(data, k = 3, n = sel$n_selected, model = "CNR")
# 4. Pretty output
print(res) # Table-3 style ASCII
summary(res) # adds beta / alpha
cat(format_trace_latex(res)) # journal-ready LaTeX
cat(format_trace_html(res)) # styled HTML
# 5. ggplot2 figures
plot(res, which = "eigenvalues")
plot(res, which = "long_run")
plot(res, which = "risk_premium")
plot(res, which = "residuals")| Code | \(Z_1\) (cointegrating space) | \(Z_2\) (unrestricted) |
|---|---|---|
CNR |
(X[t-1]', F[t,T]', 1)' |
DX-lags only |
LNR |
(X[t-1]', F[t,T]', t)' |
DX-lags + constant |
CNU |
(X[t-1]', 1)' |
DX-lags + F[t,T] |
LNU |
(X[t-1]', t)' |
DX-lags + constant + F[t,T] |
constant |
(X[t-1]', 1)' |
DX-lags only (standard Johansen) |
linear |
(X[t-1]', t)' |
DX-lags + constant (standard) |
with
F[t,T] = [sin(2*pi*t/T), cos(2*pi*t/T), ..., sin(2*pi*n*t/T), cos(2*pi*n*t/T)]'.
Main public functions:
| Function | Purpose |
|---|---|
johansen_fourier(data, k, n, model) |
Reduced-rank regression + trace test. |
select_frequencies(data, n_max, ...) |
PSY 2021 general-to-specific selection. |
psy_wald_test(y, k_freqs, p_d, ...) |
Univariate FGLS Wald test. |
jf_quantile(level, p_minus_r, n, model) |
Critical-value lookup / Gamma fallback. |
jf_p_value(stat, p_minus_r, n, model) |
Gamma-approximation p-value. |
simulate_limit_distribution(...) |
Limit-distribution sampler. |
format_trace_table / _latex / _html |
Table exports. |
plot.johansen_fourier |
ggplot2 figures: eigenvalues, long-run, risk-premium,
residuals. |
sample_jgb_data() |
JGB surrogate dataset. |
generate_f_dgp1 / _f_dgp2 / _nf_dgp1..4 |
Paper DGPs. |
@article{kurita_shintani_2025,
author = {Takamitsu Kurita and Mototsugu Shintani},
title = {Johansen test with Fourier-type smooth nonlinear trends in cointegrating relations},
journal = {Econometric Reviews},
year = {2025},
volume = {44},
number = {10},
pages = {1589--1616},
doi = {10.1080/07474938.2025.2530640}
}
@misc{roudane_fjohansenR,
author = {Merwan Roudane},
title = {fjohansen: Johansen test with Fourier-type smooth nonlinear trends (R)},
year = {2025},
url = {https://github.com/merwanroudane/fjohansen}
}MIT — © 2025 Merwan Roudane
(merwanroudane920@gmail.com).