如何用WGDI进行共线性分析(上)

2024-06-23 19:48
文章标签 分析 进行 wgdi 共线性

本文主要是介绍如何用WGDI进行共线性分析(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

多倍化以及后续的基因丢失和二倍化现象存在于大部分的物种中, 是物种进化的重要动力。如果一个物种在演化过程中发生过多倍化,那么在基因组上就会存在一些共线性区域(即两个区域之间的基因是旁系同源基因,其基因的排布顺序基本一致)。

例如拟南芥经历了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。 我一般会新建一个环境避免新装软件和其他软件产生冲突

# 安装软件
conda create -c bioconda -c conda-forge -n wgdi wgdi
# 启动环境
conda activate wgdi

之后,我们从ENSEMBL上下载基因组,CDS, 蛋白和GFF文件

#Athaliana
wget ftp://ftp.ensemblgenomes.org/pub/plants/release-44/fasta/arabidopsis_thaliana/dna/Arabidopsis_thaliana.TAIR10.dna.toplevel.fa.gz
gunzip Arabidopsis_thaliana.TAIR10.dna.toplevel.fa.gz
wget ftp://ftp.ensemblgenomes.org/pub/plants/release-44/fasta/arabidopsis_thaliana/cds/Arabidopsis_thaliana.TAIR10.cds.all.fa.gz
gunzip Arabidopsis_thaliana.TAIR10.cds.all.fa.gz
wget ftp://ftp.ensemblgenomes.org/pub/plants/release-44/fasta/arabidopsis_thaliana/pep/Arabidopsis_thaliana.TAIR10.pep.all.fa.gz
gunzip Arabidopsis_thaliana.TAIR10.pep.all.fa.gz
wget ftp://ftp.ensemblgenomes.org/pub/plants/release-44/gff3/arabidopsis_thaliana/Arabidopsis_thaliana.TAIR10.44.gff3.gz
gunzip Arabidopsis_thaliana.TAIR10.44.gff3.gz

注意: cDNA和CDS并不相同,CDS只包括起始密码子到终止密码子之间的序列,而cDNA还会包括UTR.

数据预处理

数据的预处理是用时最长的步骤,因为软件要求的输入格式并非是你手头所拥有的格式,你通常都需要进行一些转换才能得到它所需的形式。

wgdi需要三种信息,分别是BLAST, 基因的位置信息和染色体长度信息,要求格式如下

  1. BLAST 的 -outfmt 6输出的文件

  2. 基因的位置信息: 以tab分隔,分别为chr,id,start,end,strand,order,old_id。(并非真正意义上的GFF格式)

  3. 染色体长度信息和染色体上的基因个数,格式为 chr, length, gene number

同时,对于每个基因我们只需要一个转录本,我通常使用最长的转录本作为该基因的代表。之前我写过一个脚本 (get_the_longest_transcripts.py) 提取每个基因的最长转录本,我在此处上写了一个新的脚本用来根据参考基因组和注释的GFF文件生成wgdi的两个输入文件,脚本地址为https://github.com/xuzhougeng/myscripts/blob/master/comparative/generate_conf.py

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:" . 如下

$ head ath.gff 
1  gene:AT1G01010  3631  5899  +  1  transcript:AT1G01010.1
1  gene:AT1G01020  6788  9130  -  2  transcript:AT1G01020.1
1  gene:AT1G01030  11649  13714  -  3  transcript:AT1G01030.1
1  gene:AT1G01040  23416  31120  +  4  transcript:AT1G01040.2
1  gene:AT1G01050  31170  33171  -  5  transcript:AT1G01050.1
1  gene:AT1G01060  33379  37757  -  6  transcript:AT1G01060.3
1  gene:AT1G01070  38444  41017  -  7  transcript:AT1G01070.1
1  gene:AT1G01080  45296  47019  -  8  transcript:AT1G01080.2
1  gene:AT1G01090  47234  49304  -  9  transcript:AT1G01090.1
1  gene:AT1G01100  49909  51210  -  10  transcript:AT1G01100.2

于是我用 sed 删除了这些信息

sed -i -e 's/gene://' -e 's/transcript://' ath.gff

另外,pep.fa, cds.fa里面包含所有的基因,且命名特别的长, 同时我们也不需要基因中的 ".1", ".2" 这部分信息

$ head -n 5 Arabidopsis_thaliana.TAIR10.cds.all.fa 
>AT3G05780.1 cds chromosome:TAIR10:3:1714941:1719608:-1 gene:AT3G05780 gene_biotype:protein_coding transcript_biotype:protein_coding gene_symbol:LON3 description:Lon protease homolog 3, mitochondrial [Source:UniProtKB/Swiss-Prot;Acc:Q9M9L8]
ATGATGCCTAAACGGTTTAACACGAGTGGCTTTGACACGACTCTTCGTCTACCTTCGTAC
TACGGTTTCTTGCATCTTACACAAAGCTTAACCCTAAATTCCCGCGTTTTCTACGGTGCC
CGCCATGTGACTCCTCCGGCTATTCGGATCGGATCCAATCCGGTTCAGAGTCTACTACTC
TTCAGGGCACCGACTCAGCTTACCGGATGGAACCGGAGTTCTCGCGATTTATTGGGTCGTb

借助于seqkit, 我对原来的数据进行了筛选和重命名

seqkit grep -f <(cut -f 7 ath.gff ) Arabidopsis_thaliana.TAIR10.cds.all.fa | seqkit seq --id-regexp "^(.*?)\\.\\d" -i > ath.cds.fa
seqkit grep -f <(cut -f 7 ath.gff ) Arabidopsis_thaliana.TAIR10.pep.all.fa | seqkit seq --id-regexp "^(.*?)\\.\\d" -i > ath.pep.fa

通过NCBI的BLASTP 或者DIAMOND 进行蛋白之间相互比对,输出格式为 -outfmt 6

makeblastdb -in ath.pep.fa -dbtype prot
blastp -num_threads 50 -db ath.pep.fa -query ath.pep.fa -outfmt 6 -evalue 1e-5 -num_alignments 20  -out ath.blastp.txt &

共线性分析

绘制点阵图

在上面步骤结束后,其实绘制点阵图就非常简单了,只需要创建配置文件,然后修改配置文件,最后运行wgdi。

基本wgdi的其他分析也都是三部曲,创建配置,修改配置,运行程序。

第一步,创建配置文件

wgdi -d \? > ath.conf

配置文件的信息如下(下面信息只是为了讲解参数,不需要复制)

[dotplot]
blast = blast file
gff1 =  gff1 file
gff2 =  gff2 file
lens1 = lens1 file
lens2 = lens2 file
genome1_name =  Genome1 name
genome2_name =  Genome2 name
multiple  = 1   # 最好的同源基因数, 用输出结果中会用红点表示
score = 100     # blast输出的score 过滤 
evalue = 1e-5   # blast输出的evalue 过滤 
repeat_number = 20  # genome2相对于genome1的最多同源基因数
position = order
blast_reverse = false
ancestor_left = none
ancestor_top = none
markersize = 0.5  # 点的大小
figsize = 10,10   # 图片大小
savefig = savefile(.png,.pdf)

第二步,修改配置文件。因为是自我比对,所以 gff1和gff2内容一样, lens1和lens2内容一样

[dotplot]
blast = ath.blastp.txt
gff1 =  ath.gff
gff2 =  ath.gff
lens1 = ath.len
lens2 = ath.len
genome1_name =  A. thaliana
genome2_name =  A. thaliana
multiple  = 1
score = 100
evalue = 1e-5
repeat_number = 5 
position = order
blast_reverse = false
ancestor_left = none
ancestor_top = none
markersize = 0.5
figsize = 10,10
savefig = ath.dot.png

最后运行如下命令

wgdi -d ath.conf

输出的png如下所示

点阵图

从图中,我们很容易地就能观察到三种颜色,分别是红色,蓝色,和灰色。在WGDI中,红色表示genome2的基因在genome1中的最优同源(相似度最高)的匹配,次好的四个基因是蓝色,而剩余部分是为灰色。图中对角线出现的片段并非是自身比对,因为WGDI已经过滤掉自身比自身的结果。那么问题来了,这些基因是什么呢?这个问题会在后续的分析中进行解答。

如果基因组存在加倍事件,那么对于一个基因组的某个区域可能会存在另一个区域与其有着相似的基因(同源基因),并且这些基因的排布顺序较为一致。反应到点阵图上,就是能够观察到有多个点所组成的"线"。这里的线需要有一个引号,因为当你放大之后,你会发现其实还是点而已。

部分区域放大

由于进一步鉴定共线性区域就建立在这些"点"的基础上,那么影响这些点是否为同源基因的参数就非常重要了,即配置文件中的score,evalue,repeat_number。

共线性分析和Ks计算

对于同线性(synteny)和共线性(collinearity),一般认为同线性指的是两个区域有一定数量的同源基因,对基因顺序排布无要求。共线性是同线性的特殊形式,要求同源基因的排布顺序也相似。

wgdi开发了-icl模块(Improved version of ColinearScan)用于进行共线性分析,使用起来非常简单,也是先建立配置文件。

wgdi -icl \? >> ath.conf

然后对配置文件进行修改.

[collinearity]
gff1 = ath.gff
gff2 = ath.gff
lens1 = ath.len
lens2 = ath.len
blast = ath.blastp.txt
blast_reverse = false
multiple  = 1
process = 8
evalue = 1e-5
score = 100
grading = 50,40,25
mg = 40,40
pvalue = 0.2
repeat_number = 10
positon = order
savefile = ath.collinearity.txt

其中的evalue, score和BLAST文件的过滤有关,用于筛选同源基因对。multiple确定最佳比对基因,repeat_number表示最多允许多少基因是潜在的同源基因, grading根据同源基因的匹配程度进行打分, mg 指的是共线性区域中所允许最大空缺基因数。

运行结果后,会得到ath.collinearity.txt,记录共线性区域。以 # 起始的行记录共线性区域的元信息,例如得分(score),显著性(pvalue),基因对数(N)等。

grep '^#' ath.collinearity.txt | tail -n 1
# Alignment 959: score=778.0 pvalue=0.0003 N=16 Pt&Pt minus

紧接着,我们就可以根据共线性结果来计算Ks。

同样的也是先生成配置文件

wgdi -ks \? >> ath.conf

然后修改配置文件。我们需要提供cds和pep文件,共线性分析输出文件(支持MCScanX的共线性分析结果)。WGDI会用muscle根据蛋白序列进行联配,然后使用pal2pal.pl 基于cds序列将蛋白联配转成密码子联配,最后用paml中的yn00计算ka和ks。

[ks]
cds_file =   ath.cds.fa
pep_file =   ath.pep.fa
align_software = muscle
pairs_file = ath.collinearity.txt
ks_file = ath.ks

ks计算需要一段时间,那么不妨在计算时了解下Ka和Ks。Ka和Ks分别指的是非同义替换位点数,和同义替换位点数。根据中性演化假说,基因的变化大多是中性突变,不会影响生物的生存,那么当一对同源基因分开的时间越早,不影响生存的碱基替换数就越多(Ks),反之越多。

运行结果后,输出的Ks文件共有6列,对应的是每个基因对的Ka和Ks值。

$ head ath.ks
id1  id2  ka_NG86  ks_NG86  ka_YN00  ks_YN00
AT1G72300  AT1G17240  0.1404  0.629  0.1467  0.5718
AT1G72330  AT1G17290  0.0803  0.5442  0.079  0.6386
AT1G72350  AT1G17310  0.3709  0.9228  0.3745  1.071
AT1G72410  AT1G17360  0.2636  0.875  0.2634  1.1732
AT1G72450  AT1G17380  0.2828  1.1068  0.2857  1.5231
AT1G72490  AT1G17400  0.255  1.2113  0.2597  2.0862
AT1G72520  AT1G17420  0.1006  0.9734  0.1025  1.0599
AT1G72620  AT1G17430  0.1284  0.7328  0.1375  0.603
AT1G72630  AT1G17455  0.0643  0.7608  0.0613  1.2295

鉴于共线性和Ks值输出结果信息量太大,不方便使用,更好的方法是将两者进行聚合,得到关于各个共线性区的汇总信息。

WGDI提供 -bi 参数帮助我们进行数据整合。同样也是生成配置文件

wgdi -bi ? >> ath.conf

修改配置文件. 其中collinearity 和ks是我们前两步的输出文件,而 ks_col 则是声明使用ks文件里的哪一列。

[blockinfo]
blast = ath.blastp.txt
gff1 =  ath.gff
gff2 =  ath.gff
lens1 = ath.len
lens2 = ath.len
collinearity = ath.collinearity.txt
score = 100
evalue = 1e-5
repeat_number = 20
position = order
ks = ath.ks
ks_col = ks_NG86
savefile = ath_block_information.csv

运行即可

wgdi -bi ath.conf

输出文件以csv格式进行存放,因此可以用EXCEL直接打开,共11列。

  1. id 即共线性的结果的唯一标识

  2. chr1,start1,end1 即参考基因组(点图的左边)的共线性范围

  3. chr2,start2,end2 即参考基因组(点图的上边)的共线性范围

  4. pvalue 即共线性结果评估,常常认为小于0.01的更合理些

  5. length 即共线性片段长度

  6. ks_median 即共线性片段上所有基因对ks的中位数(主要用来评判ks分布的)

  7. ks_average 即共线性片段上所有基因对ks的平均值

  8. homo1,homo2,homo3,homo4,homo5multiple参数有关,即一共有homo+multiple列

主要规则是:基因对如果在点图中为红色,赋值为1,蓝色赋值为0,灰色赋值为-1(颜色参考前述 wgdi 点图 相关推文)。共线性片段上所有基因对赋值后求平均值,这样就赋予该共线性一个-1,1的值。如果共线性的点大部分为红色,那么该值接近于1。可以作为共线性片段的筛选。

  1. block1,block2分别为共线性片段上基因order的位置。

  2. ks共线性片段的上基因对的ks

  3. density1,density2 共线性片段的基因分布密集程度。值越小表示稀疏

这个表格是后续探索分析的一个重点,比如说我们可以用它来分析我们点图中出现在对角线上的基因。下面的代码就是提取了第一个共线性区域的所有基因,然后进行富集分析,绘制了一个气泡图。

df <- read.csv("ath_block_information.csv")tandem_length <- 200df$start <- df$start2 - df$start1
df$end <- df$end2 - df$end1df_tandem <- df[abs(df$start) <= tandem_length |abs(df$end) <= tandem_length,]gff <- read.table("ath.gff")syn_block1 <-  df_tandem[1,c("block1", "block2")]gene_order <- unlist(lapply(syn_block1, strsplit, split="_", fixed=TRUE, useBytes=TRUE)
)gene_order <- unique(as.numeric(gene_order))syn_block1_gene <- gff[ gff$V6 %in% gene_order, "V2"]#BiocManager::install("org.At.tair.db")
library(org.At.tair.db)
library(clusterProfiler)ego <- enrichGO(syn_block1_gene, OrgDb = org.At.tair.db, keyType = "TAIR",ont = "BP")
dotplot(ego)
气泡图

进一步观察这些基因,可以发现这些基因的编号都是前后相连,说明这个基因簇和花粉识别有一定关系。

> as.data.frame(ego)[1,]ID           Description GeneRatio  BgRatio       pvalue
GO:0048544 GO:0048544 recognition of pollen    11/560 43/21845 7.794138e-09p.adjust      qvalue
GO:0048544 8.121073e-06 7.95418e-06geneID
GO:0048544 AT1G61360/AT1G61370/AT1G61380/AT1G61390/AT1G61400/AT1G61420/AT1G61440/AT1G61480/AT1G61490/AT1G61500/AT1G61550Count
GO:0048544    11

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峰值。

如果对WGDI的使用有疑问,可以加入qq群

参考资料:https://wgdi.readthedocs.io/en/latest/index.html

这篇关于如何用WGDI进行共线性分析(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088109

相关文章

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl