2021-01-04根据SNP验证自然选择—XPEHH分析

转载自https://mp.weixin.qq.com/s/1IM6KSCGIq0cUJhKKXVcIw

背景

选择清除分析是常用于鉴定群体基因组水平受选择区域的一种方法,其背后的理论是:在受选择群体中,会出现有利等位基因的频率快速上升,与其相邻位点的多态性快速下降的现象。基于此,我们可以通过计算群体内基因组区域的等位基因频率的变化情况来鉴定受选择基因组区域。常用群体内检测指标的计算方法大致分为三种:1.基于核苷酸多态性降低的π、θw;2.基于分离位点频率的Tajima’D;3.基于连锁不平衡增加的EHH、iHS。以上三类指标对应于基因组受选择特征的三个维度,而后才有了群体间的选择指标:1.由π衍生的π ratio、ROD、Fst;2.由EHH衍生的XPEHH。本文主要介绍XPEHH的实操。

XPEHH分析

XPEHH是基于群体单倍型的选择清除分析,有很多工具可以实现XPEHH方法,比如R包rehh、Linux平台下selscan软件。在这里我用selscan软件完成。

1.软件下载与安装

selscan下载网址:https://github.com/szpiech/selscan/releases选择最新版本,复制链接地址

Linux下输入

2.查看分析所用数据文件及格式

selscan软件帮助文档可以在此下载:https://github.com/szpiech/selscan/blob/master/manual/selscan-manual.pdf

通过软件文档我们可以了解到XPEHH分析有三种输入方式:

wget -c https://github.com/szpiech/selscan/releases/download/v1.3.0/selscan-linux-1.3.0.tar.gz

tar -zxvf selscan-linux-1.3.0.tar.gz #解压压缩包

cd ./selscan-linux-1.3.0

pwd

selscan=软件所在绝对路径

2.查看分析所用数据文件及格式

selscan软件帮助文档可以在此下载:https://github.com/szpiech/selscan/blob/master/manual/selscan-manual.pdf

通过软件文档我们可以了解到XPEHH分析有三种输入方式:

selscan --xpehh --hap <pop1 haplotypes> --ref <pop2 haplotypes> --map <mapfile> --out <outfile> 

#hap文件格式输入

selscan –xpehh –vcf <pop1 vcf> --vcf-ref <pop2 vcf> --map <mapfile> --out <outfile> #vcf文件格式输入

selscan –xpehh –tped <pop1 tped> --tped-ref <pop2 tped> --map <mapfile> --out <outfile> #tped文件格式输入

因为我的数据文件是所有个体总的vcf文件,所以选用vcf文件作为输入文件格式最为方便。软件对vcf文件格式要求:前九列同标准的vcf格式一样,后面紧接着的个体的基因型尽量是phasing后的。文件格式如下:< quality ><individual 1 genotype > ... < individual N genotype >

1 100 rs1 0 1 . . . . 0|1 0|0

1 200 rs2 0 1 . . . . 1|1 1|0

1 300 rs3 0 1 . . . . 0|0 1|0

1 400 rs4 0 1 . . . . 0|0 1|0

1 500 rs5 0 1 . . . . 1|0 0|1

所以我们需要对原始的vcf文件进行phasing

另外我们还需要准备一个map文件,这个文件主要用来存放每个标记的ID以及所在的染色体、物理位置、遗传距离(cM)。文件格式如下:

1 rs1 0.01 100

1 rs2 0.02 200

1 rs3 0.03 300

1 rs4 0.04 400

1 rs5 0.05 500

3.数据文件准备

3.1 map文件的准备

除了做模式植物的,大多数情况下我们都没有一个现成的能和自己当下vcf文件一一对应的map文件。我们可以根据物种总的遗传距离和基因组大小,算平均的遗传距离,而后根据每个标记的物理位置推断遗传距离。

这是原始的vcf文件。


由于参考基因组版本问题,这里存在很多位于随机或未知染色体上的变异位点,所以需要先过滤掉这些位点。

grep -v "random" file.vcf > file1.vcf 

grep -v "Un" file1.vcf > filtered.vcf

