NLPwavelet

NLPwavelet: Bayesian Non-Local Prior-Based Wavelet Analysis

CRAN
status R-CMD-check CodeFactor

performs Bayesian wavelet analysis using individual non-local priors as described in Sanyal & Ferreira (2017) and non-local prior mixtures as described in Sanyal (2025).

Installation

You can install the development version of NLPwavelet like so:

install.packages("NLPwavelet")

Install from GitHub

# install.packages("devtools")
devtools::install_github("nilotpalsanyal/NLPwavelet")

The main function:

BNLPWA is the main function of this package that performs Bayesian wavelet analysis using individual non-local priors as described in Sanyal & Ferreira (2017) and non-local prior mixtures as described in Sanyal (2025). It currently works with one-dimensional data. The usage is described below.

library(NLPwavelet)
#> 
#>  Welcome to NLPwavelet!
#>  
#>  Website: https://nilotpalsanyal.github.io/NLPwavelet/
#>  Bug report: https://github.com/nilotpalsanyal/NLPwavelet/issues

# Using the well-known Doppler function to 
# illustrate the use of the function BNLPWA

# set seed for reproducibility
set.seed(1)

# Define the doppler function
doppler <- function(x) { 
  sqrt(x * (1 - x)) * sin((2 * pi * 1.05) / (x + 0.05)) 
}

# Generate true values over a grid
n <- 512  # Number of points
x <- seq(0, 1, length.out = n)
true_signal <- doppler(x) 

# Add noise to generate data
sigma <- 0.2  # Noise level
y <- true_signal + rnorm(n, mean = 0, sd = sigma)

# BNLPWA analysis based on MOM prior using logit specification
# for the mixture probabilities and polynomial decay
# specification for the scale parameter
fit_mom <- BNLPWA(data=y, func=true_signal, r=1, wave.family=
  "DaubLeAsymm", filter.number=6, bc="periodic", method="mom", 
  mixprob_dist="logit", scale_dist="polynom")

plot(y,type="l",col="grey") # plot of data
lines(fit_mom$func.post.mean,col="blue") # plot of posterior 

# smoothed estimates
fit_mom$MSE.mean
#> [1] 0.006592428

# BNLPWA analysis using non-local prior mixtures using generalized 
# logit (Richard's) specification for the mixture probabilities and 
# double exponential decay specification for the scale parameter
fit_mixture <- BNLPWA(data=y, func=true_signal, r=1, nu=1, wave.family=
  "DaubLeAsymm", filter.number=6, bc="periodic", method="mixture", 
  mixprob_dist="genlogit", scale_dist="doubleexp")

plot(y,type="l",col="grey") # plot of data
lines(fit_mixture$func.post.mean,col="blue") # plot of posterior 

# smoothed estimates
fit_mixture$MSE.mean
#> [1] 0.006335836

# Compare with other wavelet methods
library(wavethresh)
#> Loading required package: MASS
#> WaveThresh: R wavelet software, release 4.7.2, installed
#> Copyright Guy Nason and others 1993-2022
#> Note: nlevels has been renamed to nlevelsWT
wd <- wd(y, family="DaubLeAsymm", filter.number=6, bc="periodic")  # Wavelet decomposition  

wd_thresh_universal <- threshold(wd, policy="universal", type="hard")
fit_universal <- wr(wd_thresh_universal)
MSE_universal <- mean((true_signal-fit_universal)^2)
MSE_universal
#> [1] 0.009054956

wd_thresh_sure <- threshold(wd, policy="sure", type="soft")
fit_sure <- wr(wd_thresh_sure)
MSE_sure <- mean((true_signal-fit_sure)^2)
MSE_sure
#> [1] 0.01758871

wd_thresh_BayesThresh <- threshold(wd, policy="BayesThresh", type="hard")
fit_BayesThresh <- wr(wd_thresh_BayesThresh)
MSE_BayesThresh <- mean((true_signal-fit_BayesThresh)^2)
MSE_BayesThresh
#> [1] 0.007527764

wd_thresh_cv <- threshold(wd, policy="cv", type="hard")
fit_cv <- wr(wd_thresh_cv)
MSE_cv <- mean((true_signal-fit_cv)^2)
MSE_cv
#> [1] 0.008710683

wd_thresh_fdr <- threshold(wd, policy="fdr", type="hard")
fit_fdr <- wr(wd_thresh_fdr)
MSE_fdr <- mean((true_signal-fit_fdr)^2)
MSE_fdr
#> [1] 0.007777847

# Compare with non-wavelet methods
    # Kernel smoothing
fit_ksmooth <- ksmooth(x, y, kernel="normal", bandwidth=0.05)
MSE_ksmooth <- mean((true_signal-fit_ksmooth$y)^2)
MSE_ksmooth
#> [1] 0.01518292
    # LOESS smoothing
fit_loess <- loess(y ~ x, span=0.1)  # Adjust span for more or less smoothing
MSE_loess <- mean((true_signal-predict(fit_loess))^2)
MSE_loess
#> [1] 0.01059615
    # Cubic spline smoothing
spline_fit <- smooth.spline(x, y, spar=0.5)  # Adjust spar for smoothness
MSE_spline <- mean((true_signal-spline_fit$y)^2)
MSE_spline
#> [1] 0.01083473

References:

Sanyal, Nilotpal, and Marco AR Ferreira. “Bayesian wavelet analysis using nonlocal priors with an application to FMRI analysis.” Sankhya B 79.2 (2017): 361-388. <https://doi.org/10.1007/s13571-016-0129-3>
Sanyal, Nilotpal. “Nonlocal prior mixture-based Bayesian wavelet regression.” arXiv preprint arXiv:2501.18134 (2025). <https://doi.org/10.48550/arXiv.2501.18134>