使用DMR进行PCA的主要目的是为了探究亚群中DMR是否存在大的差异,可以将不同亚群分开。
因为我们知道DMR在植物中存在三种类型CG、CHG和CHH,那么我们就需要对三种甲基化分别计算,以及总体的计算其PCA。
- 将驯化和改良分别得到的DMR进行合并
- 合并后从loci文件中计算每个个体在DMR的甲基化水平
- 合并甲基化水平并使用OSCA进行计算PCA
01 将驯化和改良分别得到的DMR进行合并
我们是两次计算DMR,所以要计算总群体DMR的话,需要先对群体DMR进行合并,把DOM-DMR和IMP-DMR中overlap的地方避免重复计算,这个地方使用的是bedtools工具。
sort输入文件
首先,以CG为例,我们把DOM-CG和IMP-CG进行重定向,然后要对重定向的新文件进行染色体和位置的排序,这样处理会加快速度,需要的内存也更少。并且如果文件没有排序,bedtools merge
就会报错,所以sort是一定要的:
cat DMR-CG.bed IMP-CG.bed > all_cg.bed
sort -k1,1 -k2,2n all_cg.bed > all_cg.sort.bed
合并之后可以使用bedtools 进行merge了,bedtools合并默认是有10个碱基的覆盖,就在新的输出文件中表示一次;也可以自己定义合并区间,比如你想对一定距离范围内的所有peak进行合并,那么需要使用-d 参数,例如合并500bp内的peak,即bedtools merge -i all_cg.sort.bed -d 500
02 合并后从loci中计算每个个体的甲基化水平
因为我们是使用BatMeth2 进行甲基化的鉴定,这个软件有一个比较人性的地方时默认给你输出很多后需要用的甲基化格式文件,虽然也很占用储存空间,但是对于一键式懒人来说还是比较不错的,下面是其中一种输出格式loci的结果:
每列分别是染色体,位置,方向,类型,甲基化的read,总C的read。
这里我是先将甲基化文件进行分不同染色体,并且计算甲基化的比率,笨拙的脚本如下:
import os
#------------------------------------------------------------
#目的:获取每个样本DMR的甲基化程度
#
#01 将每个loci文件分成不同染色体的中间文件
#02 写一个function 对每条染色体的甲基化程度进行统计
#03 合并所有每条染色体甲基化程度的中间文件,输出最终结果,并删除中间文件
#--------------------------------------------------------------
files = os.listdir()
for i in files:
if "loci" in i:
#如果是 "loci"文件则进行打开
name = i.replace("res","")
for temp in range(0,13):
outname = name + str(temp)+"temp"
output = open(outname,"w")
for data in open(i).readlines():
my_data = data.strip().split("\t")
my_data[0] = my_data[0].replace("SL4.0ch0","")
my_data[0] = my_data[0].replace("SL4.0ch","")
if int(my_data[0]) == temp:
output.write(data)
这样把总的CG甲基化位点分为了12个不同染色体,接着我们分别对每个染色体进行计算,这样会节省一些时间。
import sys
my_file = sys.argv[1]
outfile = my_file.replace("temp",".ration.temp")
out = open(outfile,"w")
for i in open("fin_cg_sort.bed").readlines():
my_list = i.strip().split("\t")
chr = int(my_list[0])
start = int(my_list[1])
end = int(my_list[2])
#设定好 染色体,起始 和 终止信息
Me = 0
all_me = 0
for j in open(my_file).readlines():
data = j.replace("SL4.0ch0","")
data = data.replace("SL4.0ch","")
my_me = data.strip().split("\t")
if int(my_me[0]) == chr:
if int(my_me[1]) >= start and int(my_me[1]) <= end:
Me = Me + int(my_me[4])
all_me = all_me +int(my_me[5])
elif int(my_me[1]) > end:
if all_me == 0:
ratio = 0
out.write(str(chr)+'\t'+"cg"+'\t'+str(start)+'\t'+str(end)+'\t'+str(ratio)+'\n')
else:
ratio = Me / all_me
out.write(str(chr) + '\t' + "cg" + '\t' + str(start) + '\t' + str(end) + '\t' + str(ratio) + '\n')
break
else:
continue
循环运行这个小脚本,这样每条染色体DMR的甲基化都计算完毕。
合并甲基化水平并使用OSCA进行计算PCA
我们上两步已经得到了每条染色体的DMR甲基化水平,接着需要把数据合并,并整理成OSCA识别的格式。
for i in `cat sample.list`;
do
cat ${i}_*ration.temp >> ${i}.CHG.meth &
done
接着把数据整理成这样的格式即可:
接下来需要将多个meth文件进行合并,整理成最终osca可以识别的文件格式,具体脚本如下:
out=open("all_cg.site","w")
import os
all_file = open("all_cg.merge.bed").readlines()
all_line = len(open("all_cg.merge.bed").readlines())
files1 = os.listdir()
files = []
for i in files1:
if "meth" in i:
files.append(i)
out.write("Site")
for i in files:
if "meth" in i:
i= i.replace("_clean.CG.meth","")
out.write("\t"+i)
out.write("\n")
for i in range(0,all_line):
my_site = all_file[i].strip().split("\t")
site = "cg"+my_site[0]+"g"+my_site[1]
out.write(site)
for j in files:
if "meth" in j:
data1 =open(j).readlines()
for ii in data1:
this_site = ii.strip().split("\t")
if int(this_site[0])==int(my_site[0]) and int(this_site[2])==int(my_site[1]):
out.write("\t"+this_site[4])
out.write("\n")
接着使用OSCA软件进行PCA的计算,计算PCA首先先把文件整理成BOD的格式:
osca_Linux --tefile myprofile.txt --methylation-m --make-bod --no-fid --out myprofile
#--efile reads a DNA methylation (or gene expression) data file in plain text format.
#--methylation-beta indicates methylation beta values in the file.
#--methylation-m indicates DNA methylation m values in the file.
#--make-bod saves DNA methylation (or gene expression) data in binary format.
#--out saves data ( or results) in a file.
#--no-fid indicates data without family ID.
整理成OSCA的格式后,使用其一个子命令进行PCA分析;而在PCA分析之前,需要计算样品之间的亲缘矩阵omics relationship matrix (ORM),这个OSCA也给予了相关的命令,很简单就可以完成:
osca --befile myprofile --make-orm --out myorm
得到的是三个同名的二进制文件,分别是bin,id和N.bin
最后终于到做PCA了,到这一步其实很简单了,一行命令就可以解决:
osca_Linux --orm myorm --pca 20 --out mypca
#--orm reads the ORM binary files.
#--pca conducts principal component analysis and saves the first n (default as 20) PCs.
最后用给出的eigenvec文件进行绘制PCA散点图。