pmd package use Paired Mass Distance (PMD) relationship
to analysis the GC/LC-MS based non-targeted data. PMD means the distance
between two masses or mass to charge ratios. In mass spectrometry, PMD
would keep the same value between two masses and two mass to charge
ratios(m/z). There are two kinds of PMD involved in this package: PMD
from the same compound and PMD from different compounds. In GC/LC-MS or
XCMS based non-targeted data analysis, peaks could be separated by
chronograph and same compound means ions from similar retention times or
ions co-eluted by certain column.
For MS1 full scan data, we could build retention time(RT) bins to assign peaks into different RT groups by retention time hierarchical clustering analysis. For each RT group, the peaks should come from same compounds or co-elutes. If certain PMD appeared in multiple RT groups, it would be related to the relationship about adducts, neutral loss, isotopologues or common fragments ions.
The peaks from different retention time groups would like to be different compounds separated by chronograph. The PMD would reflect the relationship about homologous series or chemical reactions.
GlobalStd algorithm use the PMD within same RT group to find independent peaks among certain data set. Then, structure/reaction directed analysis use PMD from different RT groups to screen important compounds or reactions.
The input data should be a list object with at least two
elements from a peaks list:
mz, high resolution
mass spectrometry is requiredrtHowever, I suggested to add intensity and group information to the list for validation of PMD analysis.
In this package, a data set from in vivo solid phase micro-extraction(SPME) was attached. This data set contain 9 samples from 3 fish with triplicates samples for each fish. Here is the data structure:
library(pmd)
data("spmeinvivo")
str(spmeinvivo)
#> List of 4
#> $ data : num [1:1459, 1:9] 1095 10439 10154 2797 90211 ...
#> ..- attr(*, "dimnames")=List of 2
#> .. ..$ : chr [1:1459] "100.1/170" "100.5/86" "101/85" "103.1/348" ...
#> .. ..$ : chr [1:9] "1405_Fish1_F1" "1405_Fish1_F2" "1405_Fish1_F3" "1405_Fish2_F1" ...
#> $ group:'data.frame': 9 obs. of 2 variables:
#> ..$ sample_name : chr [1:9] "1405_Fish1_F1" "1405_Fish1_F2" "1405_Fish1_F3" "1405_Fish2_F1" ...
#> ..$ sample_group: chr [1:9] "fish1" "fish1" "fish1" "fish2" ...
#> $ mz : num [1:1459] 100 101 101 103 104 ...
#> $ rt : num [1:1459] 170.2 86.3 84.9 348.1 48.8 ...You could build this list or mzrt object
from the xcms objects via enviGCMS package.
When you have a xcmsSet object or XCMSnExp
object named xset, you could use
enviGCMS::getmzrt(xset) to get such list. Of course you
could build such list by yourself.
GlobalStd algorithm try to find independent peaks among certain peaks list. The first step is retention time hierarchical clustering analysis. The second step is to find the relationship among adducts, neutral loss, isotopologues and common fragments ions. The third step is to screen the independent peaks.
Here is a workflow for this algorithm:
pmd <- getpaired(spmeinvivo)
#> 75 retention time clusters found.
#> Using ng = 15
#> 5 unique PMDs retained.
#> The unique within RT clusters high frequency PMD(s) is(are) 28.03 21.98 44.03 17.03 18.01.
#> 409 isotope peaks found.
#> 109 multiple charged isotope peaks found.
#> 4 multiple charged peaks found.
#> 346 paired peaks found.
plotrtg(pmd)This plot would show the distribution of RT groups. The
rtcutoff in function getpaired could be used
to set the cutoff of the distances in retention time hierarchical
clustering analysis. Retention time cluster cutoff should fit the peak
picking algorithm. For HPLC, 10 is suggested and 5 could be used for
UPLC.
Global PMD’s retention time group numbers should be around 20 percent
of the retention time cluster numbers. For example, if you find 100
retention time clusters, I suggested you use 20 as the cutoff of
empirical global PMD’s retention time group numbers. If you don’t
specifically assign a value to ng, the algorithm will
select such recommendation by default setting.
Take care of the retention time cluster with lots of peaks. In this case, such cluster could be co-eluted compounds on certain column. It would be wise to trim the retention time window for high quality peaks. Another important hint is that pre-filter your peak list by black samples or other quality control samples. Otherwise the running time would be long and lots of pmd relationship would be just from noise.
The ng in function getpaired could be used
to set cutoff of global PMD’s retention time group numbers. If
ng is 10, at least 10 of the retention time groups should
contain the shown PMD relationship. You could use
plotpaired to show the distribution.
You could also show the distribution of PMD relationship by index:
# show the unique PMD found by getpaired function
for(i in 1:length(unique(round(pmd$paired$diff,2)))){
diff <- unique(round(pmd$paired$diff,2))[i]
index <- round(pmd$paired$diff,2)== diff
plotpaired(pmd,index)
}This is an easy way to find potential adducts of the data by high frequency PMD from the same compound. For example, 21.98 Da could be the mass distances between \([M+H]^+\) and \([M+Na]^+\). In this case, user could find the potential adducts or neutral loss even when they have no preferred adducts list. If one adduct exist in certain analytical system, the high frequency PMD will reveal such relationship. The high frequency PMD list could also be used to check the fragmental pattern of in-source reactions as long as such patterns are popular among all collected ions.
You could use getstd function to get the independent
peaks. Independent peaks mean the peaks list removing the redundant
peaks such as adducts, neutral loss, isotopologues and comment fragments
ions found by PMD analysis in STEP2. Ideally, those peaks could be
molecular ions while they might still contain redundant peaks.
std <- getstd(pmd)
#> 8 group(s) have single peaks 14 23 32 33 54 55 56 75
#> 11 group(s) with multiple peaks while no isotope/paired relationship 4 5 7 8 11 ... 42 49 68 72 73
#> 9 group(s) with isotope without paired relationship 2 9 22 26 52 62 64 66 70
#> 4 group(s) with paired without isotope relationship 1 10 15 18
#> 43 group(s) with both paired and isotope relationship 3 6 12 13 16 ... 65 67 69 71 74
#> 291 standard masses identified.Here you could plot the peaks by plotstd function to
show the distribution of independent peaks:
You could also plot the peaks distribution by assign a retention time
group via plotstdrt:
par(mfrow = c(2,3))
plotstdrt(std,rtcluster = 23,main = 'Retention time group 23')
plotstdrt(std,rtcluster = 9,main = 'Retention time group 9')
plotstdrt(std,rtcluster = 18,main = 'Retention time group 18')
plotstdrt(std,rtcluster = 67,main = 'Retention time group 67')
plotstdrt(std,rtcluster = 49,main = 'Retention time group 49')
plotstdrt(std,rtcluster = 6,main = 'Retention time group 6')Original GlobalStd algorithm only use mass to charge ratio and retention time of peaks to select independent peaks. However, if intensity data across samples are available, correlation coefficient of paired ions could be used to further filter the random noise in high frequency PMDs. You could set up cutoff of Pearson Correlation Coefficient between peaks to refine the peaks selected by GlobalStd within same retention time groups. In this case, the numbers of selected independent peaks will be further reduced. When you use this parameter, make sure the intensity data are from real samples instead of blank samples, which will affect the calculation of correlation coefficient.
std2 <- globalstd(pmd,corcutoff = 0.9)
#> 75 retention time clusters found.
#> Using ng = 15
#> 2 unique PMDs retained.
#> The unique within RT clusters high frequency PMD(s) is(are) 21.98 17.03.
#> 242 isotope peaks found.
#> 63 multiple charged isotope peaks found.
#> 3 multiple charged peaks found.
#> 120 paired peaks found.
#> 8 group(s) have single peaks 14 23 32 33 54 55 56 75
#> 23 group(s) with multiple peaks while no isotope/paired relationship 2 4 5 7 8 ... 68 69 70 72 73
#> 17 group(s) with isotope without paired relationship 9 12 20 22 24 ... 60 64 66 67 71
#> 3 group(s) with paired without isotope relationship 1 53 74
#> 24 group(s) with both paired and isotope relationship 3 6 13 16 17 ... 48 58 61 63 65
#> 206 standard masses identified.You need to check the GlobalStd algorithm’s results by principal components analysis(PCA). If we removed too much peaks containing information, the score plot of reduced data set would show great changes.
library(enviGCMS)
par(mfrow = c(2,2),mar = c(4,4,2,1)+0.1)
plotpca(std$data,lv = as.numeric(as.factor(std$group$sample_group)),main = "all peaks")
plotpca(std$data[std$stdmassindex,],lv = as.numeric(as.factor(std$group$sample_group)),main = paste(sum(std$stdmassindex),"independent peaks"))
plotpca(std2$data[std2$stdmassindex,],lv = as.numeric(as.factor(std$group$sample_group)),main = paste(sum(std2$stdmassindex),"reduced independent peaks"))You might find original GlobalStd algorithm show a similar PCA score plot with original data while GlobalStd algorithm considering intensity data seems change the profile. The major reason is that correlation coefficient option in the algorithm will remove the paired ions without strong correlation. It will be aggressive to remove low intensity peaks, which are vulnerable by baseline noise. However, such options would be helpful if you only concern high quality peaks for following analysis. Otherwise, original GlobalStd will keep the most information for discover purpose.
GlobalStd algorithm in pmd package could be treated as a
method to extract pseudo spectra. You could use
getpseudospectrum to get peaks groups information for all
GlobalStd peaks. This function would consider the merge of GlobalStd
peaks when certain peak is involved in multiple clusters. Then you could
choose export peaks with the highest intensities or base peaks in each
GlobalStd merged peaks groups. Meanwhile, you could also include the
correlation coefficient cutoff to further improve the data quality.
stdcluster <- getpseudospectrum(std)
#> 75 retention time clusters found.
#> Using ng = 15
#> 5 unique PMDs retained.
#> The unique within RT clusters high frequency PMD(s) is(are) 28.03 21.98 44.03 17.03 18.01.
#> 409 isotope peaks found.
#> 109 multiple charged isotope peaks found.
#> 4 multiple charged peaks found.
#> 346 paired peaks found.
#> 245 pseudo spectrum found.
#> 0.84 peaks covered by PMD relationship.
# extract the first pseudospectra for retention time cluster 37
idx <- stdcluster$pseudo$sid=='37@1'
plot(stdcluster$pseudo$mz[idx],stdcluster$pseudo$ins[idx],type = 'h',xlab = 'm/z',ylab = 'intensity',main = 'pseudo spectra for retention time cluster 37')# considering the correlation coefficient cutoff
stdcluster2 <- getpseudospectrum(std, corcutoff = 0.9)
#> 75 retention time clusters found.
#> Using ng = 15
#> 2 unique PMDs retained.
#> The unique within RT clusters high frequency PMD(s) is(are) 21.98 17.03.
#> 242 isotope peaks found.
#> 63 multiple charged isotope peaks found.
#> 3 multiple charged peaks found.
#> 120 paired peaks found.
#> 80 pseudo spectrum found.
#> 0.97 peaks covered by PMD relationship.We supplied getcorpseudospectrum to find peaks groups by
correlation analysis only. The base peaks of correlation cluster were
selected to stand for the compounds.
corcluster <- getcorpseudospectrum(spmeinvivo)
#> 75 retention time cluster found.
#> 141 pseudo spectrum found.
#> 0.72 peaks covered by PMD relationship.
# extract pseudospectra 37@1
peak <- corcluster$pseudo[corcluster$pseudo$sid == '37@1',]
plot(peak$ins~peak$mz,type = 'h',xlab = 'm/z',ylab = 'intensity',main = 'pseudo spectra for correlation cluster')Then we could compare the reduced result using multiple similarity
factors. A good peak selection algorithm should maintain the structural
consistency (e.g. Normalized Spectral Entropy, RV Coefficient, and
Mantel test). We supplied getsim function to output PCASF,
RV, Mantel correlation, and Spectral Entropy ratio between the original
and reduced datasets.
par(mfrow = c(2,3),mar = c(4,4,2,1)+0.1)
plotpca(std$data[std$stdmassindex,],lv = as.numeric(as.factor(std$group$sample_group)),main = paste(sum(std$stdmassindex),"independent peaks"))
plotpca(std$data[stdcluster$stdmassindex2,],lv = as.numeric(as.factor(std$group$sample_group)),main = paste(sum(stdcluster$stdmassindex2),"independent base peaks"))
plotpca(std$data[stdcluster2$stdmassindex2,],lv = as.numeric(as.factor(std$group$sample_group)),main = paste(sum(stdcluster2$stdmassindex2),"independent reduced base peaks"))
plotpca(std$data[corcluster$stdmassindex,],lv = as.numeric(as.factor(std$group$sample_group)),main = paste(sum(corcluster$stdmassindex),"peaks without correlationship"))
plotpca(std$data[corcluster$stdmassindex2,],lv = as.numeric(as.factor(std$group$sample_group)),main = paste(sum(corcluster$stdmassindex2),"base peaks without correlationship"))
plotpca(std$data,lv = as.numeric(as.factor(std$group$sample_group)),main = paste(nrow(std$data),"all peaks"))
# Evaluate multiple algorithms against original data
getsim(std$data, std$data[std$stdmassindex,])
#> PCASF RV Mantel_Pearson Mantel_Spearman
#> NA 0.9744418 0.9680196 0.9554698
#> Spectral_Entropy_x Spectral_Entropy_y Entropy_Ratio NSE_x
#> 0.8000474 0.6874659 0.8592815 0.3641172
#> NSE_y
#> 0.3128792
getsim(std$data, std$data[stdcluster$stdmassindex2,])
#> PCASF RV Mantel_Pearson Mantel_Spearman
#> NA 0.8599917 0.8371042 0.8404118
#> Spectral_Entropy_x Spectral_Entropy_y Entropy_Ratio NSE_x
#> 0.8000474 0.7130890 0.8913086 0.3641172
#> NSE_y
#> 0.3245408
getsim(std$data, std$data[corcluster$stdmassindex2,])
#> PCASF RV Mantel_Pearson Mantel_Spearman
#> NA 0.7673804 0.7300709 0.7122265
#> Spectral_Entropy_x Spectral_Entropy_y Entropy_Ratio NSE_x
#> 0.8000474 0.4959912 0.6199523 0.3641172
#> NSE_y
#> 0.2257353In this case, the selected peaks algorithms correctly retain the biological variance and structural distances shown by high RV coefficient and Entropy Ratio.
Note on Base Peaks vs. Standard Mass Index: You
might notice that stdcluster$stdmassindex2 (Independent
Base Peaks) generally yields slightly better similarity scores than
std$stdmassindex (Independent Peaks). The original
GlobalStd algorithm purely uses PMD topology to filter redundancy
without prioritizing peak intensity. Consequently, it may select a minor
isotope or adduct peak as the representative feature, which is more
vulnerable to baseline noise. In contrast,
getpseudospectrum() intentionally selects the base
peak (the peak with the highest intensity) from each redundant PMD
cluster. Because base peaks have higher signal-to-noise ratios, they
capture the intrinsic biological variance of the underlying compound
more robustly, leading to representations that align more closely with
the uncompressed raw dataset.
If you need to evaluate the internal dimensionality and information
purity of non-aligned peak tables (e.g., outputs spanning different
platforms or algorithms without same variables), use
getnse() to measure the Normalized Spectral Entropy.
# Calculate SCM/NSE for the full data and the reduced standard masses
getnse(std$data)
#> [1] 0.3641172
getnse(std$data[std$stdmassindex,])
#> [1] 0.3128792Higher values indicate greater intrinsic independence and lower redundancy clustering (noise padding) within the sample dimensions.
getsda function could be used to perform
Structure/reaction directed analysis. The cutoff of frequency is
automate found by PMD network analysis with the largest mean distance of
all nodes.
sda <- getsda(std)
#> PMD frequency cutoff is 6 by PMD network analysis with largest network average distance 6.67 .
#> 53 groups were found as high frequency PMD group.
#> 0 was found as high frequency PMD.
#> 1.98 was found as high frequency PMD.
#> 2.01 was found as high frequency PMD.
#> 2.02 was found as high frequency PMD.
#> 6.97 was found as high frequency PMD.
#> 11.96 was found as high frequency PMD.
#> 12 was found as high frequency PMD.
#> 13.98 was found as high frequency PMD.
#> 14.02 was found as high frequency PMD.
#> 14.05 was found as high frequency PMD.
#> 15.99 was found as high frequency PMD.
#> 16.03 was found as high frequency PMD.
#> 19.04 was found as high frequency PMD.
#> 28.03 was found as high frequency PMD.
#> 30.05 was found as high frequency PMD.
#> 31.99 was found as high frequency PMD.
#> 33.02 was found as high frequency PMD.
#> 37.02 was found as high frequency PMD.
#> 42.05 was found as high frequency PMD.
#> 48.04 was found as high frequency PMD.
#> 48.98 was found as high frequency PMD.
#> 49.02 was found as high frequency PMD.
#> 54.05 was found as high frequency PMD.
#> 56.06 was found as high frequency PMD.
#> 56.1 was found as high frequency PMD.
#> 58.04 was found as high frequency PMD.
#> 58.08 was found as high frequency PMD.
#> 58.11 was found as high frequency PMD.
#> 63.96 was found as high frequency PMD.
#> 66.05 was found as high frequency PMD.
#> 68.06 was found as high frequency PMD.
#> 70.04 was found as high frequency PMD.
#> 70.08 was found as high frequency PMD.
#> 74.02 was found as high frequency PMD.
#> 80.03 was found as high frequency PMD.
#> 82.08 was found as high frequency PMD.
#> 88.05 was found as high frequency PMD.
#> 91.1 was found as high frequency PMD.
#> 93.12 was found as high frequency PMD.
#> 94.1 was found as high frequency PMD.
#> 96.09 was found as high frequency PMD.
#> 101.05 was found as high frequency PMD.
#> 108.13 was found as high frequency PMD.
#> 110.11 was found as high frequency PMD.
#> 112.16 was found as high frequency PMD.
#> 116.08 was found as high frequency PMD.
#> 122.15 was found as high frequency PMD.
#> 124.16 was found as high frequency PMD.
#> 126.14 was found as high frequency PMD.
#> 144.18 was found as high frequency PMD.
#> 148.04 was found as high frequency PMD.
#> 150.2 was found as high frequency PMD.
#> 173.18 was found as high frequency PMD.Such largest mean distance of all nodes is calculated for top 1 to 100 (if possible) high frequency PMDs. Here is a demo for the network generation process.
library(igraph)
#>
#> Attaching package: 'igraph'
#> The following objects are masked from 'package:stats':
#>
#> decompose, spectrum
#> The following object is masked from 'package:base':
#>
#> union
cdf <- sda$sda
# get the PMDs and frequency
pmds <- as.numeric(names(sort(table(cdf$diff2),decreasing = T)))
freq <- sort(table(cdf$diff2),decreasing = T)
# filter the frequency larger than 10 for demo
pmds <- pmds[freq>10]
cdf <- sda$sda[sda$sda$diff2 %in% pmds,]
g <- igraph::graph_from_data_frame(cdf,directed = F)
l <- igraph::layout_with_fr(g)
for(i in 1:length(pmds)){
g2 <- igraph::delete_edges(g,which(E(g)$diff2%in%pmds[1:i]))
plot(g2,edge.width=1,vertex.label="",vertex.size=1,layout=l,main=paste('Top',length(pmds)-i,'high frequency PMDs'))
}Here we could find more and more compounds will be connected with more high frequency PMDs. Meanwhile, the mean distance of all network nodes will increase. However, some PMDs are generated by random combination of ions. In this case, if we included those PMDs for the network, the mean distance of all network nodes will decrease. Here, the largest mean distance means no more information will be found for certain data set and such value is used as the cutoff for high frequency PMDs selection.
You could use plotstdsda to show the distribution of the
selected paired peaks.
You could also use index to show the distribution of certain PMDs.
par(mfrow = c(1,3),mar = c(4,4,2,1)+0.1)
plotstdsda(sda,sda$sda$diff2 == 2.02)
plotstdsda(sda,sda$sda$diff2 == 28.03)
plotstdsda(sda,sda$sda$diff2 == 58.04)Structure/reaction directed analysis could be directly performed on all the peaks, which is slow to process:
sdaall <- getsda(spmeinvivo)
#> PMD frequency cutoff is 104 by PMD network analysis with largest network average distance 14.06 .
#> 6 groups were found as high frequency PMD group.
#> 0 was found as high frequency PMD.
#> 2.02 was found as high frequency PMD.
#> 28.03 was found as high frequency PMD.
#> 31.01 was found as high frequency PMD.
#> 58.04 was found as high frequency PMD.
#> 116.08 was found as high frequency PMD.
par(mfrow = c(1,3),mar = c(4,4,2,1)+0.1)
plotstdsda(sdaall,sdaall$sda$diff2 == 2.02)
plotstdsda(sdaall,sdaall$sda$diff2 == 28.03)
plotstdsda(sdaall,sdaall$sda$diff2 == 58.04)Structure/Reaction directed analysis could also use correlation to restrict the paired ions. However, similar to GlobalStd algorithm, such cutoff will remove low intensity data. Researcher should have a clear idea to use this cutoff.
sda2 <- getsda(std, corcutoff = 0.9)
#> PMD frequency cutoff is 6 by PMD network analysis with largest network average distance 6.67 .
#> 41 groups were found as high frequency PMD group.
#> 0 was found as high frequency PMD.
#> 1.98 was found as high frequency PMD.
#> 2.01 was found as high frequency PMD.
#> 2.02 was found as high frequency PMD.
#> 11.96 was found as high frequency PMD.
#> 12 was found as high frequency PMD.
#> 13.98 was found as high frequency PMD.
#> 14.02 was found as high frequency PMD.
#> 14.05 was found as high frequency PMD.
#> 15.99 was found as high frequency PMD.
#> 16.03 was found as high frequency PMD.
#> 19.04 was found as high frequency PMD.
#> 28.03 was found as high frequency PMD.
#> 30.05 was found as high frequency PMD.
#> 31.99 was found as high frequency PMD.
#> 33.02 was found as high frequency PMD.
#> 42.05 was found as high frequency PMD.
#> 48.98 was found as high frequency PMD.
#> 49.02 was found as high frequency PMD.
#> 54.05 was found as high frequency PMD.
#> 56.06 was found as high frequency PMD.
#> 58.04 was found as high frequency PMD.
#> 58.08 was found as high frequency PMD.
#> 63.96 was found as high frequency PMD.
#> 66.05 was found as high frequency PMD.
#> 68.06 was found as high frequency PMD.
#> 70.08 was found as high frequency PMD.
#> 74.02 was found as high frequency PMD.
#> 80.03 was found as high frequency PMD.
#> 82.08 was found as high frequency PMD.
#> 88.05 was found as high frequency PMD.
#> 93.12 was found as high frequency PMD.
#> 94.1 was found as high frequency PMD.
#> 96.09 was found as high frequency PMD.
#> 108.13 was found as high frequency PMD.
#> 110.11 was found as high frequency PMD.
#> 112.16 was found as high frequency PMD.
#> 116.08 was found as high frequency PMD.
#> 122.15 was found as high frequency PMD.
#> 124.16 was found as high frequency PMD.
#> 126.14 was found as high frequency PMD.
plotstdsda(sda2)When you only have data of peaks without retention time or compounds
list, structure/reaction directed analysis could also be done by
getrda function.
sda <- getrda(spmeinvivo$mz)
#> 164462 pmd found.
#> 20 pmd used.
# check high frequency pmd
colnames(sda)
#> [1] "0" "1.001" "1.002" "1.003" "1.004" "2.015" "2.016"
#> [8] "14.015" "17.026" "18.011" "21.982" "28.031" "28.032" "44.026"
#> [15] "67.987" "67.988" "88.052" "116.192" "135.974" "135.975"
# get certain pmd related m/z
idx <- sda[,'2.016']
# show the m/z
spmeinvivo$mz[idx]
#> [1] 118.0651 118.0652 120.0812 159.1575 162.0552 170.0330 170.0932 170.1541
#> [9] 174.1363 174.9917 175.0873 176.0305 176.0418 181.9872 184.1695 188.6484
#> [17] 192.1487 192.1604 226.9522 226.9523 228.1969 228.1973 259.1148 261.1317
#> [25] 270.3185 271.3217 272.3230 272.3234 273.8902 274.8744 284.2955 285.3002
#> [33] 285.3002 286.3101 286.3101 291.0712 293.1755 294.9392 296.2961 304.3081
#> [41] 305.2480 305.3118 308.0889 308.2953 308.2954 309.1672 309.2046 315.1781
#> [49] 317.9344 319.3005 319.3002 319.9302 320.3041 320.3322 321.3165 322.3185
#> [57] 323.3221 324.3266 325.3294 327.2022 327.3449 329.0052 331.0031 350.3426
#> [65] 352.3214 352.3215 353.3244 354.3365 355.0696 359.2410 361.2353 372.3197
#> [73] 375.3066 383.2804 383.3723 384.3350 385.2753 385.3480 387.2851 397.1907
#> [81] 399.3274 400.9174 401.3420 403.2859 432.8860 433.2781 445.8289 447.1173
#> [89] 451.3633 462.8615 522.3557 524.1178 525.9831 526.4841 705.7223 708.8218
#> [97] 976.3139 976.8122 982.7763globalstd function is a wrap function to process
GlobalStd algorithm and structure/reaction directed analysis in one
line. All the plot function could be directly used on the
list objects from globalstd function. If you
want to perform structure/reaction directed analysis, set the
sda=T in the globalstd function.
result <- globalstd(spmeinvivo, sda=FALSE)
#> 75 retention time clusters found.
#> Using ng = 15
#> 5 unique PMDs retained.
#> The unique within RT clusters high frequency PMD(s) is(are) 28.03 21.98 44.03 17.03 18.01.
#> 409 isotope peaks found.
#> 109 multiple charged isotope peaks found.
#> 4 multiple charged peaks found.
#> 346 paired peaks found.
#> 8 group(s) have single peaks 14 23 32 33 54 55 56 75
#> 11 group(s) with multiple peaks while no isotope/paired relationship 4 5 7 8 11 ... 42 49 68 72 73
#> 9 group(s) with isotope without paired relationship 2 9 22 26 52 62 64 66 70
#> 4 group(s) with paired without isotope relationship 1 10 15 18
#> 43 group(s) with both paired and isotope relationship 3 6 12 13 16 ... 65 67 69 71 74
#> 291 standard masses identified.Independent peaks are supposing generated from different compounds.
We could use those peaks for MS/MS analysis instead of DIA or DDA. Here
we need multiple injections for one sample since it might be impossible
to get all ions’ fragment ions in one injection with good sensitivity.
You could use gettarget to generate the index for the
injections and output the peaks for each run.
# you need retention time for independent peaks
index <- gettarget(std$rt[std$stdmassindex])
#> You need 10 injections!
# output the ions for each injection
table(index)
#> index
#> 1 2 3 4 5 6 7 8 9 10
#> 35 28 18 33 26 39 38 17 29 28
# show the ions for the first injection
std$mz[index==1]
#> [1] 100.5107 106.9509 113.9638 139.0591 140.0600 149.9530 155.1293 156.0776
#> [9] 157.4607 165.0787 170.0932 175.1481 177.0914 191.1801 192.1604 195.1024
#> [17] 205.1276 208.1696 213.2050 220.9350 223.2068 229.6753 232.1334 235.2061
#> [25] 237.6615 242.2863 242.2863 242.2863 242.2863 247.2421 251.0008 251.1815
#> [33] 251.2385 252.9981 261.1542 261.2591 262.2258 266.1741 271.3216 271.3217
#> [41] 273.8902 277.1815 280.1630 282.0525 285.3002 291.0712 300.1148 301.9077
#> [49] 309.0913 309.3159 311.2377 319.3002 320.8698 327.2022 330.2521 332.5619
#> [57] 338.3435 339.2889 340.2846 341.2662 344.3500 349.0599 350.3426 350.9869
#> [65] 354.3365 357.0503 357.8170 358.2640 359.3151 367.3373 367.9923 370.3330
#> [73] 372.3478 387.3532 389.2529 394.8754 399.1231 400.9174 403.2332 410.2585
#> [81] 416.3062 422.2952 425.3120 432.3878 435.3471 439.2698 447.1173 448.1186
#> [89] 456.8437 468.1028 470.1010 492.8839 494.3178 494.8112 496.3410 501.2808
#> [97] 503.3190 505.3342 506.3375 515.8357 519.1401 520.3415 521.1371 523.1141
#> [105] 537.3405 538.1637 539.4158 542.1221 561.3616 562.1811 567.1783 568.8923
#> [113] 576.4110 577.4144 586.4524 598.8366 608.4054 611.1844 628.8597 634.8774
#> [121] 638.2008 650.6644 654.2092 664.4627 669.8727 675.2109 684.2033 685.2035
#> [129] 690.3683 694.6505 698.7711 702.8662 703.6382 703.8660 708.4889 709.5932
#> [137] 711.2204 711.3532 714.4484 734.8119 736.4916 738.5066 745.3469 772.6492
#> [145] 773.3274 779.5153 786.8255 790.5377 791.8441 803.5434 814.4154 832.3212
#> [153] 836.3301 853.7083 858.6636 863.8189 873.3057 875.4962 884.4968 893.8251
#> [161] 897.2942 915.3139 916.7821 922.7991 927.8191 937.8098 941.7605 943.7976
#> [169] 945.7972 952.1496 964.7811 969.7931 970.7962 975.1471 995.8063 997.8091
std$rt[index==1]
#> [1] 86.3490 216.1970 1079.4300 511.2940 511.0515 1079.6400 775.8610
#> [8] 227.6550 144.3705 511.3690 235.9920 614.4130 574.3390 638.8870
#> [15] 337.3920 574.1260 370.7850 415.6780 594.9115 213.8030 639.1000
#> [22] 639.3150 403.6780 608.1970 639.6355 631.5560 809.1845 573.8035
#> [29] 611.4110 639.0995 509.7940 452.9630 639.1010 509.7940 422.7480
#> [36] 639.1010 556.7670 416.1050 715.1720 744.1460 145.9680 588.6960
#> [43] 583.7700 762.7890 716.7800 161.3960 447.6060 144.1250 568.7680
#> [50] 594.0550 596.4120 594.9110 218.2260 170.3860 596.4120 141.6810
#> [57] 639.1010 590.7330 573.3765 564.2670 638.9930 560.4095 625.9840
#> [64] 508.2950 594.4820 717.1015 639.0990 480.8010 612.4820 585.2700
#> [71] 762.5750 551.8380 523.5950 644.6705 383.1060 217.1550 527.9020
#> [78] 145.1090 601.3400 633.9130 503.1510 639.5290 404.7480 612.4845
#> [85] 581.9475 639.3130 716.8890 717.1020 217.2465 717.1010 717.1020
#> [92] 213.7130 540.1180 803.7190 536.5800 477.4360 440.2150 422.9630
#> [99] 423.1770 144.8960 762.3620 515.3650 762.5770 688.6000 537.2230
#> [106] 762.7890 547.1250 762.5760 457.8285 762.3630 762.3630 213.7270
#> [113] 534.0090 533.7950 439.2500 216.9670 434.7490 818.7650 213.5990
#> [120] 213.7270 819.1920 637.1710 819.4060 527.7950 213.5285 819.5135
#> [127] 883.2670 883.1575 213.1890 639.1000 218.0975 213.7270 638.8855
#> [134] 213.7270 525.0090 619.9850 884.3380 215.2290 525.0080 216.7260
#> [141] 714.7460 481.2930 215.2830 613.6620 370.5620 519.6690 215.4870
#> [148] 780.5760 213.2940 665.0290 490.2940 213.5140 213.3740 646.6610
#> [155] 646.7630 639.1000 639.2070 213.0800 213.3590 213.5020 215.8710
#> [162] 214.9660 214.6500 215.2830 213.5105 213.4465 636.9310 214.0705
#> [169] 214.1550 213.3340 215.6320 654.9580 213.9110 213.4215 213.5020
#> [176] 213.3590An interactive document has been included in this package to perform
PMD analysis. You need to prepare a csv file with m/z and retention time
of peaks. Such csv file could be generated by run
enviGCMS::getcsv() on the list object from
enviGCMS::getmzrt(xset) function. The xset
should be XCMSnExp object or xcmsSet object.
You could also generate the csv file by
enviGCMS::getmzrt(xset,name = 'test'). You will find the
csv file in the working dictionary named test.csv.
Then you could run runPMD() to start the Graphical user
interface(GUI) for GlobalStd algorithm and structure/reaction directed
analysis.
pmd package could be used to reduce the redundancy peaks
for GC/LC-MS based research and perform structure/reaction directed
analysis to screen known and unknown important compounds or
reactions.