美文网首页
R package(二):xcms代谢组学初探

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

作者: 佳名 | 来源:发表于2024-05-17 23:13 被阅读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)

    相关文章

      网友评论

          本文标题:R package(二):xcms代谢组学初探

          本文链接:https://www.haomeiwen.com/subject/hhswfjtx.html