另外需要注意的是,selscan软件要求输入的基因型只能是0或1,而不能是其它。所以我们需要在这里把多等位基因位点过滤掉,避免后续分析出现问题(我当时就吃了这个亏,导致分析重来

Vcftools --vcf filtered.vcf --min-alleles 2 --max-alleles 2 --recode --out Vitis_all_sample

接下来我们就从过滤后的vcf文件提取chr/id/physical position这三列

cut -f 1,3,2 Vitis_all_sample.recode.vcf > dis.map

直接cut vcf文件会带#号的注释行一同输出到dis.map文件中,所以需要去掉以#号开头的注释行

sed -i '/^#/d' dis.map

接下来算遗传距离的均值,并把物理距离转换成遗传距离:vitis基因组大小 ~500M,查到16年一篇文献vitis总的遗传距离为2424cM,相当于每单位物理位置为0.00000485cM 生成最终的map文件

awk '{ print $1" "$3" "$2*0.00000485" "$2}' file.map > new.map

注意:map文件要求是空格分割

3.2 vcf文件的phasing

在phasing之前我需要根据研究目的从总的样本的vcf文件中提取两个亚群的子vcf文件。准备两个群体分类表,每行是一个样本名称(注意这个样本名称要和vcf文件记录的样本号保持一致) 我使用bcftools提取vcf文件的子集

#首先对vcf文件进行压缩

bcftools view Vitis_all_sample.recode.vcf -Oz -o Vitis_all_sample.recode.vcf.gz

#然后建立索引

bcftools index Vitis_all_sample.recode.vcf.gz

#最后根据群体分类表提取子vcf文件

bcftools view -S pop.list Vitis_all_sample.recode.vcf.gz > new.vcf

这里压缩vcf文件以及建立索引这一步很重要,这样才可以保证后面提取vcf文件不会出错。如果你不压缩以及建立索引,直接提取子集很容易出现no header..一类的报错,这是因为vcf文件中的header部分并没有指明全部的chr,可以通过修改vcf文件header信息来解决这个问题。但是我感觉这样做有些麻烦,所以还是推荐先压缩一下,然后建立索引,这样能避免很多错误。

phasing软件有很多,常用的主要有SHAPEIT、Beagle。关于用SHAPEIT进行phasing公众号先前文章Haplotype phasing 常用软件实操介绍和黄树嘉如何使用Shapeit2对人类基因组数据进行Phasing在这里我用Beagle软件来做phasing。

Beagle软件下载 官网:http://faculty.washington.edu/browning/beagle/beagle.html

右键复制.jar文件链接地址,然后转到Linux界面下输入

wget -c http://faculty.washington.edu/browning/beagle/beagle.18May20.d20.jar

pwd

beagle=path/beagle.18May20.d20.jar

因为这是用java语言写的软件,所以无须安装,有java环境即可运行

常规的vcf文件就可以作为Beagle软件的输入,此外还需要输入一个map文件,其格式与selscan要求的map文件格式是一致的,前面已经准备过了,接下来就可以phasing了!等等,其实还有一件事没有做.....单倍型以及基于单倍型的分析都需要逐条染色体运行,所以我们还需要把vcf文件以及map按照染色体ID进行拆分。

拆分vcf文件

for i in {1..19}

do

vcftools --vcf file.vcf --chr $i --recode --out $i

done

注:葡萄有19条染色体,所以循环次数为1-19

拆分map文件

mkdir ./map#创建一个map文件夹

mv new.map ./map#把整理好的map文件移动到map文件夹

awk'{print > $1}'new.map#这行代码可以直接把map文件根据chr列拆分成多个文件

好了,现在可以开始phasing了!

Beagle软件的运行方式:java -Xmx[GB]g -jar beagle.jar [arguments],需要注意的是输入的参数和值由=连接,中间不能有任何其它字符。

for i in{1..19}

do

Java -Xmx10g -jar$beaglegt=${i}.vcf map=../map/${i}ne=10 out=$inthreads=6

done

gt指输入的vcf文件,ne是指样品数量,nthreads就是线程数,out指定输出文件前缀。最后会生成.vcf.gz格式的文件。

4.selscan做XPEHH分析

等待两个亚群phasing结束后,我们就可以进行XPEHH分析了,运行代码为:

for i in{1..19}

do

$selscan--vcf"${i}.vcf.gz"--vcf-ref"../w/${i}.vcf.gz"--map"../map/${i}"--threads 6 --out$i

done

--vcf指想研究亚群的所有染色体的vcf文件,--vcf-ref是用作参考的亚群,map就是前面已经准备好的单条染色体的map文件。根据自己数据存放的位置,要灵活调整指定的文件路径。

最后生成结果

XPEHH分析结果可视化

展示选择清除分析结果的最常用的就是曼哈顿图。如下图,横轴代表染色体,纵轴是不同选择清除分析指标算的值,图中的每一个点代表一个sweep或marker;如果是GWAS每一个点就代表一个SNP。

所以要画这种图,我们先要把XPEHH分析所得染色体的文件合并为一个文件

cat *. > black.xpehh#在存放xpehh结果文件中直接运行这段命令

注意:因为每条染色体生成的xpehh文件都会有id\pos等表头,直接cat会造成生成的总文件中存在多个表头行,会影响整成绘图,所以我在R代码中增加了一个对文件的过滤步骤。

绘制曼哈顿图可以利用R包CMplot、qqman。我用CMplot展示下XPEHH的分析结果

绘图代码:

library(tidyverse)

library(CMplot)

input <- “path+file”

prefix <- “black”

#读入文件
xpehh <-

  read.table(input, header = T) %>%

  filter(!str_detect(id, 'id')) %>%

  separate(col = id, into = c("chr", 'position'), sep = "__", remove = F) %>%

  select(id, chr, pos, xpehh)

#作图
png(paste(prefix, "_XPEHH.png", sep = ""), width=960, height=480)

CMplot(xpehh,

      type = "p",

      plot.type = "m",

      LOG10 = F,

      cex = 0.2,

      band = 0.5,

      ylab.pos = 2,

      cex.axis = 1,

      ylab="XPEHH",

      file.output = F )

dev.off()

在R代码中需要注意以下几点:

1、filter(!str_detect(id, 'id')) 用来过滤掉文件中多余header行;

2、separate(col = id, into = c("chr", 'position'), sep = '__', remove = F) 用来分割id行,目的是为了生成chr列;

3、select(id, chr, pos, xpehh) 因为CMplot对输入的作图文件的要求:前三列必须为id\chr\pos。所以这里用select函数重新整理了以下作图文件。

参考资料:

基于LD衰减和等位基因频率检测自然选择-XPEHHhttps://mp.weixin.qq.com/s/-YydvSjsxTbRxjIPtUGLsA

Haplotype phasing 常用软件实操介绍https://mp.weixin.qq.com/s/YwXq_MA4SEXJhNzm-lF5-g

Beagle 5.1 http://faculty.washington.edu/browning/beagle/beagle.html

selscan v1.3.0 https://github.com/szpiech/selscan/releases/tag/v1.3.0

vcftools https://vcftools.github.io/man_latest.html

bcftools http://samtools.github.io/bcftools/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容