--- title: "Alternative Tests: lbi_test(), ssu_test(), quantile_test()" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Alternative Tests: lbi_test(), ssu_test(), quantile_test()} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, warning = FALSE, message = FALSE, comment = "#>" ) ``` ```{r load} library(exuber) ``` ## Why not just use `radf()` The GSADF statistic in `radf()` tests against one specific alternative, an explosive AR(1) root that stays fixed. `lbi_test()`, `ssu_test()` and `quantile_test()` are standalone hypothesis tests. They do not use the recursive core of `radf()` and they do not feed into the `summary()`, `datestamp()`, `tidy()` and `autoplot()` pipeline (see `vignette("naming-and-analysis")`). Each targets a different alternative, one where GSADF-style tests can lose power. | Function | Paper | Alternative it targets | |---|---|---| | `lbi_test()` | Breitung & Diegel (2025) | A fixed explosive root, tested with the locally best invariant statistic for that alternative, so it can have more power than GSADF in exactly that case. | | `ssu_test()` | Kurozumi & Nishi (2025) | A stochastically varying explosive coefficient: the root has a random component and is not a fixed value. | | `quantile_test()` | Wu, Shi & Wu (2025) | Explosiveness in the `tau`-th conditional quantile of `y_t` given `y_{t-1}`, instead of in the conditional mean. | ## A fixed root, which `lbi_test()` detects ```{r lbi} y <- sim_psy1(n = 60, te = 1, tf = 60, c = 0.03, alpha = 0, seed = 1) # fixed rho = 1.03 throughout lbi_test(y) ``` ## A varying root, which `ssu_test()` detects and `lbi_test()` misses `ssu_test()` is designed for a root that varies stochastically over time. The `coef_noise` and `coef_a` arguments of `sim_psy1()` generate this alternative, with `rho_t = 1 + c/n + coef_a * u_t / sqrt(n)`, so the root is random and not fixed: ```{r stochastic-dgp} y <- sim_psy1(n = 150, te = 75, tf = 150, c = 3, alpha = 1, seed = 2001, coef_noise = rnorm(149), coef_a = 4) ``` ```{r ssu-vs-lbi} ssu_test(y, sig_lvl = 95) lbi_test(y) ``` On this draw `ssu_test()` detects the bubble and `lbi_test()`, which is built for a fixed root, does not. This is not a defect of `lbi_test()`. Each test is the (locally) most powerful one against its own alternative, and neither dominates the other everywhere, which is why both exist. ## Testing a quantile instead of the mean `quantile_test()` picks a quantile `tau` (or takes one from you) and tests for explosiveness there instead of in the conditional mean. This pays off with heavy-tailed innovations, where the conditional-mean regression is least reliable, so the example below drives the PSY bubble with `t(3)` shocks: ```{r quantile-test} y_t3 <- sim_psy1(n = 100, seed = 1, e = sim_innov(99, dist = "t", df = 3)) quantile_test(y_t3, nrep = 100, seed = 1) ``` By default (`tau = "optimal"`) the function searches `tau_grid` and reports the quantile with the strongest signal. The example above fixes the quantile at a specific value so that it runs faster and can be reproduced. ## Which to reach for - If you believe the explosive root is fixed and want more power than GSADF in that case, use `lbi_test()`. - If you suspect the explosive root is noisy or varies over time, use `ssu_test()`. - If you suspect explosiveness shows up in the tails of the distribution, or at a specific quantile, more than in the mean, use `quantile_test()`. - If you are unsure which alternative applies, or want the most widely used benchmark, start with the GSADF test in `radf()`.