PepsNMR 1.8.1
This document provides a brief summary on how to use the PepsNMR package. In this package, pre-processing functions transform raw FID signals from 1H NMR spectroscopy into a set of interpretable spectra.
The PepsNMR package is available on Bioconductor and can be installed via BiocManager::install
:
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("PepsNMR",
dependencies = c("Depends", "Imports", "Suggests"))
Note tha installing the Suggests
dependencies will install the PepsNMRData package to run the demo below.
The package needs to be loaded once installed to be used:
library(PepsNMR)
The package development version is available on Github (Master branch): https://github.com/ManonMartin/PepsNMR, although it is highly recommended to rely on the Bioconductor release version of the package to avoid any package version mismatch.
The first step is meant to access the raw data files. To import Free Induction Decays (FIDs) in Bruker format, use the ReadFids
function. This function will return a list with the FID data matrix (saved in Fid_data
) and metadata about these FIDs (saved in Fid_info
).
fidList <- ReadFids(file.path(path,dataset_name))
Fid_data <- fidList[["Fid_data"]]
Fid_info <- fidList[["Fid_info"]]
The possible directory structures are illustrated here:
And is to be linked with the possible options of the ReadFids
function:
subdirs = TRUE
, dirs.names = FALSE
subdirs = FALSE
, dirs.names = FALSE
subdirs = TRUE
, dirs.names = TRUE
subdirs = FALSE
, dirs.names = TRUE
Here is the recommended pre-processing workflow on the FIDs and the spectra once the raw data have been loaded in R:
Steps | Description |
---|---|
Group Delay Correction | Correct for the Bruker Group Delay. |
Solvent Suppression | Remove the solvent signal from the FIDs. |
Apodization | Increase the Signal-to-Noise ratio of the FIDs. |
ZeroFilling | Improve the visual representation of the spectra. |
Fourier Transform | Transform the FIDs into a spectrum and convert the frequency scale (Hz -> ppm). |
Zero Order Phase Correction | Correct for the zero order phase dephasing. |
Internal Referencing | Calibrate the spectra with an internal reference compound. Referencing with an internal (e.g. TMSP at 0 ppm) |
Baseline Correction | Remove the spectral baseline. |
Negative Values Zeroing | Set negatives values to 0. |
Warping | Warp the spectra according to a reference spectrum. |
Window Selection | Select the informative part of the spectrum. |
Bucketing | Data reduction. |
Region Removal | Set a desired spectral region to 0. |
Zone Aggregation | Aggregate a spectral region into a single peak. |
Normalization | Normalize the spectra. |
Information on each function is provided in R, (e.g. type ?ReadFids
in the R console) and methodological details are found in Martin et al. (2018).
Human serum (HS
) and urine (HU
) datasets are available as raw data (FIDs in Bruker format) and as (partially) pre-processed signals/spectra in the ad hoc PepsNMRData package that is automatically installed with PepsNMR (through ).
Here are examples of available datasets:
library(PepsNMRData)
str(FidData_HU)
#> cplx [1:24, 1:29411] 0+0i 0+0i 0+0i ...
#> - attr(*, "dimnames")=List of 2
#> ..$ : chr [1:24] "S1-D0-E1" "S1-D0-E2" "S1-D1-E2" "S2-D0-E2" ...
#> ..$ : chr [1:29411] "0" "5.1e-05" "0.000102" "0.000153" ...
str(FinalSpectra_HS)
#> cplx [1:32, 1:500] 0-371030i 0-362686i 0-216899i ...
#> - attr(*, "dimnames")=List of 2
#> ..$ : chr [1:32] "J1-D1-1D-T1" "J3-D2-1D-T8" "J3-D3-1D-T9" "J3-D4-1D-T14" ...
#> ..$ : chr [1:500] "9.98986984692192" "9.97027064485524" "9.95067144278856" "9.93107224072187" ...
Information for each dataset is available, (e.g. enter ?FidData_HS
in the R Console).
Raw Bruker FIDs can be loaded from where PepsNMRData has been intalled:
data_path <- system.file("extdata", package = "PepsNMRData")
dir(data_path)
#> [1] "Group_HS.csv" "HumanSerum"
To import FIDs in Bruker format, the ReadFids
function is used. This function will return a list with the FID data matrix (here saved as Fid_data
) and information about these FIDs (here saved as Fid_info
).
# ==== read the FIDs and their metadata =================
fidList <- ReadFids(file.path(data_path, "HumanSerum"))
Fid_data0 <- fidList[["Fid_data"]]
Fid_info <- fidList[["Fid_info"]]
kable(head(Fid_info))
TD | BYTORDA | DIGMOD | DECIM | DSPFVS | SW_h | SW | O1 | DTYPA | DT | |
---|---|---|---|---|---|---|---|---|---|---|
J1-D1-1D-T1 | 65536 | 1 | 1 | 16 | 12 | 10245.9 | 20.48638 | 2352.222 | 0 | 4.88e-05 |
J3-D2-1D-T8 | 65536 | 1 | 1 | 16 | 12 | 10245.9 | 20.48638 | 2352.222 | 0 | 4.88e-05 |
J3-D3-1D-T9 | 65536 | 1 | 1 | 16 | 12 | 10245.9 | 20.48638 | 2352.222 | 0 | 4.88e-05 |
J3-D4-1D-T14 | 65536 | 1 | 1 | 16 | 12 | 10245.9 | 20.48638 | 2352.222 | 0 | 4.88e-05 |
J4-D1-1D-T4 | 65536 | 1 | 1 | 16 | 12 | 10245.9 | 20.48638 | 2352.222 | 0 | 4.88e-05 |
J4-D2-1D-T7 | 65536 | 1 | 1 | 16 | 12 | 10245.9 | 20.48638 | 2352.222 | 0 | 4.88e-05 |
The Bruker’s digital filter originally produces a Group Delay that is removed during this step.
# ==== GroupDelayCorrection =================
Fid_data.GDC <- GroupDelayCorrection(Fid_data0, Fid_info)
Pre-acquisition techniques for solvent suppression can be unsufficient to remove the solvent signal from the FIDs. SolventSuppression
estimates and removes this residual solvent signal based on a Whittaker smoother.
# ==== SolventSuppression =================
SS.res <- SolventSuppression(Fid_data.GDC, returnSolvent=TRUE)
Fid_data.SS <- SS.res[["Fid_data"]]
SolventRe <- SS.res[["SolventRe"]]
The apodization step increases the spectral Signal-to-Noise ratio by multiplying the FIDs by an appropriate factor (by default a negative exponential).
# ==== Apodization =================
Fid_data.A <- Apodization(Fid_data.SS, Fid_info)
The zero filling adds 0 to the end of the FIDs to improve the visual representation of spectra.
# ==== Zero Filling =================
Fid_data.ZF <- ZeroFilling(Fid_data.A, fn = ncol(Fid_data.A))
The Fourier Transform is applied to the FIDs to obtain spectra expressed in the frequency domain. The FourierTransform
function further converts this frequency scale originally in hertz into parts per million (ppm).
# ==== FourierTransform =================
RawSpect_data.FT <- FourierTransform(Fid_data.ZF, Fid_info)
After Fourier Transform, the spectra need to be phased for the real part to be in pure absoptive mode (i.e. with positive intensities).
# ==== ZeroOrderPhaseCorrection =================
Spectrum_data.ZOPC <- ZeroOrderPhaseCorrection(RawSpect_data.FT)
# with a graph of the criterion to maximize over 2pi
Spectrum_data.ZOPC <- ZeroOrderPhaseCorrection(RawSpect_data.FT,
plot_rms = "J1-D1-1D-T1")
During this step, the spectra are aligned with an internal reference compound (e.g. with the TMSP). The user determines the ppm value of the reference compound which is by default 0.
# ==== InternalReferencing =================
target.value <- 0
IR.res <- InternalReferencing(Spectrum_data.ZOPC, Fid_info,
ppm.value = target.value,
rowindex_graph = c(1,2))
# draws Peak search zone and location of the 2 first spectra
IR.res$plots
#> [[1]]
Spectrum_data.IR <- IR.res$Spectrum_data
The spectral baseline is estimated and removed from the spectral profiles with the Asymetric Least Squares smoothing algorithm.
# ==== BaselineCorrection =================
BC.res <- BaselineCorrection(Spectrum_data.IR, returnBaseline = TRUE,
lambda.bc = 1e8, p.bc = 0.01)
The remaining negative values are set to 0 since they cannot be interpreted.
# ==== NegativeValuesZeroing =================
Spectrum_data.NVZ <- NegativeValuesZeroing(Spectrum_data.BC)
The spectra are realigned based on a reference spectrum with a Semi-Parametric Time Warping technique.
# ==== Warping =================
W.res <- Warping(Spectrum_data.NVZ, returnWarpFunc = TRUE,
reference.choice = "fixed")
Spectrum_data.W <- W.res[["Spectrum_data"]]
warp_func <- W.res[["Warp.func"]]
During this step the user selects the part of the spectrum that is of interest and the other parts are removed from the spectral matrix.
# ==== WindowSelection =================
Spectrum_data.WS <- WindowSelection(Spectrum_data.W, from.ws = 10,
to.ws = 0.2)
The Bucketing
function reduces the number of spectral descriptors by aggregating intensities into a series of buckets.
# ==== Bucketing =================
Spectrum_data.B <- Bucketing(Spectrum_data.WS, intmeth = "t")
By default, this step sets to zero spectral areas that are of no interest or have a sigificant and unwanted amount of variation (e.g. the water area).
# ==== RegionRemoval =================
Spectrum_data.RR <- RegionRemoval(Spectrum_data.B,
typeofspectra = "serum")
The normalization copes with the dilution factor and other issues that render the spectral profiles non-comparable to each other.
# ==== Normalization =================
Spectrum_data.N <- Normalization(Spectrum_data.RR, type.norm = "mean")
Note: the function ZoneAggregation
is not used here, but is can be applied e.g. to urine spectra to aggregate the citrate peak.
The Draw
function enables to produce line plots with type.draw = "signal"
or PCA results with type.draw = "pca"
of FIDs or spectra. These plots can be saved as pdf files with the option output = "pdf"
, see ?Draw
, ?DrawSignal
and ?DrawPCA
for more details on the other available options.
Draw(Spectrum_data.N[1:4,], type.draw = c("signal"),
subtype= "stacked", output = c("default"))
Draw(Spectrum_data.N, type.draw = c("pca"),
output = c("default"), Class = Group_HS,
type.pca = "scores")
Draw(Spectrum_data.N, type.draw = c("pca"),
output = c("default"),
Class = Group_HS, type.pca = "loadings")
sessionInfo()
#> R version 4.0.3 (2020-10-10)
#> Platform: x86_64-pc-linux-gnu (64-bit)
#> Running under: Ubuntu 18.04.5 LTS
#>
#> Matrix products: default
#> BLAS: /home/biocbuild/bbs-3.12-bioc/R/lib/libRblas.so
#> LAPACK: /home/biocbuild/bbs-3.12-bioc/R/lib/libRlapack.so
#>
#> locale:
#> [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
#> [3] LC_TIME=en_US.UTF-8 LC_COLLATE=C
#> [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
#> [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
#> [9] LC_ADDRESS=C LC_TELEPHONE=C
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] PepsNMRData_1.8.0 PepsNMR_1.8.1 knitr_1.30 BiocStyle_2.18.1
#>
#> loaded via a namespace (and not attached):
#> [1] Rcpp_1.0.5 highr_0.8 plyr_1.8.6
#> [4] nloptr_1.2.2.2 compiler_4.0.3 pillar_1.4.7
#> [7] BiocManager_1.30.10 tools_4.0.3 digest_0.6.27
#> [10] evaluate_0.14 lifecycle_0.2.0 tibble_3.0.4
#> [13] gtable_0.3.0 lattice_0.20-41 pkgconfig_2.0.3
#> [16] rlang_0.4.10 Matrix_1.3-2 magick_2.6.0
#> [19] yaml_2.2.1 xfun_0.20 gridExtra_2.3
#> [22] stringr_1.4.0 dplyr_1.0.2 generics_0.1.0
#> [25] vctrs_0.3.6 grid_4.0.3 tidyselect_1.1.0
#> [28] glue_1.4.2 R6_2.5.0 ptw_1.9-15
#> [31] rmarkdown_2.6 bookdown_0.21 farver_2.0.3
#> [34] reshape2_1.4.4 ggplot2_3.3.3 purrr_0.3.4
#> [37] magrittr_2.0.1 matrixStats_0.57.0 scales_1.1.1
#> [40] htmltools_0.5.1 ellipsis_0.3.1 colorspace_2.0-0
#> [43] labeling_0.4.2 stringi_1.5.3 munsell_0.5.0
#> [46] crayon_1.3.4
Martin, Manon, Benoît Legat, Justine Leenders, Julien Vanwinsberghe, Réjane Rousseau, Bruno Boulanger, Paul H. C. Eilers, Pascal De Tullio, and Bernadette Govaerts. 2018. “PepsNMR for 1H NMR Metabolomic Data Pre-Processing.” Analytica Chimica Acta 1019: 1–13. https://doi.org/10.1016/j.aca.2018.02.067.