使用DSS包多種方式檢驗差異甲基化訊號區域
- 2020 年 3 月 27 日
- 筆記
因為一個有趣的原因,我們來一起學一個R包吧
一個背景
哺乳動物基因組CpG位點通常集中在稱為CpG島(CpG island,CGI)的區域中,並且已知人基因啟動子~60%含有CpG島。CpG島上下游不超過2000個鹼基對(2kb)的基因組區域稱為CpG「島岸」(shores),其中CpG shelves指位於CpG shores 上下游2kb以內的區域,open sea指CpG islands、CpG shores和CpG shelves之外的其他區域。這4種情況形成了CpG resort。CpG位點的密度從island到open sea遞減。
3個技術
主要是 甲基化測序的 WGBS和RRBS,還有 晶片:
全基因組DNA甲基化測序(Whole Genome Bisulfite Sequencing,WGBS)是 DNA 甲基化研究的金標準,它通過 Bisulfite 處理和全基因組 DNA 測序結合的方式,對整個基因組上的甲基化情況進行分析,具有單鹼基解析度,可精確評估單個 C 鹼基的甲基化水平,構建全基因組精細甲基化圖譜。數據量非常大。
簡化甲基化測序 (Reduced representation bisulfite sequencing, RRBS)是一種準確、高效、經濟的DNA甲基化研究方法,通過酶切 (Msp I) 富集啟動子及CpG島區域,並進行Bisulfite測序,同時實現DNA甲基化狀態檢測的高解析度和測序數據的高利用率。作為一種高性價比的甲基化研究方法,簡化甲基化測序在大規模臨床樣本的研究中具有廣泛的應用前景。
Illumina的Infinium BeadChip晶片,包括HumanMethyation450(450K)和MethylationEPIC(850K)。Infinium晶片存在染料偏差、不同探針化學和位置效應的問題,已知這些問題會影響結果,必須在數據處理過程中進行校正。Infinium 450K探針交叉反應和模糊比對到人類基因組中的多個位置影響了485,000個探測器中的約140,000個探針(29%),將可用探針的數量減少到約345,000個。這個問題在新發布850K仍然存在,其包括> 90%的450K探針。
有文章比較這3個技術:Empirical comparison of reduced representation bisulfite sequencing and Infinium BeadChip reproducibility and coverage of DNA methylation in humans
主要是分析 差異甲基化區域(DMRs)與 DMR 相關差異表達基因
數據介紹
這裡選擇 https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE52140
提供每個樣本的訊號值矩陣下載

下載並且了解數據:

