Advertisement

代谢组数据分析(十七):基于structToolbox代谢组数据分析全流程讲解

阅读量:

以下是提取后的结果:

结论
struct_Toolbox 是一个强大的R语言工具包,能够有效整合并分析复杂的多标记组学数据集。通过其提供的数据预处理、特征选择、统计分析和机器学习方法,用户可以高效地完成从初始数据加载到最终结果解释的过程。

可视化图表
PCA 分析结果
图片:
VIP 分析结果
图片:
PLS 回归系数
图片:
VIP 和回归系数结合图
图片:
轮廓图
图片:
交叉验证 ROC 曲线
图片:

结论
通过以上分析和可视化图表可以看出:
PCA 成功识别了主要变异方向,并展示了QC样本的分布情况。
VIP 和回归系数 显示了哪些代谢物对分类贡献最大。
PLS 模型 在区分两组样本方面表现优异。
机器学习模型(SVM) 的ROC曲线表明其分类能力可靠。

参考文献
计算 metabolomics 数据库
structToolbox 文档

严禁非商业性转载与二次修改,请仅限于个人学习使用。若需引用部分内容,请后台联系作者以获得授权!

在这里插入图片描述

文章目录

    • 介绍

    • 加载R包

    • 数据下载

    • 导入数据

    • 生成DatasetExperiment数据对象

    • 信号漂移和批次校正

    • 特征过滤

    • 数据标准化、补缺失和转换

    • 探索分析

    • 剔除QC样本

    • PLS分析

    • 单变量分析

    • 多变量分析

      • 将数据分割成训练和测试数据集
      • PLS组分最佳数目
      • PLS模型评估
      • 置换检验评估PLS模型
      • PLS投影结果
      • PLS筛选重要特征
    • 机器学习--支持向量机

      • PLS成分
      • SVM模型
    • 总结

    • 系统信息

    • 参考

介绍

structToolbox 作为一个在代谢组学及多组学数据分析领域广泛应用的工具箱,在数据预处理、统计分析及机器学习方面均整合了大量功能强大的方法。
它不仅提供了标准化的数据分析工作流程的支持,
还通过由 struct 包提供的基于类的模板实现了其方法与工具。
具体而言,
该工具箱包含了预处理环节的一系列操作,
例如信号漂移校正、批次效应校正、标准化以及缺失值插补等。
在单变量分析方面,
它涵盖了 t 检验、方差分析等多种传统统计方法,
同时也提供了非参数检验如 Kruskal-Wallis 检验。
此外,
多变量统计方法部分则集成了 PCA 和 PLS 等经典技术,
其中包含了交叉验证和置换检验等关键步骤以确保模型的有效性。
最后,
STATistics Ontology (STATO) 已被成功整合并实施,
旨在为不同分析方法及其输入输出提供统一的标准术语定义。

structToolbox能够处理代谢组数据主要归因于其整合了自数据预处理至最终的数据统计分析及结果解读的一整套完整数据分析流程。这些功能不仅限于代谢组学领域同样适用于其他类型的组学数据分析。借助这些工具包研究人员能够更加高效地识别生物样本中的特征模式并深入挖掘其变化规律从而推动相关生物学研究取得更大突破。

加载R包

复制代码
    library(tidyverse)
    library(patchwork)
    library(cowplot)
    
    # BiocManager::install("structToolbox")
    # BiocManager::install(c('pmp', 'ropls', 'BiocFileCache'))
    library(structToolbox)
    library(pmp)
    library(ropls)
    library(BiocFileCache)
    library(gridExtra)
    library(openxlsx)
    
    # rm(list = ls())
    options(stringsAsFactors = F)
    options(future.globals.maxSize = 1000 * 1024^2)

数据下载

从下列链接下载所需要的数据:

