多倍化以及后续的基因丢失和二倍化现象存在于大部分的物种中, 是物种进化的重要动力。如果一个物种在演化过程中发生过多倍化,那么在基因组上就会存在一些共线性区域(即两个区域之间的基因是旁系同源基因,其基因的排布顺序基本一致)。
例如拟南芥经历了3次古多倍化,包括2次二倍化,一次3倍化 (Tang. et.al 2008 Science).
..For example, Arabidopsis thaliana (thale cress) has undergone three paleo-polyploidies, including two doublings (5) and one tripling (12), resulting in ~12 copies of its ancestral chromosome set in a ~160-Mb genome…
当然之前只是记住了结论,现在我想的是,如何复现出这个分析结果呢?
前期准备
首先,我们需要使用conda安装wgdi。 我一般会新建一个环境避免新装软件和其他软件产生冲突
1 | # 安装软件 |
之后,我们从ENSEMBL上下载基因组,CDS, 蛋白和GFF文件
1 | #Athaliana |
注意: cDNA和CDS并不相同,CDS只包括起始密码子到终止密码子之间的序列,而cDNA还会包括UTR.
数据预处理
数据的预处理是用时最长的步骤,因为软件要求的输入格式并非是你手头所拥有的格式,你通常都需要进行一些转换才能得到它所需的形式。
wgdi需要三种信息,分别是BLAST, 基因的位置信息和染色体长度信息,要求格式如下
BLAST 的
-outfmt 6
输出的文件基因的位置信息: 以tab分隔,分别为chr,id,start,end,strand,order,old_id。(并非真正意义上的GFF格式)
染色体长度信息和染色体上的基因个数,格式为 chr, length, gene number
同时,对于每个基因我们只需要一个转录本,我通常使用最长的转录本作为该基因的代表。之前我写过一个脚本 (get_the_longest_transcripts.py) 提取每个基因的最长转录本,我在此处上写了一个新的脚本用来根据参考基因组和注释的GFF文件生成wgdi的两个输入文件,脚本地址为https://github.com/xuzhougeng/myscripts/blob/master/comparative/generate_conf.py
1 | pytho generate_conf.py -p ath Arabidopsis_thaliana.TAIR10.dna.toplevel.fa Arabidopsis_thaliana.TAIR10.44.gff3 |
输出文件是ath.gff 和 ath.len.
由于ENSEMBL上GFF的ID编号和pep.fa 和cds.fa 不太一致,简单的说就是,编号之前中有一个 “gene:” 和 “transcript:” . 如下
1 | $ head ath.gff |
于是我用 sed 删除了这些信息
1 | sed -i -e 's/gene://' -e 's/transcript://' ath.gff |
另外,pep.fa, cds.fa里面包含所有的基因,且命名特别的长, 同时我们也不需要基因中的 “.1”, “.2” 这部分信息
1 | $ head -n 5 Arabidopsis_thaliana.TAIR10.cds.all.fa |
借助于seqkit, 我对原来的数据进行了筛选和重命名
1 | seqkit grep -f <(cut -f 7 ath.gff ) Arabidopsis_thaliana.TAIR10.cds.all.fa | seqkit seq --id-regexp "^(.*?)\\.\\d" -i > ath.cds.fa |
通过NCBI的BLASTP 或者DIAMOND 进行蛋白之间相互比对,输出格式为 -outfmt 6
1 | makeblastdb -in ath.pep.fa -dbtype prot |
共线性分析
绘制点阵图
在上面步骤结束后,其实绘制点阵图就非常简单了,只需要创建配置文件,然后修改配置文件,最后运行wgdi。
基本wgdi的其他分析也都是三部曲,创建配置,修改配置,运行程序。
第一步,创建配置文件
1 | wgdi -d \? > ath.conf |
配置文件的信息如下,
1 | [dotplot] |
第二步,修改配置文件。因为是自我比对,所以 gff1和gff2内容一样, lens1和lens2内容一样
1 | [dotplot] |
最后运行如下命令
1 | wgdi -d ath.conf |
输出的png如下所示
从图中,我们很容易地就能观察到三种颜色,分别是红色,蓝色,和灰色。在WGDI中,红色表示genome2的基因在genome1中的最优同源(相似度最高)的匹配,次好的四个基因是蓝色,而剩余部分是为灰色。图中对角线出现的片段并非是自身比对,因为WGDI已经过滤掉自身比自身的结果。那么问题来了,这些基因是什么呢?这个问题会在后续的分析中进行解答。
如果基因组存在加倍事件,那么对于一个基因组的某个区域可能会存在另一个区域与其有着相似的基因(同源基因),并且这些基因的排布顺序较为一致。反应到点阵图上,就是能够观察到有多个点所组成的”线”。这里的线需要有一个引号,因为当你放大之后,你会发现其实还是点而已。
由于进一步鉴定共线性区域就建立在这些”点”的基础上,那么影响这些点是否为同源基因的参数就非常重要了,即配置文件中的score,evalue,repeat_number。
共线性分析和Ks计算
对于同线性(synteny)和共线性(collinearity),一般认为同线性指的是两个区域有一定数量的同源基因,对基因顺序排布无要求。共线性是同线性的特殊形式,要求同源基因的排布顺序也相似。
wgdi开发了-icl
模块(Improved version of ColinearScan)用于进行共线性分析,使用起来非常简单,也是先建立配置文件。
1 | wgdi -icl \? >> ath.conf |
然后对配置文件进行修改.
1 | [collinearity] |
其中的evalue, score和BLAST文件的过滤有关,用于筛选同源基因对。multiple确定最佳比对基因,repeat_number表示最多允许多少基因是潜在的同源基因, grading根据同源基因的匹配程度进行打分, mg 指的是共线性区域中所允许最大空缺基因数。
运行结果后,会得到ath.collinearity.txt,记录共线性区域。以 # 起始的行记录共线性区域的元信息,例如得分(score),显著性(pvalue),基因对数(N)等。
1 | grep '^#' ath.collinearity.txt | tail -n 1 |
紧接着,我们就可以根据共线性结果来计算Ks。
同样的也是先生成配置文件
1 | wgdi -ks \? >> ath.conf |
然后修改配置文件。我们需要提供cds和pep文件,共线性分析输出文件(支持MCScanX的共线性分析结果)。WGDI会用muscle根据蛋白序列进行联配,然后使用pal2pal.pl 基于cds序列将蛋白联配转成密码子联配,最后用paml中的yn00计算ka和ks。
1 | [ks] |
ks计算需要一段时间,那么不妨在计算时了解下Ka和Ks。Ka和Ks分别指的是非同义替换位点数,和同义替换位点数。根据中性演化假说,基因的变化大多是中性突变,不会影响生物的生存,那么当一对同源基因分开的时间越早,不影响生存的碱基替换数就越多(Ks),反之越多。
运行结果后,输出的Ks文件共有6列,对应的是每个基因对的Ka和Ks值。
1 | $ head ath.ks |
鉴于共线性和Ks值输出结果信息量太大,不方便使用,更好的方法是将两者进行聚合,得到关于各个共线性区的汇总信息。
WGDI提供 -bi
参数帮助我们进行数据整合。同样也是生成配置文件
1 | wgdi -bi ? >> ath.conf |
修改配置文件. 其中collinearity 和ks是我们前两步的输出文件,而 ks_col 则是声明使用ks文件里的哪一列。
1 | [blockinfo] |
运行即可
1 | wgdi -bi ath.conf |
输出文件以csv格式进行存放,因此可以用EXCEL直接打开,共11列。
id
即共线性的结果的唯一标识chr1
,start1
,end1
即参考基因组(点图的左边)的共线性范围chr2
,start2
,end2
即参考基因组(点图的上边)的共线性范围pvalue
即共线性结果评估,常常认为小于0.01的更合理些length
即共线性片段长度ks_median
即共线性片段上所有基因对ks
的中位数(主要用来评判ks分布的)ks_average
即共线性片段上所有基因对ks
的平均值homo1
,homo2
,homo3
,homo4
,homo5
与multiple
参数有关,即一共有homo+multiple列
主要规则是:基因对如果在点图中为红色,赋值为1,蓝色赋值为0,灰色赋值为-1(颜色参考前述 wgdi
点图 相关推文)。共线性片段上所有基因对赋值后求平均值,这样就赋予该共线性一个-1,1的值。如果共线性的点大部分为红色,那么该值接近于1。可以作为共线性片段的筛选。
block1
,block2
分别为共线性片段上基因order
的位置。ks
共线性片段的上基因对的ks
值density1
,density2
共线性片段的基因分布密集程度。值越小表示稀疏
这个表格是后续探索分析的一个重点,比如说我们可以用它来分析我们点图中出现在对角线上的基因。下面的代码就是提取了第一个共线性区域的所有基因,然后进行富集分析,绘制了一个气泡图。
1 | df <- read.csv("ath_block_information.csv") |
进一步观察这些基因,可以发现这些基因的编号都是前后相连,说明这个基因簇和花粉识别有一定关系。
1 | > as.data.frame(ego)[1,] |
A gene cluster is a group of two or more genes found within an organism’s DNA that encode similar polypeptides, or proteins, which collectively share a generalized function and are **often located within a few thousand base pairs **of each other. –维基百科
接下来,我们还可以根据这个表格中的Ks对点阵图进行上色, 以及正确的计算Ks峰值。