R package(二):xcms代谢组学初探

2024-05-17  本文已影响0人  佳名
library(xcms)
library(ggplot2)
library(ggrepel)
dda_data <- readMSData("PestMix1_DDA.mzML", mode = "onDisk")

检出peak
官方推荐参数

cwp <- CentWaveParam(snthresh = 5, noise = 100, ppm = 10,
                     peakwidth = c(3, 30))
dda_data <- findChromPeaks(dda_data, param = cwp)
参数设置.png

查看检出的features

plotChromPeaks(dda_data)
plotChromPeaks

上图中一条线(实际为矩形)代表一个离子,线的长度代表峰宽,宽度代表质荷比m/z的范围。
图形不够美观,也不能带标记label。
使用ggplot2绘图。

data <- chromPeaks(dda_data)|> data.frame()
ggplot(data)+ 
  geom_rect(aes(xmin = rtmin,xmax = rtmax ,ymin = mzmin ,ymax = mzmax),color = "black",alpha = 0)+
  geom_text_repel(aes(x = rt,y = mz,label = row.names(data)),size = 3)+
  xlab("Retention time")+
  theme_bw()
geom_rect

可以观察到许多features具有非常相似的质荷比mz和非常接近的保留时间rt。如CP083,CP084。

i = 83
mz = c(data$mzmin[i],data$mzmax[i])
mz
rt = c(data$rtmin[i],data$rtmax[i])
rt
mzr <- mz + c(-0.01, 0.01)
rtr <- rt + c(-5, 5)
chromPeaks(dda_data, mz = mz, rt = rt)
#           mz    mzmin    mzmax      rt   rtmin   rtmax     into     intb     maxo  sn sample
#CP83 217.144 217.1437 217.1443 508.258 504.478 513.617 473.4116 468.0113 184.1682 116      1
#CP84 217.144 217.1437 217.1443 508.678 508.678 513.617 207.2879 204.4068 163.8278 116      1

看看他们是否是同一种feature。
可视化

ggplot(data)+ 
  geom_rect(aes(xmin = rtmin,xmax = rtmax ,ymin = mzmin ,ymax = mzmax),color = "black",alpha = 0)+
  geom_text_repel(aes(x = rt,y = mz,label = row.names(data)),size = 3)+
  xlab("Retention time")+
  xlim(rtr)+
  ylim(mzr)+
  theme_bw()
geom_rect

提取EIC图

dda_data |> 
  filterMz(mzr)|>
  filterRt(rtr)|>
  plot(type = "XIC")
abline(v = data$rt[i],col = "red")
abline(h = data$mz[i],col = "blue")
XIC

证明他们确实是同一个features
设置合并参数将其合并。

mpp <- MergeNeighboringPeaksParam(expandRt = 2, expandMz = 0.01)
xdata_pp <- refineChromPeaks(dda_data, mpp)
# Evaluating 5 peaks in file PestMix1_DDA.mzML for merging ... OK

#Merging reduced 99 chromPeaks to 99.
#Warning message:
#In serialize(data, node$con) :
#  'package:stats' may not be available when loading

MergeNeighboringPeaksParam函数的参数有4个,分别为:expandRt, expandMz , ppm和 minProp。
expandRt将保留时间窗口向两边扩展多少秒,
expandMz,将每个色谱峰的m/z范围扩大(两边)。
minProp, 数值在0-1之间,表示合并两个峰所需要达到的强度比例。 默认(minProp = 0.75)表示只有当信号的中间部分大于两个峰值的“maxo”(峰值顶点的最大强度)中最小值的75%时,峰才会合并。

比较合并前和合并后的峰形

chr_raw <- chromatogram(dda_data, mz = mzr, rt = rtr)
plot(chr_raw)
abline(v = data$rt[i],col = "red")
chr_raw <- chromatogram(xdata_pp, mz = mzr, rt = rtr)
plot(chr_raw)
abline(v = data$rt[i],col = "red")
chromatogram

合并前后对比

提取上述色谱峰的二级质谱
dda_spectra <- chromPeakSpectra(dda_data)
mcols(dda_spectra) %>% nrow()
#[1] 158
mcols(dda_spectra)$peak_id |>table()
#CP01 CP04 CP05 CP06 CP08 CP11 CP12 CP13 CP14 CP18 CP22 CP25 CP26 
#   3    2    2    2    2    2    2    4    4    1    5    5    6 
#CP33 CP34 CP35 CP36 CP41 CP42 CP44 CP46 CP47 CP48 CP50 CP51 CP52 
#   2    5    5    1    3    5    2    4    3    3    1    3    3 
#CP53 CP57 CP59 CP60 CP61 CP63 CP64 CP65 CP66 CP67 CP69 CP71 CP72 
#   5    5    2    2    2    4    5    1    4    3    3    4    3 
#CP73 CP81 CP82 CP85 CP88 CP89 CP90 CP91 CP93 CP94 CP95 CP98 CP99 
 #  1    4    3    2    2    3    3    3    6    4    1    2    1

共检测到158个二级质谱,有些色谱峰没有二级质谱,如CP02,有些色谱峰又有好几个二级质谱,如CP42。

i = 93
id = rownames(data)
id[i]
ex_spectra_S1 <- dda_spectra[mcols(dda_spectra)$peak_id == id[i]]
ex_spectra_S1
plot(ex_spectra_S1[[1]])
MS2
e = c()
l = length(ex_spectra_S1)
for (i in 1:l){
  tar <- ex_spectra_S1[[i]]
  for (t in 1:l) {
    ex_spectra <- ex_spectra_S1[[t]]
    d <-compareSpectra(tar,ex_spectra, binSize = 0.1,fun = "dotproduct")
    e <-append(e, d)
  }
}
e
matrix <- matrix(e,l,l)
names(ex_spectra_S1)
row.names(matrix)<- colnames(matrix) <- names(ex_spectra_S1)
plot(hclust(as.dist(matrix)))
#data1
pheatmap::pheatmap(matrix,
                   display_numbers = T,
                   cluster_rows = F,
                   cluster_cols = F,
                   number_format = "%.2f")
pheatmap

整合同一个feature的多张图谱

ex_spectrum <- combineSpectra(ex_spectra, method = consensusSpectrum, mzd = 0,
                              ppm = 20, minProp = 0.8, weighted = FALSE,
                              intensityFun = median, mzFun = median)
ex_spectrum
plot(ex_spectrum[[1]])

将整合后的碎片信息光谱与整合前做对比

par(mfrow = c(1, 3))
plot(ex_spectrum[[1]],ex_spectra[[1]])
plot(ex_spectrum[[1]],ex_spectra[[2]])
plot(ex_spectrum[[1]],ex_spectra[[3]])
二级质谱比对.png

比对评分

compareSpectra(ex_spectrum[[1]],ex_spectra[[1]], binSize = 0.02,
               fun = "dotproduct")
compareSpectra(ex_spectrum[[1]],ex_spectra[[2]], binSize = 0.02,
               fun = "dotproduct")
compareSpectra(ex_spectrum[[1]],ex_spectra[[3]], binSize = 0.02,
               fun = "dotproduct")

参考资料:

XCMS官方说明文档
LC-MS/MS data analysis with xcms (bioconductor.org)
使用xcms进行LC-MS数据预处理和分析 • xcms (sneumann.github.io)
Chromatographic peak detection using the centWave method — findChromPeaks-centWave • xcms (sneumann.github.io)
centWave Parameters • msbrowser (tkimhofer.github.io)

上一篇下一篇

猜你喜欢

热点阅读