ChAMP(Chip Analysis Methylation Pipeline)是一个用于Illumina 450K和850K DNA甲基化芯片数据分析的R包。它是一个全面的工具包,可以从数据预处理到差异甲基化分析和功能注释提供一站式解决方案。它特别适用于甲基化数据的批处理分析和高通量研究。
目前ChAMP不仅可以分析原始.idat文件,也可以仅对甲基化beta矩阵和相应的表型进行分析。
ChAMP安装可能会有很多问题,不过耐心安装就能解决。
rm(list = ls())
options(stringsAsFactors = F)
library("ChAMP")
环境中增加5个数据:Anno,hm450.manifest.hg19, multi.hit, myLoad, probe.features
# 450k 肺肿瘤数据集包含8个样本,4个肺肿瘤样本(T)和4个对照样本(C)。
testDir=system.file("extdata",package="ChAMPdata")
myLoad <- champ.load(testDir,arraytype="450K")
# EPIC仿真数据
# data(EPICSimData)
其中myLoad文件整合了beta值和表型信息,其中表型信息的列名是需要借鉴的,因为后续我们可能需要按照这个命名方式来创建自己数据的表型文件。
完整的流程可以通过一个命令运行(基本不会这么用的。。)
champ.process(directory = testDir)
# filter中不需要输入内容,应该是自动检测了是否存在全局变量myImport?
myImport <- champ.import(testDir)
myLoad <- champ.filter()
以上所有过滤步骤都可通过champ.load和champ.filter函数中的参数控制,用户可以根据需求进行调整。需要注意的是,尽管大多数ChAMP功能支持独立的beta矩阵分析(不依赖于.idat文件),但champ.load不能单独对beta矩阵进行过滤。如果用户仅有beta矩阵和Sample_Sheet.csv文件,可以使用champ.filter函数执行过滤,并在后续使用其他函数进行分析。
CpG.GUI(CpG=rownames(myLoad$beta),arraytype="450K")
champ.QC(Feature.sel="None") # None, SVD
mdsPlot:该图基于样本间最具变异性的1000个探针,直观地展示了样本之间的相似性。在图中,样本根据分组(Sample Groups)进行着色。
densityPlot:显示每个样本的Beta值分布;可以利用该图识别显著偏离其他样本的样本,这些样本可能质量不佳(如亚硫酸盐转化不完全)。此外,该图还可用于识别和确认甲基化或未甲基化的对照样本(如果研究中包含这些样本)。
dendrogram:用于展示所有样本的聚类结果。可以选择不同的方法生成此图。在 champ.QC() 函数中,有一个参数 Feature.sel="None"。当参数设为“None”时,样本间的距离将直接基于所有探针计算(若数据集较大,可能导致服务器崩溃)。设为“SVD”时,champ.QC() 函数会采用 SVD 方法对 Beta 矩阵进行分解,并利用 “isva” 包中的 EstDimRMT() 方法选择显著成分,然后基于这些成分计算样本间的距离。
QC.GUI(beta=myLoad$beta,arraytype="450K")
QC.GUI可以产生交互式界面,需要配置较高的电脑。
myNorm <- champ.norm(beta=myLoad$beta,arraytype="450K",cores=5)
在Illumina BeadArray技术中,探针具有两种不同的设计类型(分别称为type-I和type-II),其杂交化学性质存在差异,这导致这两种探针的分布特性也不同。这是一种技术效应,与type-I和type-II探针因生物特性差异(如CpG密度)引起的变异无关。type-I和type-II探针甲基化分布的主要区别在于,type-II探针的动态范围较小。在监督分析中,这可能导致对type-I探针的偏好性选择。对于DMR(差异甲基化区域)检测,由于type-I和type-II探针可能同时位于相同的区域,校正这一偏差至关重要。因此,建议对type-II探针偏差进行校正,用户可以使用champ.norm函数执行此标准化。
champ.SVD(beta = as.data.frame(myNorm), pd = myLoad$pd)
# If Batch detected, run champ.runCombat() here.
# myCombat <- champ.runCombat(beta=myNorm,pd=myLoad$pd,batchname=c("Slide"))
Teschendorff提出的用于甲基化数据的奇异值分解方法(SVD)是一种强大的工具,可用于评估数据集中显著变异成分的数量和性质。这些变异成分理想情况下应与感兴趣的生物学因素相关,但通常也会与技术性变异来源(例如批次效应)相关。建议使用者尽可能收集分析样本的相关信息(例如日期、样本采集的季节、流行病学信息等),并在与SVD成分关联时纳入所有这些因素。如果样本是从.idat文件加载的,那么在champ.SVD()函数中设置参数RGEffect=TRUE时,BeadChip的18个内部探针控制(包括重亚硫酸盐转化效率)将被包括在内。 与旧版本ChAMP包相比,当前版本的champ.SVD()会检测所有有效的协变量进行分析,这意味着生成的图形会包含以下两种情况:
需要特别注意,不同类型的协变量(分类变量和数值型变量)在champ.SVD()中会使用不同的方法计算协变量与成分之间的显著性(分别为Krustal检验和线性回归)。因此,请确保pd对象是一个数据框,并将数值型协变量转换为“numeric”类型,将分类协变量转换为“factor”或“character”类型。如果协变量“Age”被指定为“character”类型,champ.SVD()将无法识别其应作为数值型变量进行分析。因此,我们建议用户对其数据集和pd文件有清晰的理解。
在champ.SVD()运行过程中,所有检测到的协变量都会打印在屏幕上,以便用户检查希望分析的协变量是否正确。结果将以热图形式显示(保存为SVDsummary.pdf),展示与提供的协变量信息相关的前几个主成分。在champ.SVD()中,使用isva包中的随机矩阵理论(Random Matrix Theory)检测潜变量的数量。如果检测到的成分数超过20,仅选择前20个主成分。在热图中,颜色越深表示p值越显著,表明SVD成分与感兴趣因素的关联越强。如果SVD分析显示技术因素占了很大比例的变异,则需实施其他归一化方法(例如ComBat)以帮助去除这些技术性变异。ComBat方法已包含在ChAMP流程中,可用于去除与BeadChip、位置和/或板块相关的变异,也可用于去除SVD分析中揭示的其他批次效应。
注意:在ChAMP的最新版本中,在champ.SVD()中增加了scree图,以帮助用户检查每个成分捕获的方差。用户可以根据捕获的方差确定批次效应的处理。例如,如果在降解分析后,前两个成分捕获了超过80%的方差,则无需关心后续成分中的批次效应,只需关注前两个成分中的显著关联即可。
以上两个图片的结果有助于使用者了解数据的变异来源,比如上述内容显示是PC1占70%+的贡献,其中Sample_Group是最大的变异来源。
# Differential Methylation Probes
myDMP <- champ.DMP(beta = myNorm,pheno=myLoad$pd$Sample_Group)
head(myDMP[[1]])
DMP.GUI(DMP=myDMP[[1]],beta=myNorm,pheno=myLoad$pd$Sample_Group)
DMP.GUI()
DMPtable中可以输出详细的limma差异分析结果信息。
heatmap可视化展示
显示每种CpG特征(例如TSS200、TSS1500、body、opensea、shore等)以及CpG岛(CGI)总结信息在高甲基化(hyperCpGs)和低甲基化(hypoCpGs)中的比例分布。
检测默认基因NFIX,相比于对照样本,该基因在肿瘤组织中具有更高的甲基化(挺有意思的,通常肿瘤中的甲基化情况比正常组织中要低)。
差异甲基化区域(Differentially Methylated Regions, DMRs)是指基因组中在两组样本之间表现出DNA甲基化水平定量变化的扩展片段。ChAMP提供的champ.DMR函数用于计算和返回包含探针数据的差异甲基化区域(DMRs)数据框,并附带相应的P值。
在ChAMP中实现了三种DMR算法:Bumphunter、ProbeLasso和DMRcate。
注意事项:在当前版本的ChAMP中,在champ.DMR中增加了一些严格的检查步骤。champ.DMR现仅接受具有完全两类表型的分类变量。如果分类变量包含多类表型(如“肿瘤”/“转移”/“对照”),请手动选择其中任意两类,并输入相应的beta矩阵和表型信息以进行分析。
myDMR <- champ.DMR(beta=myNorm,pheno=myLoad$pd$Sample_Group,method="Bumphunter")
DMR.GUI(DMR=myDMR)
差异甲基化块(Differentially Methylated Blocks, DMBs)的研究近年来逐渐受到关注。开发者提供了一个函数用于推断DMBs。在块检测函数champ.Bloc中,首先基于基因组上的位置对全基因组进行小簇(区域)的划分。然后,对于每个簇(区域),计算其平均值和平均位置,从而可以将每个区域简化为单个单位。在寻找DMB时,只有来源于opensea的单个单位会被用于聚类分析。接着应用Bumphunter算法在这些经过简化的区域(单位)上检测差异甲基化区域(DMRs)。
myBlock <- champ.Block(beta=myNorm,pheno=myLoad$pd$Sample_Group,arraytype="450K")
Block.GUI(Block=myBlock,beta=myNorm,pheno=myLoad$pd$Sample_Group,runDMP=TRUE,
compare.group=NULL,arraytype="450K")
总之,差异甲基化探针(DMPs)、差异甲基化区域(DMRs)和差异甲基化块(DMBs)是DNA甲基化分析的三个层次。DMPs聚焦于单个位点的甲基化水平差异,适合精准识别关键CpG位点;DMRs通过分析相邻CpG位点的联合变化,揭示基因调控区域的甲基化特征;DMBs则覆盖更大范围的基因组区域,强调大规模甲基化变化的全局性特征,常用于复杂疾病的表观遗传研究。这三者从单个位点到大范围区域,粒度逐渐增大,分析目的从局部精准到全局概览,各有侧重且互为补充。
champ.GSEA 会自动提取基因信息,将CpG位点信息转换为基因信息,然后对每个列表进行GSEA分析。在CpG到基因的映射过程中,如果某基因对应多个CpG位点,该基因只会被计算一次,以避免重复计算。GSEA分析有三种实现方式:
注意: 如果希望校正基因中CpG数量的不均衡偏倚,同时考虑CpG显著性水平,可以将 method 参数设置为 "ebayes" 使用经验贝叶斯方法。否则,可以选择 "gometh" 方法或 "fisher" 方法进行GSEA分析。
1)基因集富集分析
#基因集富集分析
myGSEA <- champ.GSEA(beta=myNorm,DMP=myDMP[[1]], DMR=myDMR, arraytype="450K",adjPval=0.05, method="fisher")
head(myGSEA$DMP$Gene_List)
# [1] "BENPORATH_ES_WITH_H3K27ME3" "TRANSC_FACT" "CAGGTG_V$E12_Q6"
# [4] "CTTTGT_V$LEF1_Q2" "BENPORATH_SUZ12_TARGETS" "BENPORATH_EED_TARGETS"
head(myGSEA$DMR$Gene_List)
# [1] "BENPORATH_EED_TARGETS" "TCCAGAG,MIR-518C" "ATATGCA,MIR-448"
# [4] "BENPORATH_ES_WITH_H3K27ME3" "GGGACCA,MIR-133A,MIR-133B" "chr5q31"
2)经验贝叶斯GSEA方法
myebayGSEA <- champ.ebGSEA(beta=myNorm,pheno=myLoad$pd$Sample_Group,arraytype="450K")
myebayGSEA$EnrichGene$GARGALOVIC_RESPONSE_TO_OXIDIZED_PHOSPHOLIPIDS_BLACK_DN
#[1] "MTSS1" "TARS2" "OSGEPL1" "ZNF22" "ZEB2" "SLC30A1" "ELAC1" "SMAD3" "ABHD10" "PIK3C2B"
# CNV分析
ChAMP工具包提供了champ.CNA函数。此函数使用HumanMethylation450或HumanMethylationEPIC数据检测拷贝数变化。通过利用每个探针的强度值来计算拷贝数并确定是否存在拷贝数变异。拷贝数的计算基于CopyNumber包实现。
基本上,有两种方法可以用于CNA分析:第一种方法是比较病例样本与对照样本之间的拷贝数变化;第二种方法是比较每个样本的拷贝数状态与所有样本的平均拷贝数状态。对于第一种方法,用户可以在pheno参数中指定样本组,或者直接使用ChAMP内置的血液对照样本作为对照组进行拷贝数变异计算。若要使用内置对照组,只需将 control=TRUE 和 controlGroup="champCtls" 赋值即可。对于第二种方法,则可设置 control=FALSE。
champ.CNA会生成两种类型的图:单个样本分析(通过sampleCNA=TRUE参数控制)和每组样本分析(通过 groupFreqPlots=TRUE 参数控制)。与champ.QC函数类似,该函数提供了两个参数用于图形绘制:Rplot 参数用于控制是否在R会话中绘制图形,而 PDFplot 参数用于控制是否将PDF格式的图形保存到 resultsDir。默认情况下,仅 PDFplot 参数为TRUE。
需要注意的是,与旧版本的ChAMP不同,champ.CNA 不会自动对强度数据进行批次校正。如果需要对强度数据进行批次效应校正,请使用 champ.runCombat 函数。对于强度数据的使用方式,与Beta值或M矩阵完全相同,仅需将Beta值替换为 myLoad$intensity,并将 logitTrans=FALSE。
myCNA <- champ.CNA(intensity=myLoad$intensity,pheno=myLoad$pd$Sample_Group
,Rplot=T)
myCNA
注:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多内容可关注公众号:生信方舟
- END -
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。