百度网盘的链接如下所示:**[如何从百度网盘获取数据](https://pan.baidu.com/s/16aqVYAnjQAqHEV(Ofv-wGQ)**。

提取码: nj4a

导入数据

建议在后续的数据处理过程中正确配置文件路径,并须确保能够顺利获取和使用这些数据。

该研究平台的数据集(Direct infusion mass spectrometry metabolomics dataset: a benchmark for data processing and quality control)旨在系统性地评估基于直接输注质谱(DIMS)技术的心脏组织提取物代谢组学研究的可重复性。该数据集包含20个取自牛和羊的生物样本,并按时间跨度为7天划分为8批开展重复分析工作。同时包含一组质量控制(QC)样本用于检测实验过程中的潜在偏差。所有数据均来源于完整的实验工作流程处理步骤,并可通过MetaboLights获取详细信息。

复制代码
    profile <- read.csv("./data/MTBLS79_metabolites.csv", row.names = 1)
    
    head(profile[, 1:6])
    
    metadata <- read.csv("./data/MTBLS79_metadata.csv", row.names = 1)
batch01_QC01> batch01_C05 batch01_S07 batch01_C10
70.03364 28041.86 5749.688 17084.280 48806.23
70.03375 36774.65 8519.561 21218.940 56400.47
70.03413 69573.34 12125.890 40358.150 121724.00
70.03427 10999.77 1420.484 6183.730 19463.35
73.0584 15580.51 9939.475 7765.855 25097.38
73.05853 9710.27 6135.321 4582.207 NA

结果 :代谢物的质谱结果,行名是代谢物,列名是样本名字。

生成DatasetExperiment数据对象

软件包structToolbox采用基于DatasetExperiment的数据对象作为输入参数,并要求将原始文件转换为该特定的数据格式以便进行后续操作。
其中,DatasetExperiment是一个经过优化设计的数据结构,它是Bioconductor社区中广泛使用的Summarized Experiment类的一个扩展版本(\texttt{struct}库提供了一个名为\texttt{as.DatasetExperiment}()的辅助函数用于实现这一功能)。它主要由以下三个关键部分构成:

  1. 数据存储模块
  2. 标注信息管理子系统
  3. 结果展示与分析接口
  • data: 包含测量数据的一个数据框(行名为样本; 列名为特征)。
  • sample_meta: 包含样本相关额外信息的数据框(行名为样本; 列名为标签),例如组标签。
  • variable_meta: 包含变量相关额外信息的数据框(行名为特征; 列名为特征属性),例如注释。
复制代码
    data_frame <- as.data.frame(profile %>% t())
    sample_meta_frame <- metadata
    
    # 使用虚拟variable数据框
    variable_meta_frame <- data.frame(
      idx = 1:ncol(data_frame),
      row.names = colnames(data_frame)
    )
    
    # 构建DE数据对象
    DE <- struct::DatasetExperiment(
      data = data_frame,
      sample_meta = sample_meta_frame,
      variable_meta = variable_meta_frame,
      name = "MTBLS79",
      description = "Converted datasets into DE object")
    
    # 添加样本顺序
    DE$sample_meta$run_order <- 1:nrow(DE)
    
    # 添加样本分组标签
    Type <- as.character(DE$sample_meta$Class)
    Type[Type != 'QC'] <- 'Sample'
    DE$sample_meta$Type <- factor(Type)
    
    # 添加批次分组标签
    DE$sample_meta$batch_qc <- DE$sample_meta$Batch
    DE$sample_meta$batch_qc[DE$sample_meta$Type=='QC'] <- 'QC'
    
    # 离散型变量转换成因子变量
    DE$sample_meta$Batch <- factor(DE$sample_meta$Batch)
    DE$sample_meta$Type <- factor(DE$sample_meta$Type)
    DE$sample_meta$Class <- factor(DE$sample_meta$Class)
    DE$sample_meta$batch_qc <- factor(DE$sample_meta$batch_qc)
    
    DE
复制代码
    A "DatasetExperiment" object
    ----------------------------
    name:          MTBLS79
    description:   Converted datasets into DE object
    data:          172 rows x 2488 columns
    sample_meta:   172 rows x 7 columns
    variable_meta: 2488 rows x 1 columns

结果 :"DatasetExperiment"数据对象是structToolbox的输入数据格式。

获取不同组份数据 (查看不同组份数据,可以通过"$"方法)

DEsample_metaBatch

DE$data

复制代码
    # metadata <- DE$sample_meta
    # 
    # profile <- DE$data

信号漂移和批次校正

该算法被用于减少数据集中的批内和批间变异。该包提供了名为"Quality Control-Robust Spline Correction (QC-RSC)" 的批处理方法。该方法已被封装为名为sb_corr的structToolbox对象。

复制代码
    # batch correction: 设置批次校正的参数
    M <- structToolbox::sb_corr(
      order_col = 'run_order',
      batch_col = 'Batch', 
      qc_col = 'Type', 
      qc_label = 'QC',
      spar_lim = c(0.6,0.8))
    
    M <- model_apply(M, DE)
    
    M
复制代码
    The number of NA and <= 0 values in peaksData before QC-RSC: 18222
    A "sb_corr" object
    ------------------
    name:          Signal/batch correction for mass spectrometry data
    description:   Applies Quality Control Robust Spline (QC-RSC) method to correct for signal drift and batch
                 differences in mass spectrometry data.
    input params:  order_col, batch_col, qc_col, smooth, use_log, min_qc, qc_label, spar_lim 
    outputs:       corrected, fitted 
    predicted:     corrected
    seq_in:        data

考察代谢物200.03196 的质谱数据在批间校正前后的变化情况。经批间效应明显,在后续分析中可见通过批内批间漂移的去除使校正过程已成功消除仪器间的差异性影响。通过struct::predicted可获得经批量标准化处理后的代谢组数据集。

复制代码
    C <- structToolbox::feature_profile(
      run_order = 'run_order',
      qc_label = 'QC',
      qc_column = 'Type',
      colour_by = 'batch_qc',
      feature_to_plot = '200.03196',
      plot_sd = FALSE)
    
    plot_grid(
      (structToolbox::chart_plot(C, M, DE) + ylab('Peak area') + ggtitle('Before')), 
      (structToolbox::chart_plot(C, struct::predicted(M)) + ylab('Peak area') + ggtitle('After')),
      ncol = 2, align = "v"          
      )
在这里插入图片描述

去除未能通过QC-RSC校正的代谢物样本。QCRCMS 实际上是指 Quality Control-Robust Spline Correction ,即质量控制稳健样条校正方法。它是一种用于应对质谱数据信号漂移及批次效应影响的数据处理算法。该算法已被集成到pmp软件包中,并能够有效应对质谱数据中的信号漂移和批次效应问题。每个分析批次中至少需要4个可测量的质量控制(QC)样本数据点才能应用此算法进行处理。当某个特征的质量控制样本数量低于设定阈值时,在该特征上不会应用信号校正措施。

复制代码
    M2 <- structToolbox::filter_na_count(
      threshold = 3,
      factor_name = 'Batch')
    
    M2 <- structToolbox::model_apply(M2, struct::predicted(M))
    
    # QC-RSC未能校正的代谢物数目
    nc <- ncol(DE) - ncol(struct::predicted(M2))
    
    cat(paste0('Number of features removed: ', nc))

Number of features removed: 425

特征过滤

该研究采用了三个过滤步骤对MTBLS79 数据集进行处理。第一步采用了_Kruskal-Wallis_检验来筛选出不可靠检测的所有批次质量控制(QC)样本特征(p < 0.0001)。遵循与原始文章相同的参数设置,在多重检验校正方面未采取任何措施(即mtc参数设为'none')。

为了实现基于单一特征的过滤功能,在实际应用中我们主要依赖于某些特定工具的功能模块。通过指定与预测结果相关的两个关键属性槽——即(predicted)和(seq_in),我们能够确保单变量测试模块与特征过滤器之间建立正确的数据通路;这一数据通路是通过调用_filter_by_name方法来进行配置并完成连接操作的。此外,在模型预测结果中提取出所需的相关列信息的任务则由另一个属性槽(seq_fcn)负责执行;特别地,在'names'参数位置上使用了一个占位符(names = 'placeHolder'),因为该输入将由seq_fcn操作后的输出进行替代。

复制代码
    M3 <- structToolbox::kw_rank_sum(
      alpha = 0.0001,
      mtc = 'none',
      factor_names = 'Batch',
      predicted = 'significant') +
      structToolbox::filter_by_name(
    mode = 'exclude',
    dimension = 'variable',
    seq_in = 'names', 
    names = 'seq_fcn', 
    seq_fcn = function(x){return(x[, 1])})
    
    M3 <- structToolbox::model_apply(M3, struct::predicted(M2))
    
    nc <- ncol(struct::predicted(M2)) - ncol(struct::predicted(M3))
    
    cat(paste0('Number of features removed: ', nc))

Number of features removed: 262

在第二个阶段中使用的统计检验方法为 Wilcoxon Signed-Rank test ,这有助于识别出与生物样品均值无显著差异的特征(p值小于1e-14)。同时,在我们的分析中还应用了seq_in和seq_fcn这两个关键属性字段。

调用该工具包中的函数,并对变量进行筛选处理。筛选出非"significant"标记的逻辑向量。此处"significant"意指统计意义上的显著性。例如,在特定测试或分析中被识别为重要变量。筛选过程将根据变量名称来进行。

复制代码
    M4 <- structToolbox::wilcox_test(
      alpha = 1e-14,
      factor_names = 'Type', 
      mtc = 'none', 
      predicted = 'significant') +
      structToolbox::filter_by_name(
    mode = 'exclude',
    dimension = 'variable',
    seq_in = 'names', 
    names = 'place_holder',
    seq_fcn = function(x){return(x$significant)})
    
    M4 <- structToolbox::model_apply(M4, struct::predicted(M3))
    
    # M4[2]@filtered$sample_meta
    
    nc <- ncol(struct::predicted(M3)) - ncol(struct::predicted(M4))
    cat(paste0('Number of features removed: ', nc))

Number of features removed: 169

在研究中采用**相对标准偏差(RSD)**这一指标对具有高分析变异特性的化合物进行筛选(QC组中的RSD值大于20的化合物被筛选出来)。为了确保实验数据的高度可靠性以及分析过程的一致性,在代谢物研究领域广泛采用相对标准偏差(RSD)作为判断依据和过滤标准。此统计指标能够有效衡量一组数据内部数值波动的程度,并通过将标准偏差与平均值进行对比计算出无量纲比率。这一特性使得不同实验条件下的数据比较更加科学合理

复制代码
    M5 <- structToolbox::rsd_filter(
      rsd_threshold = 20,
      factor_name = 'Type')
    
    M5 <- structToolbox::model_apply(M5, struct::predicted(M4))
    
    nc <- ncol(struct::predicted(M4)) - ncol(struct::predicted(M5))
    cat(paste0('Number of features removed: ', nc))

Number of features removed: 53

分析结果表明:通过多重筛选流程获得的代谢物被成功应用于后续研究。(1)不同测序仪器带来的技术差异;(2)实验条件的影响因素;(3)潜在的技术优化空间。

在进行代谢组学研究时, 采用_Kruskal-Wallis_检验是一种至关重要手段, 用于识别各批次质量控制(QC)样本中的不可靠检测物质。由于所收集的数据来自多个批次, 若某一物质在其来源的不同批次间呈现显著差异, 则可能表明该物质在其来源的不同批次间表现出不稳定性。其特性若被保留下来, 将可能会影响后续分组间的差异分析结果, 导致最终分析结果出现偏差。此时, 研究者可能需要将其从后续分析中剔除, 以确保研究结论的有效性和可靠性

为了确保所选代谢物能够代表生物学样本的真实情况,在分析过程中我们会使用wilcox_test函数进行数据过滤。这种筛选方法旨在去除那些主要由技术和实验变异性引起而非真实生物差异导致的潜在'噪声'代谢物。具体而言,在分析过程中我们设定一个显著性水平(如P<0.05),计算得到的P值低于设定的标准时就表明该化合物在QC样品与生物样品间的差异具有统计学意义。然而需要注意的是,在这种情况下化合物可能受到实验条件或处理方式的影响从而导致这些化合物不适合作为后续研究的核心指标。

RSD 常被用来评估质控(QC)样品 的稳定性和可靠性。当某一种类在QC样品中的相对标准偏差(RSD)超过20%时,则提示其检测结果存在较大的变异程度。这种情况下建议将该物质视为具有较高的分析变异性,并将其从后续的数据处理过程中剔除以避免影响结果的有效性。通过这种过滤步骤可以显著提高后续统计分析的准确性。

数据标准化、补缺失和转换

本研究中实施了一系列常规的预处理步骤至经过筛选的峰矩阵数据中,并参照了Kirwan在《Direct infusion mass spectrometry metabolomics dataset: a benchmark for data processing and quality control》一文中所描述的标准做法。

Probabilistic Quotient Normalisation (PQN):以QC样本为基准,在计算过程中采用中位数值。

k-nearest neighbours imputation (k = 5):最近邻插补缺失值

Generalised log transform (glog):对数转换

这些步骤通过基于样本浓度差异、修复缺失值以及对数据进行了标准化处理,并被用来准备多变量分析的数据。

复制代码
    M6 <- structToolbox::pqn_norm(
    qc_label = 'QC',
    factor_name = 'Type') + 
      structToolbox::knn_impute(neighbours = 5) +
      structToolbox::glog_transform(
    qc_label = 'QC',
    factor_name = 'Type')
    
    M6 <- structToolbox::model_apply(M6, struct::predicted(M5))

探索分析

PCA查看高纬度数据,在二维平面查看第一和第二主成份。

复制代码
    # PCA
    M7 <- structToolbox::mean_centre() + 
      structToolbox::PCA(number_components = 2)
    M7 <- structToolbox::model_apply(M7, struct::predicted(M6))
    
    # plot pca scores
    C <- structToolbox::pca_scores_plot(
      factor_name = c('Sample_Rep','Class'),
      ellipse = 'none')
    
    C2 <- structToolbox::pca_scores_plot(
      factor_name = c('Batch'),
      ellipse = 'none')
    
    plot_grid(
      (structToolbox::chart_plot(C, M7[2]) + coord_fixed() + guides(colour = FALSE)), 
      (structToolbox::chart_plot(C2, M7[2]) + coord_fixed()),
      ncol = 2, align = "v"          
      )
在这里插入图片描述

主成分分析法(PCA)相关的相关图表涉及Scree图、载荷图以及D统计量图。在PCA分析中具有重要地位的图表,在实际应用中能够帮助深入解析数据的内部规律。

Scree图:在PCA分析中,Scree图被用作确定主成分数量的一种表现形式。它反映了每个主成分所解释的方差量,并通常用于判断在某个临界点之后增加新的主成分对解释总方差的贡献变得微不足道的情况发生时,在此之前应选择多少个主要的主成分来进行后续分析。

载荷图 是一种直观的可视化工具,在主成分分析中具有重要的应用价值。它不仅展示了各个变量在主成分中的权重分布情况(即各变量对主成分的重要性的体现),而且通过观察载荷图能够明确识别出哪些关键变量对主成分具有显著影响。这种分析方法不仅有助于降低数据维度的数量化处理,并且能够保留关键的信息特征。

D统计量图 :一种用于评估样本偏离主成分分析(PCA)模型显著程度的统计方法。其作为度量工具,在衡量样本在主成分分析模型中的分散程度方面发挥重要作用。其数值超过特定临界值的样本通常被视为异常观测或离群点。

复制代码
    # PCA
    M7 <- structToolbox::mean_centre() + 
      structToolbox::PCA(number_components = 6)
    M7 <- structToolbox::model_apply(M7, struct::predicted(M6))
    
    C <- structToolbox::pca_scree_plot()
    g1 <- structToolbox::chart_plot(C, M7[2])
    
    C <- structToolbox::pca_loadings_plot()
    g2 <- structToolbox::chart_plot(C, M7[2])
    
    C <- structToolbox::pca_dstat_plot(alpha = 0.95)
    g3 <- structToolbox::chart_plot(C, M7[2])
    
    p1 <- plot_grid(plotlist = list(g1, g2), align = 'h', nrow = 1, axis = 'b')
    p2 <- plot_grid(plotlist = list(g3), nrow = 1)
    
    plot_grid(p1 ,p2, nrow = 2, align = "v")
在这里插入图片描述

结果 :主成分分析(PCA)相关的诊断图

PC1和PC2贡献了59.2%的累积贡献率(Screen图);

各变量对主成分的贡献程度(loadings图);

D-统计量可用于识别主成分得分空间中偏离其他样本位置的点。若单个样本的D-统计量超出预设显著性水平(如默认0.05),则该样本可能不符合数据集 typical pattern, 应进一步调查或从分析中剔除。通过图形分析可以看出共有6个样本属于异常情况。

剔除QC样本

复制代码
    QC_paras <- structToolbox::filter_by_name(
      mode = "exclude",
      dimension = "sample",
      names = grep("QC", rownames(struct::predicted(M6)$sample_meta), value = T))
    DE_new <- structToolbox::model_apply(QC_paras, struct::predicted(M6))
    
    
    # QC_paras <- structToolbox::filter_smeta(
    #   mode = 'include',
    #   factor_name = 'Class',
    #   levels = c('C', 'S'))
    # DE_new <- structToolbox::model_apply(QC_paras, struct::predicted(M6))
    
    DE_new
复制代码
    A "filter_by_name" object
    -------------------------
    name:          Filter by name
    description:   Filter samples/variables by row/column name, index or logicals.
    input params:  mode, dimension, names 
    outputs:       filtered 
    predicted:     filtered
    seq_in:        data

PLS分析

Partial Least Squares (PLS) technique是一种多元统计方法,在处理因变量和自变量间存在多重共线性问题时展现出显著的有效性。该方法的核心思想在于通过寻找到一组新的正交投影方向(主成分),使得这些投影后的因变量与自变量之间的协方差达到最大值。相较于传统的主成分回归方法(PCR),PLS在降维过程中更加注重因变量与自变量的相关性考量,并因此能够在有效降低数据维度的同时尽可能地提高预测效果。

复制代码
    M <- structToolbox::autoscale() + 
      structToolbox::PLSDA(factor_name = 'Class')
    
    M <- structToolbox::model_apply(M, struct::predicted(DE_new))
    
    C <- structToolbox::pls_scores_plot(factor_name = 'Class')
    
    structToolbox::chart_plot(C, M[2])
在这里插入图片描述

用于在structToolbox中评估模型的值时,请确保所使用的统计方法是回归分析而非判别分析。这一步骤要求我们在建立预测模型之前,必须将分类变量转换为数值型数据。

该模型的拟合优度指标值即称为决定系数(coefficient of determination),它是一个用于评估回归模型对观测数据变化趋势描述能力的重要统计量

  • 当自变量能够解释的因变量变化量达到最低程度时(即R^2值为0),说明该模型无法对因变量产生任何解释能力。
  • 当自变量能够完全预测因变量的变化(即R^2值为1)时,则表明该模型完美地预测了因变量的行为。

在实际应用中,在使用 这一指标时发现数值越大通常意味着模型具有更强的解释能力和更高的预测准确性。然而,并非所有高 的情况都表明模型最优。事实上,在训练数据上表现优异的模型可能会在新的数据上表现不佳。

当对模型进行比较时,在分析过程中通常会采用**调整后的R²值(adjusted R²)**这一指标。其主要原因在于该指标会对引入过多变量所带来的问题予以惩罚,并综合考量自变量的数量与样本量等因素的影响结果;这样一来有助于建立一个更为合理的结果对比标准。

复制代码
    # convert gender to numeric
    DE_filter <- struct::predicted(DE_new)
    
    DE_filter$sample_meta$Class <- as.numeric(DE_filter$sample_meta$Class)
    
    # models sequence
    M <- structToolbox::autoscale(mode = 'both') + 
      structToolbox::PLSR(
    factor_name = 'Class', 
    number_components=3)
    
    M <- structToolbox::model_apply(M, DE_filter)
    
    # some diagnostic charts
    C <- structToolbox::plsr_cook_dist()
    g1 <- structToolbox::chart_plot(C, M[2])
    
    C <- structToolbox::plsr_prediction_plot()
    g2 <- structToolbox::chart_plot(C, M[2])
    
    C <- structToolbox::plsr_qq_plot()
    g3 <- structToolbox::chart_plot(C, M[2])
    
    C <- structToolbox::plsr_residual_hist()
    g4 <- structToolbox::chart_plot(C, M[2])
    
    plot_grid(plotlist = list(g1, g2, g3, g4), 
          nrow=2, align='vh')
在这里插入图片描述

结果 :PLSR模型(偏最小二乘回归)相关的诊断图。

Cook's Distance (plsr_cook_dist) is employed to identify outliers that significantly impact the model. Cook's Distance measures the influence of each observation (data point) on the model's parameter estimates. Points with notably large values may exert significant influence on the model.

预测值图表 (plsr_prediction_plot): 该图表用于展示实际观测值与模型预测值之间的对比关系,并辅助评估模型的预测能力。-1分别表示两个不同的类别。在最佳情况下(即当模型完全准确时),所有点应精确落在X=Y这条直线上,并被称作'完美预测线'或'对角线'

该QQ图(`plsr_qq_plot$``):亦称 Quantile-Quantile 图,在检验模型残差是否服从正态分布方面具有重要意义

残差直方图 (plsr_residual_hist): 呈现了残差的分布情况,并用于评估这些残差是否随机且无规律地分布。

对PLSDA模型的性能进行交叉验证评估。

复制代码
    # model sequence
    M <- structToolbox::kfold_xval(
      folds = 5, 
      factor_name = 'Class') * 
      (structToolbox::autoscale(mode = 'both') + 
     structToolbox::PLSR(factor_name = 'Class'))
    M <- structToolbox::run(M, DE_filter, structToolbox::r_squared())
    
    print(paste0("Training set R2: ", paste(round(M@metric.train, 4), collapse = ";")))
    
    print(paste0("Test set Q2: ", round(M@metric.test, 4)))

模型的有效性可以通过置换测试进一步评估

复制代码
    # reset gender to original factor
    DE_filter$sample_meta$Class <- droplevels(struct::predicted(DE_new)$sample_meta$Class)
    # model sequence
    M <- structToolbox::permutation_test(
      number_of_permutations = 10, 
      factor_name = 'Class') *
    structToolbox::kfold_xval(
      folds = 5,
      factor_name = 'Class') *
    (structToolbox::autoscale() + 
       structToolbox::PLSDA(
         factor_name = 'Class',
         number_components = 3))
    
    M <- structToolbox::run(M, DE_filter, structToolbox::balanced_accuracy())
    
    C <- permutation_test_plot(style = 'boxplot')
    
    chart_plot(C, M) + ylab('1 - balanced accuracy')
在这里插入图片描述

评估结果表明

单变量分析

单变量分析涵盖多种假设检验方法,并包含学生t检验作为重要组成部分。该分析分别针对每个代谢物进行差异性检验。随后为了解决多重比较带来的假阳性问题,在完成所有检验后对结果进行了多重检验校正处理。通过这种做法,在处理多个比较时也能保持统计结论的一致性和可靠性。

复制代码
    # prepare model
    TT <- structToolbox::filter_smeta(
      mode = 'include',
      factor_name = 'Class',
      levels = c('C', 'S')) +  
      structToolbox::ttest(
    alpha = 0.05,
    mtc = 'fdr',
    factor_names = 'Class')
    
    # apply model
    TT <- structToolbox::model_apply(TT, struct::predicted(M6))
    
    # keep the data filtered by group for later
    filtered <- struct::predicted(TT[1])
    
    # convert to data frame
    out <- structToolbox::as_data_frame(TT[2])
    
    # show first few features
    head(out)
t_statistic t_p_value t_significant estimate.mean.C estimate.mean.S lower upper
70.03364 9.954107 1.839070e-16 TRUE 11.06976 10.57487 0.3963493 0.5934151
70.03375 10.227661 2.306557e-17 TRUE 11.21056 10.67474 0.4320660 0.6395726
70.03413 7.865716 4.507929e-12 TRUE 12.01761 11.35339 0.4970363 0.8313919
70.03427 12.602856 1.338129e-22 TRUE 10.46932 10.16630 0.2553816 0.3506463
73.0584 16.889939 3.619669e-30 TRUE 10.71913 10.22243 0.4383544 0.5550402
73.05882 20.888786 2.193352e-37 TRUE 11.27117 10.45760 0.7363133 0.8908291

实验结果表明,在两组之间进行了T检验分析。通过调用库函数structToolbox::wilcox_test实现了Wilcoxon rank-sum检验方法的计算过程。

多变量分析

偏最小二乘判别分析(PLSDA)是一种能够识别差异性代谢物的统计方法。该技术通过解析代谢物的表达数据,并结合多元统计方法来识别不同样本组中存在显著差异的代谢物。在执行PLSDA分析时,默认情况下会使用回归系数(Regression coefficients)和VIP(Variable Importance in Projection)指标来鉴定关键代谢物质。

  1. 回归系数 :在PLSDA模型中,回归系数用于量化每个代谢物对模型的贡献程度。一个较大的回归系数表明该代谢物在模型中具有较大的影响力,可能在不同组别间存在显著差异。
  2. VIP评分 :VIP评分是PLSDA分析中的一个关键指标,用于衡量每个代谢物对样本分类的贡献大小。VIP值大于1通常表示该代谢物在模型中的重要性较高,可能是一个潜在的差异代谢物。

采用PLSDA方法进行差异代谢物筛选时, 常将回归系数与VIP分数作为筛选依据. 如可选择具有较大回归系数绝对值且VIP分数高于1的化合物作为潜在差异化合物. 此外, 为了进一步验证这些潜在差异化合物的统计学显著性, 还会执行多重假设检验校正, 如Bonferroni校正或FDR(False Discovery Rate)校正, 以控制假阳性率.

将数据分割成训练和测试数据集

复制代码
    QC_paras <- structToolbox::filter_smeta(
      mode = 'include',
      factor_name = 'Class',
      levels = c('C', 'S'))
    DE <- structToolbox::model_apply(QC_paras, struct::predicted(M6))
    
    DE_filter <- struct::predicted(DE)
    DE_filter$sample_meta$Class_num <- as.numeric(DE_filter$sample_meta$Class)
    
    # prepare model
    set.seed(123)
    M <- structToolbox::stratified_split(
      p_train = 0.75,
      factor_name = 'Class')
    # apply to filtered data
    M <- structToolbox::model_apply(M, DE_filter)
    
    # get data from object
    train <- M$training
    train
    
    cat('\n')
    test <- M$testing
    test
复制代码
    A "DatasetExperiment" object
    ----------------------------
    name:          (Training set)
    description:   A subset of the data has been selected as a training set
    data:          100 rows x 1579 columns
    sample_meta:   100 rows x 8 columns
    variable_meta: 1579 rows x 1 columns
    
    A "DatasetExperiment" object
    ----------------------------
    name:          (Testing set)
    description:   A subset of the data has been selected as a test set
    data:          34 rows x 1579 columns
    sample_meta:   34 rows x 8 columns
    variable_meta: 1579 rows x 1 columns

PLS组分最佳数目

通过k折交叉验证法来确定最佳偏最小二乘模型的分量数量。基于100次自助抽样的迭代过程构建置信区间,在软件包structToolbox中实现了相关功能模块,并支持与模型对象协同工作。以R²值作为评价标准,在本研究中将采用软件包structToolbox中的偏最小二乘回归(PLSR)模块进行建模。为了加快计算速度,在此研究中选择仅进行10次自助抽样循环。需要注意的是,在应用此方法之前必须将分类变量转化为数值型数据。

复制代码
    # prepare model sequence
    MS <- structToolbox::grid_search_1d(
      param_to_optimise = 'number_components',
      search_values = as.numeric(c(1:6)),
      model_index = 2,
      factor_name = 'Class_num',
      max_min = 'max') *
      structToolbox::permute_sample_order(
    number_of_permutations = 10) *
      structToolbox::kfold_xval(
    folds = 5,
    factor_name = 'Class_num') * 
      (structToolbox::mean_centre(mode = 'sample_meta') + 
     structToolbox::PLSR(factor_name = 'Class_num'))
    
    # run the validation
    MS <- struct::run(MS, train, structToolbox::r_squared())
    
    # plot
    C <- structToolbox::gs_line()
    
    structToolbox::chart_plot(C, MS)
在这里插入图片描述

研究结果表明,在图中建议采用PLS模型,并确定其成分数量为3个。从而确定最佳模型参数。值得注意的是,在重复计算过程中发现结果并不一致(第一次得到3个成分模型参数值),这可能提示数据可能存在一定的波动性

PLS模型评估

复制代码
    # prepare the discriminant model
    P <- structToolbox::PLSDA(
      number_components = 3, 
      factor_name = 'Class')
    
    # apply the model
    fit <- structToolbox::model_apply(P, train)
    
    # charts
    C <- structToolbox::plsda_predicted_plot(
      factor_name = 'Class',
      style = 'boxplot')
    g1 <- structToolbox::chart_plot(C, fit)
    
    C <- structToolbox::plsda_predicted_plot(
      factor_name = 'Class',
      style = 'density')
    g2 <- structToolbox::chart_plot(C, fit) + 
      xlim(c(-2, 2))
    
    C <- structToolbox::plsda_roc_plot(factor_name = 'Class')
    g3 <- structToolbox::chart_plot(C, fit)
    
    plot_grid(g1, g2, g3,
          align = 'vh', axis = 'tblr',
          nrow = 1, labels = c('A', 'B', 'C'))
在这里插入图片描述

结果 :在A-C能看到PLS模型能够有效区分C和S组。

复制代码
    # AUC for comparison 
    MET <- structToolbox::calculate(
      structToolbox::AUC(), 
      fit$y$Class,
      fit$yhat[, 1])
    
    MET
复制代码
    A "AUC" object
    --------------
    name:          Area under ROC curve
    description:   The area under the ROC curve of a classifier is estimated using the trapezoid method.
    value:         1

置换检验评估PLS模型

置换检验评估观察到的结果有多大可能是偶然发生的。

复制代码
    # model sequence
    MS <- structToolbox::permutation_test(
      number_of_permutations = 20,
      factor_name = 'Class_num') * 
      structToolbox::kfold_xval(
    folds = 5,
    factor_name = 'Class_num') *
      (structToolbox::mean_centre(mode = 'sample_meta') + 
     structToolbox::PLSR(factor_name = 'Class_num', number_components = 3))
    
    # run iterator
    MS <- struct::run(MS, train, structToolbox::r_squared())
    
    # chart
    C <- structToolbox::permutation_test_plot(style = 'density') 
    
    structToolbox::chart_plot(C, MS) + xlim(c(-1, 1)) + xlab('R Squared')
在这里插入图片描述

分析结果显示被直接比较的非置换结果的R2值明显高于被随机比较的非置换结果值,并表明PLS模型选择的代谢物能够有效地区分两组样本。

PLS投影结果

采用样本代谢物数据进行二维降维处理,并结合分组标记分析其呈现何种特征。

复制代码
    # prepare the discriminant model
    P <- structToolbox::PLSDA(
      number_components = 2, 
      factor_name = 'Class')
    
    # apply the model
    P <- structToolbox::model_apply(P, train)
    
    C <- structToolbox::pls_scores_plot(components = c(1, 2), factor_name = 'Class')
    structToolbox::chart_plot(C, P)
在这里插入图片描述

PLS筛选重要特征

在应用PLS-DA分析方法时,通常会通过计算回归系数(Regression coefficients)和VIP(Variable Importance in Projection)评分来识别差异代谢物特征.

回归系数:在偏最小二乘判别分析(PLSDA)模型中,“回归系数”的计算结果用于衡量每个化合物对样本间分组差异的影响程度。“其数值较大”的特征表明这些化合物可能在其所属的生物功能类别中具有特殊作用,并且这种作用可能与分组间的生物学变化有关。
VIP评分:其计算结果为VIP值,在PLSDA分析中被用作判断各变量重要性的标准。“其数值越大,则表明该化合物对样本分类的影响越显著”。当VIP值超过1时,则提示该化合物可能是关键影响因素。

复制代码
    # prepare chart
    C <- structToolbox::pls_vip_plot(ycol = 'C')
    g1 <- structToolbox::chart_plot(C, P)
    
    C <- structToolbox::pls_regcoeff_plot(ycol = 'C')
    g2 <- structToolbox::chart_plot(C, P)
    
    plot_grid(g1, g2, align = 'hv', axis = 'tblr', nrow = 2)
在这里插入图片描述

结果:可以选择" C "组对代谢物对应的VIP值及回归系数进行查看,并根据筛选需求来确定具体的筛选标准(通常建议将VIP值设定为大于等于1)。

机器学习–支持向量机

通过偏最小二乘(PLS)方法对代谢物数据矩阵进行降维处理后,在代谢物数据矩阵中提取出2个PLS分量能够充分解释其变异性。在此基础上选取此3个分量作为特征变量构建支持向量机(SVM)分类模型,并以实现对不同类别样本的精确判别。

PLS成分

复制代码
    QC_paras <- structToolbox::filter_smeta(
      mode = 'include',
      factor_name = 'Class',
      levels = c('C', 'S'))
    DE <- structToolbox::model_apply(QC_paras, struct::predicted(M6))
    
    DE_filter <- struct::predicted(DE)
    DE_filter$sample_meta$Class_num <- as.numeric(DE_filter$sample_meta$Class)
    
    # model sequence and pls model (NB data already centred)
    MS <- structToolbox::PLSDA(factor_name = 'Class', number_components = 2)
    
    # apply PLS model
    MS <- structToolbox::model_apply(MS, DE_filter)
    
    # plot the data
    C <- structToolbox::pls_scores_plot(factor_name = 'Class')
    
    structToolbox::chart_plot(C, MS)
    
    # new DatasetExperiment object from the PLS scores
    DE2 <- struct::DatasetExperiment(
      data = MS$scores$data, 
      sample_meta = DE_filter$sample_meta,
      variable_meta = data.frame('LV' = c(1:2), row.names = colnames(MS$scores)),
      name = 'Illustrativate SVM dataset',
      description = 'Generated by applying PLS to the processed Metabolites data')
    
    DE2
复制代码
    A "DatasetExperiment" object
    ----------------------------
    name:          Illustrativate SVM dataset
    description:   Generated by applying PLS to the processed Metabolites data
    data:          134 rows x 2 columns
    sample_meta:   134 rows x 8 columns
    variable_meta: 2 rows x 1 columns

SVM模型

该模型即支持向量机(Support Vector Machine),作为机器学习领域中被广泛采用的一种监督学习方法,在分类与回归问题上均表现出色。其核心理念在于于特征空间中寻找一个具有最大间隔的最优超平面以区分各类别数据,并且这一特性使其在区分度上具有显著优势。在分类器模型中SVM的功能在于确定数据点所属的具体类别它通过最大化两类之间的间隔来构建决策边界这一超平面也被称为分类器的分界面线SVM特别适合处理高维数据以及线性不可分的问题通过核技巧(Kernel Trick)它能够在高维空间中实现对非线性可分数据的有效分类。

SVM模型的另一个重要特性是其稀疏性质,即由这些支持向量(靠近超平面的训练样本点)决定决策边界的位置。因此不会影响分类结果。此外,在处理大规模数据集时,该方法具有较高的计算效率和良好的泛化性能。

复制代码
    # SVM model
    M <- structToolbox::SVM(
      factor_name = 'Class',
      kernel = 'linear')
    
    # apply model
    M <- structToolbox::model_apply(M, DE2)
    
    # low cost
    M$cost <- 0.01
    M <- structToolbox::model_apply(M, DE2)
    C <- structToolbox::svm_plot_2d(factor_name = 'Class')
    g1 <- structToolbox::chart_plot(C, M, DE2)
    
    # medium cost
    M$cost <- 0.05
    M <- structToolbox::model_apply(M, DE2)
    C <- structToolbox::svm_plot_2d(factor_name = 'Class')
    g2 <- structToolbox::chart_plot(C, M, DE2)
    
    # high cost
    M$cost <- 100
    M <- structToolbox::model_apply(M, DE2)
    C <- structToolbox::svm_plot_2d(factor_name = 'Class')
    g3 <- structToolbox::chart_plot(C, M, DE2)
    
    # plot
    prow <- plot_grid(
      g1 + theme(legend.position = "none"),
      g2 + theme(legend.position = "none"),
      g3 + theme(legend.position = "none"),
      align = 'vh',
      labels = c("Low cost", "Medium cost", "High cost"),
      hjust = -1,
      nrow = 2
    )
    
    legend <- get_legend(
      # create some space to the left of the legend
      g1 + guides(color = guide_legend(nrow = 1)) +
      theme(legend.position = "bottom")
    )
    
    plot_grid(prow, legend, ncol=1, rel_heights = c(1, .1))
在这里插入图片描述

结果 :因为两组本身差异就很大,使用不同的C值区别不大。

总结

StructToolbox 是一种用于分析代谢组学与其他领域数据集的 R 软件包。该软件通过一系列的方法有效地处理和分析代谢组数据以适应高维数据分析的需求。本文中的教程提供了详细的示例供用户作为学习或应用参考。

系统信息

复制代码
    R version 4.3.3 (2024-02-29)
    Platform: aarch64-apple-darwin20 (64-bit)
    Running under: macOS Sonoma 14.2
    
    Matrix products: default
    BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 
    LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.0
    
    locale:
    [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
    
    time zone: Asia/Shanghai
    tzcode source: internal
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    other attached packages:
     [1] structToolbox_1.17.3 struct_1.14.1        cowplot_1.1.3        patchwork_1.2.0      lubridate_1.9.3      forcats_1.0.0       
     [7] stringr_1.5.1        dplyr_1.1.4          purrr_1.0.2          readr_2.1.5          tidyr_1.3.1          tibble_3.2.1        
    [13] ggplot2_3.5.1        tidyverse_2.0.0     
    
    loaded via a namespace (and not attached):
     [1] SummarizedExperiment_1.32.0 gtable_0.3.4                xfun_0.43                   Biobase_2.62.0             
     [5] lattice_0.22-6              tzdb_0.4.0                  vctrs_0.6.5                 tools_4.3.3                
     [9] bitops_1.0-7                generics_0.1.3              stats4_4.3.3                fansi_1.0.6                
    [13] pkgconfig_2.0.3             Matrix_1.6-5                S4Vectors_0.40.2            lifecycle_1.0.4            
    [17] GenomeInfoDbData_1.2.11     compiler_4.3.3              munsell_0.5.0               GenomeInfoDb_1.38.8        
    [21] RCurl_1.98-1.14             pillar_1.9.0                crayon_1.5.2                DelayedArray_0.28.0        
    [25] abind_1.4-5                 tidyselect_1.2.1            stringi_1.8.3               ggthemes_5.1.0             
    [29] grid_4.3.3                  colorspace_2.1-0            cli_3.6.3                   SparseArray_1.2.4          
    [33] magrittr_2.0.3              S4Arrays_1.2.1              utf8_1.2.4                  withr_3.0.0                
    [37] scales_1.3.0                sp_2.1-3                    timechange_0.3.0            XVector_0.42.0             
    [41] matrixStats_1.2.0           gridExtra_2.3               hms_1.1.3                   knitr_1.45                 
    [45] GenomicRanges_1.54.1        IRanges_2.36.0              rlang_1.1.4                 ontologyIndex_2.12         
    [49] glue_1.7.0                  BiocGenerics_0.48.1         rstudioapi_0.16.0           R6_2.5.1                   
    [53] MatrixGenerics_1.14.0       zlibbioc_1.48.2

参考

转录代谢组学中的数据解析与分析方法采用了基于结构工具箱(Struct Toolbox)的技术框架。

全部评论 (0)

还没有任何评论哟~