一、甲基化芯片检测
1.1 DNA甲基化
DNA甲基化是表观遗传学的中最为常见的一种修饰,其主要形式包括:5-甲基胞嘧啶 (5-mC)、少量的N6-甲基腺嘌呤 (N6-mA) 以及7-甲基鸟嘌呤(7-mG)。
目前常说的DNA甲基化一般指CpG岛甲基化,即在DNA甲基化转移酶(DNMTs)的作用下使CpG二核苷酸5’端的胞嘧啶转变为5’甲基胞嘧啶。
CpG岛(CpG islands):指CpG序列密度相比整个基因组来说是特别高的富集区域,一般位于启动子附近,5’端非翻译区或第一个外显子;一般CpG岛序列长度在500bp以上,GC含量高于55%以及CpG出现比率大于0.65,40%的启动子区域含有CpG岛。
CpG shores指距CpG岛边缘2kb的区域
CpG shelves是指距CpG岛边缘4kb的区域
1.2 甲基化芯片原理
甲基化芯片的原理是基于亚硫酸盐处理后的DNA序列杂交的信号探测。
- 亚硫酸盐是甲基化探测的“金标准”,不管是芯片或者甲基化测序,都要先对DNA样品进行亚硫酸盐处理,使非甲基化的C变成U,而甲基化的C保持不变,从而在后续的测序或者杂交后区分出来。
- 450K采用了两种探针对甲基化进行测定,Infinium I采用了两种bead(甲基化M和非甲基化U,如图显示),而Infinium II只有一种bead(即甲基化和非甲基化在一起),这也导致了它们在后续荧光探测的不同,450K采用了两种荧光探测信号(红光和绿光)。
上图左边一列是非甲基化的GpC locus,右边是甲基化的GpC locus,上下分别是Infinium I 和Infinium Ⅱ
1.3 β值
通过计算甲基化(信号A)和未甲基化(信号B)等位基因之间的强度比来确定DNA甲基化水平(β值)。
平均β=信号B /(信号A +信号B + 100)
具体地,β值是由甲基化(M对应于信号A)和未甲基化(U对应于信号B)等位基因的强度计算的,荧光信号的比率β= Max(M,0)/ [Max( M,0)+ Max(U,0)+ 100]。
因此,β值的范围从0(完全未甲基化)到1(完全甲基化)
具体的β值的意义是:
任何等于或大于0.6的β值都被认为是完全甲基化的。
任何等于或小于0.2的β值被认为是完全未甲基化的。
β值在0.2和0.6之间被认为是部分甲基化的。
1.4 分析需要考虑的问题
-
背景校正
-
红光和绿光的校正
-
控制芯片的使用(illumina450K本身有一些控制芯片,可以用来做质控,如亚硫酸盐处理效率)
-
探针类型(I型和II型)的校正(不同探针类型产生的数据不同)
-
位置的校正(芯片上的不同位置产生的数据可能会有偏差)
-
批次的校正(不同的批次做的数据会有偏差)
-
探针序列本身是否可靠(有些探针本身位于repeat区或者包含snp等就会影响杂交及最后的结果,应该去除,附上一片参考文献,里边有list可以用来去除不好的探针)
二、甲基化芯片数据分析
图源:ChAMP: updated methylation analysis pipeline for Illumina BeadChips
- 绿色发光线表示主要的分析步骤,灰色为可选的步骤。黑点表示准备好的甲基化数据。
- 蓝色表示准备工作,比如Loading, Normalization, Quality Control checks etc.
- 红色表示产生分析结果:Differentially Methylated Positions (DMPs), Differentially Methylated Regions (DMRs), Differentially methylated Blocks, EpiMod (a method for detecting differentially methylated gene modules derived from FEM package), Pathway Enrichment Results etc.
- 黄色表示交互界面画图
2.1 Pipeline
2.1.1 450K
myLoad <- cham.load(testDir)
# Or you may separate about code as champ.import(testDir) + champ.filter()
CpG.GUI()
champ.QC() # Alternatively: QC.GUI()
myNorm <- champ.norm()
champ.SVD()
# If Batch detected, run champ.runCombat() here.
myDMP <- champ.DMP()
DMP.GUI()
myDMR <- champ.DMR()
DMR.GUI()
myBlock <- champ.Block()
Block.GUI()
myGSEA <- champ.GSEA()
myEpiMod <- champ.EpiMod()
myCNA <- champ.CNA()
# If DataSet is Blood samples, run champ.refbase() here.
myRefbase <- champ.refbase()
2.1.2 EPIC(850k)
myLoad <- champ.load(directory = testDir,arraytype="EPIC")
# We simulated EPIC data from beta value instead of .idat file,
# but user may use above code to read .idat files directly.
# Here we we started with myLoad.
CpG.GUI(arraytype=<