查看壓縮包內容,如下:
head GSM1084240_A3R_d6_250.cpgs.txt CHR POS A3R_d6_250 chr1 10525 21/23 chr1 10542 21/23 chr1 10609 1/23 chr1 10617 0/24 chr1 10620 0/24 chr1 10631 0/24 chr1 10633 0/24 chr1 10636 0/24 chr1 10638 0/24
DSS包要求輸入文件數據:每一行代表一個CpG site, 格式如下:
- 第一列為染色體
- 第二列為位置
- 第三列為total reads
- 第四列為甲基化的reads
所以我們下載的數據需要進行拆分,然後導入到R裡面才能被DSS包使用。
DSS包介紹
主要是把上面項目的數據文件下載,然後導入到R裡面,是有DSS包進行分析。
DSS (Dispersion Shrinkage for Sequencing data),為基於高通量測序數據的差異分析而設計的Bioconductor包。主要應用於BS-seq(亞硫酸氫鹽測序)中計算不同組別間差異甲基化位點(DML)和差異甲基化區域(DMR)即Call DML or DMR。
DSS包的使用主要包括:
- 輸入文件的準備
- 利用DMLtest函數檢驗所有的位點
- 利用callDML函數挑選統計學顯著的位點
- 利用callDMR函數Call DMR
- 利用showOneDMR函數對DMRs可視化
首先我們導入上面GSE52140數據集的文件:
library(data.table) library(stringr) library(tidyverse) allDat <- lapply(list.files('GSE52140_RAW/',pattern='*cpgs.txt.gz'),function(f){ # f="GSM1251242_H2R_d0.cpgs.txt.gz"; print(f); tmp=fread(file.path('GSE52140_RAW/',f)) chr=as.character(tmp$CHR) pos=as.character(tmp$POS) newTmp=separate(tmp,col =3,into = c("methy", "unmethy"), sep = "/") newTmp$all=as.numeric(newTmp$methy)+as.numeric(newTmp$unmethy) newTmp=as.data.frame(newTmp[,c(1,2,5,3)]) colnames(newTmp)=c('chr', 'pos' ,'N' ,'X') return(newTmp) }) ## 值得注意的是每個樣本的位點數量不一致哦 do.call(rbind,lapply(allDat,dim)) tmp=do.call(cbind,lapply(allDat,head)) sn=gsub('.cpgs.txt.gz','',list.files('GSE52140_RAW/',pattern='*cpgs.txt.gz')) sn=gsub('GSM.*?_','',sn) sn
也就是說把這17個文件讀入了,樣本名字是:
> sn [1] "A0R_d0_rep1" "A3R_d0_rep1" "A3R_d6_250" "A3R_d6_1000" [5] "A3R_d13_250" "A3R_d13_1000" "H0R_d0_rep1" "H3R_d0_rep1" [9] "H3R_d6_250" "H3R_d13_250" "A0R_d0_rep2" "A3R_d0_rep2" [13] "H0R_d0_rep2" "H3R_d0_rep2" "A1R_d0" "A2R_d0" [17] "H2R_d0"
這個時候,這個變數有點大,可能會考驗你的電腦哦。

然後我們用下面的3個例子來說明這個DSS包的用法,需要掌握上面樣本的命名:
# lung cancer cell lines A549 (A) and HTB56 (H) # normal cell lines (0R) # a highly metastatic phenotype (3R) # 5-Azacytidine treatment at low concentrations (250 nM & 1000 nM) # for 6 days, additional 7 days in regular medium
單樣本VS單樣本
程式碼如下,重要就是構建對象和做統計檢驗
library(DSS) require(bsseq) if(T){ BSobj <- makeBSseqData(allDat[1:2], c("A0R", "A3R") )[1:1000,] BSobj save(BSobj,file = 'single-BSobj.Rdata') # There is no biological replicates in at least one condition. dmlTest <- DMLtest(BSobj, group1=c("A0R"), group2=c("A3R"),smoothing=TRUE) head(dmlTest) }
多樣本的組VS另一個組
程式碼如下,重要就是構建對象和做統計檢驗,這裡比較"A0R_d0"和"A3R_d0"組別的2個樣本:
if(T){ sn[c(1,11,2,12)] BSobj <- makeBSseqData(allDat[c(1,11,2,12)], sn[c(1,11,2,12)] )[1:1000,] BSobj save(BSobj,file = 'group-BSobj.Rdata') dmlTest <- DMLtest(BSobj, group1=c("A0R_d0_rep1","A0R_d0_rep2"), group2=c("A3R_d0_rep1","A3R_d0_rep2"),smoothing=F) head(dmlTest) }
多種比較方式
程式碼如下,重要仍然是構建對象和做統計檢驗,但是需要構建屬性矩陣,而且增加了DMLfit步驟。
sn sn[grep('rep',sn)] cellline=substring(sn[grep('rep',sn)],1,1) type=substring(sn[grep('rep',sn)],2,2) design=data.frame(cellline=cellline,type=type) design
得到的屬性矩陣如下:

sn sn[grep('rep',sn)] cellline=substring(sn[grep('rep',sn)],1,1) type=substring(sn[grep('rep',sn)],2,2) design=data.frame(cellline=cellline,type=type) design # 構建對象特別耗時; BSobj <- makeBSseqData(allDat[c(grep('rep',sn))], sn[grep('rep',sn)]) BSobj save(BSobj,file = 'multi-BSobj.Rdata') load(file = 'multi-BSobj.Rdata') DMLfit=DMLfit.multiFactor(BSobj,design, formula = ~cellline+type+cellline:type) colnames(DMLfit$X) # 這裡可以使用 『coef』, 『term』, or 『Contrast』我們僅僅是演示 coef dmlTest=DMLtest.multiFactor(DMLfit,coef=2) head(dmlTest)
值得注意的是DMLtest.multiFactor
結果不需要callDML
,只需要callDMR
即可!
結果介紹
不管是哪種比較,最後都得到dmlTest
變數走後面的流程,包括確定顯著差異甲基化區域及基因,以及可視化展現,程式碼如下:
# 3.Call DML by using callDML function. The results DMLs are sorted by the significance. dmls <- callDML(dmlTest, p.threshold=0.001) head(dmls) ##To detect loci with difference greater than 0.1, do: dmls2 <- callDML(dmlTest, delta=0.1, p.threshold=0.001) head(dmls2) # 4.Call DMR by using callDML function ##Regions with many statistically significant CpG sites are identified as DMRs. dmrs <- callDMR(dmlTest, p.threshold=0.01) head(dmrs) ##To detect regions with difference greater than 0.1, do: dmrs2 <- callDMR(dmlTest, delta=0.1, p.threshold=0.05) head(dmrs2) # 5.The DMRs can be visualized using showOneDMR function showOneDMR(dmrs[1,], BSobj)
很明顯,參數都是可以調整的,統計學顯著性的閾值自己把握。
作業
分析文章 Enduring epigenetic landmarks define the cancer microenvironment ,拿到 患者間差異甲基化區域(DMRs)與 DMR 相關差異表達基因(DE-DMRs)