Bayesian Modelling of Raman Spectroscopy

Sequential Monte Carlo (SMC) algorithms for fitting a generalised additive mixed model (GAMM) to surface-enhanced resonance Raman spectroscopy (SERRS), using the method of Moores et al. (2016) . Multivariate observations of SERRS are highly collinear and lend themselves to a reduced-rank representation. The GAMM separates the SERRS signal into three components: a sequence of Lorentzian, Gaussian, or pseudo-Voigt peaks; a smoothly-varying baseline; and additive white noise. The parameters of each component of the model are estimated iteratively using SMC. The posterior distributions of the parameters given the observed spectra are represented as a population of weighted particles.

cranversion rstudio mirrordownloads Travis-CI BuildStatus CoverageStatus

serrsBayes provides model-based quantification of surface-enhanced resonance Raman spectroscopy (SERRS) using sequential Monte Carlo (SMC) algorithms. The details of the Bayesian model and informative priors are provided in the arXiv preprint, Moores et al. (2016; v2 2018) “Bayesian modelling and quantification of Raman spectroscopy.” Development of this software was supported by the UK Engineering & Physical Sciences Research Council (EPSRC) programme grant “In Situ Nanoparticle Assemblies for Healthcare Diagnostics and Therapy” (ref: EP/L014165/1).

Installation Instructions

Stable releases, including binary packages for Windows & Mac OS, are available from CRAN:


The current development version can be installed from GitHub:


Example Usage

To simulate a synthetic Raman spectrum with known parameters:

wavenumbers <- seq(700,1400,by=2)
spectra <- matrix(nrow=1, ncol=length(wavenumbers))
peakLocations <- c(840,  960, 1140, 1220, 1290)
peakAmplitude <- c(11500, 2500, 4000, 3000, 2500)
peakScale <- c(10, 15, 20, 10, 12)
signature <- weightedLorentzian(peakLocations, peakScale, peakAmplitude, wavenumbers)
baseline <- 1000*cos(wavenumbers/200) + 2*wavenumbers
spectra[1,] <- signature + baseline + rnorm(length(wavenumbers),0,200)
plot(wavenumbers, spectra[1,], type='l', xlab=expression(paste("Raman shift (cm"^{-1}, ")")), ylab="Intensity (a.u.)")
lines(wavenumbers, baseline, col=2, lty=4)
lines(wavenumbers, baseline + signature, col=4, lty=2, lwd=2)

Fit the model using SMC:

lPriors <- list( - (0.4^2)/2,, bl.smooth=10^11, bl.knots=50,
tm <- system.time(result <- fitSpectraSMC(wavenumbers, spectra, peakLocations, lPriors))

Sample 200 particles from the posterior distribution:

#>    user  system elapsed 
#> 217.139   2.145 220.691
samp.idx <-$weights), 200, prob=result$weights)
plot(wavenumbers, spectra[1,], type='l', xlab=expression(paste("Raman shift (cm"^{-1}, ")")), ylab="Intensity (a.u.)")
for (pt in samp.idx) {
  bl.est <- result$basis %*% result$alpha[,1,pt]
  lines(wavenumbers, bl.est, col="#C3000009")
  lines(wavenumbers, bl.est + result$expFn[pt,], col="#0000C309")


serrsBayes 0.4-0

New Features

  • OpenMP implementation of mhUpdateVoigt provides around 3x improvement in elapsed runtime
  • New vignette illustrates when to use the 3 functions fitSpectraMCMC, fitSpectraSMC, and fitVoigtPeaksSMC
  • New datasets methanol and TAMRA for use in the vignettes
  • Debug output prints the means of the amplitudes of the peaks at each SMC iteration

Bug Fixes

  • Fixed bug in fitVoigtPeaksSMC where it was using the upper-triangular instead of lower-triangular Cholesky factorisation to generate random-walk Metropolis proposals
  • Introduction vignette no longer attempts to download a .zip file over HTTPS
  • Deleted unused Rcpp function randomWalkVoigt

serrsBayes 0.3-13

  • changed maintainer email address due to new academic affiliation
  • hex sticker in README

serrsBayes 0.3-12

New Features

Bug Fixes

  • Fixed compile errors on Solaris

serrsBayes 0.3-10

  • First version released on CRAN

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.


0.5-0 by Matt Moores, 7 months ago,

Report a bug at

Browse source code at

Authors: Matt Moores [aut, cre] , Jake Carson [aut] , Benjamin Moskowitz [ctb] , Kirsten Gracie [dtc] , Karen Faulds [dtc] , Mark Girolami [aut] , Engineering and Physical Sciences Research Council [fnd] (EPSRC programme grant ref: EP/L014165/1) , University of Warwick [cph]

Documentation:   PDF Manual  

GPL (>= 2) | file LICENSE license

Imports Rcpp, methods

Depends on Matrix, truncnorm, splines

Suggests testthat, knitr, rmarkdown, Hmisc

Linking to Rcpp, RcppEigen

See at CRAN