群体遗传笔记(一):群体间选择信号的检测及GO注释

从获取下机数据做质控、比对,到calling snp获得vcf文件这一步,网上已经有非常详细的教程,有GATK4.0和全基因组数据分析实践(上),还有Samtools+bcftools Call SNP等等。但是在群体遗传的研究中,我们经常需要比较不同群体的vcf文件,鉴定不同群体间基因组水平上发生分化的区域,并注释其发生分化的基因,网上对于这类群体选择信号分析的分享还比较少。

我通过计算Fst和TajimaD这两个经典的指数,来进行选择信号的分析。话不多说,先走一遍流程吧!

1、工具和文件的准备

工具:vcftools;snpEff;

文件:突变型群体的vcf文件(DA.vcf);包含了突变型和野生型两个群体的vcf文件(all.vcf);突变型群体信息(DA.txt);野生型群体信息(non_DA.txt);参考基因组的GFF注释文件(如果GFF注释文件中没有对应的GO编号信息,则还需要该物种基因ID与GO编号的对应信息文件annot.go.tab)

2、滑窗计算Fst和TajimaD值

vcftools可以通过设置窗口大小来计算染色体(或scaffolds)上指定区域的Fst和TajimaD的值,但不足的是在计算TajimaD值时,不能设置步长(可使用VCF-kit进行可设置步长的计算),因此,为了方便后续的分析,我在这里计算Fst和TajimaD时,只设置了窗口大小(10000),未设置步长。

vcftools --vcf all.vcf --weir-fst-pop DA.txt --weir-fst-pop non_DA.txt --fst-window-size 10000 --out da_nonda

生成da_nonda.windowed.weir.fst 文件

CHROM BIN_START BIN_END N_VARIANTS WEIGHTED_FST MEAN_FST

1      1      10000  7      0.0976319      0.0971726

1      10001  20000  61      0.0511299      0.0499982

1      20001  30000  49      0.0372642      0.0402562

1      30001  40000  49      0.0679565      0.073192

1      40001  50000  17      0.0299695      0.0355619

1      50001  60000  56      0.101204        0.105008

1      60001  70000  180    0.0951801      0.100651

1      70001  80000  21      0.07005 0.0728101

1      80001  90000  60      0.170809        0.178863

1      90001  100000  21      0.0920029      0.10329

vcftools --vcf DA.vcf --TajimaD 10000 --out DA

生成DA.Tajima.D文件

CHROM BIN_START N_SNPS TajimaD

1      0      9      2.88793

1      10000  40      3.12075

1      20000  70      2.90904

1      30000  90      3.37423

1      40000  49      3.24297

1      50000  88      3.31503

1      60000  329    3.52148

1      70000  26      2.38513

1      80000  82      2.30261

1      90000  82      2.37531

1      100000  12      2.48976

1      110000  86      2.43792

1      120000  52      2.95367

1      130000  57      3.03159

1      140000  71      3.06152

1      150000  142    3.478

1      160000  0      nan

1      170000  2      0.34569

1      180000  0      nan

3、对Fst和TajimaD值进行筛选、排序

首先对生成Fst文件进行排序,将文件按照第六列,也就是MEAN_FST这列值,从大到小进行排序

sort -nr -k6 da_nonda.windowed.weir.fst 

1 12910001 12920000 1 2.47818e-17 2.47818e-17

11      11750001        11760000        1      2.47818e-17    2.47818e-17

11      3990001 4000000 2      2.18381e-18    2.29795e-18

10      7260001 7270000 1      2.10168e-17    2.10168e-17

7      16280001        16290000        2      1.0842e-17      1.23909e-17

1      13520001        13530000        2      1.0842e-17      1.23909e-17

7      23470001        23480000        1      0.9375  0.9375

8      18430001        18440000        1      0.931034        0.931034

1      8430001 8440000 1      0.845361        0.845361

9      9550001 9560000 1      0.833333        0.833333

9      5930001 5940000 1      0.833333        0.833333

9      13450001        13460000        1      0.833333        0.833333

排序之后发现,由于有些值过小,在使用科学计数法时排在了正常计数值的前面,为了去掉这个错误,先把使用科学计数法的值,统一归为0,再进行排序

awk '{if($6~/e/)$6=0}1' da_nonda.windowed.weir.fst > da_nonda.window.clean.fst && sort -rn -k6 da_nonda.windowed.clean.fst  > da_nonda.windowed.sort.fst

对文件第2列做减1处理,方便后面与TajimaD匹配

awk '{$2 = $2-1;print$0}' sp1_da.window.sort.fst > sp1_da.sort.fst

统计da_nonda.sort.fst有多少行

wc -l da_nonda.sort.fst

17824

取Fst值最大的前10%窗口,作为候选选择区域

head -n 1782 da_nonda.sort.fst > da_nonda.top0.1.fst


对于TajimaD文件,先清除掉第4列为nan的行,再对其进行排序,取前5%和后5%的值

sed -e '/nan/d' DA.Tajima.D > DA.clean.tajimaD && sort -nr -k4 DA.clean.tajimaD > DA.sort.tajimaD

wc -l DA.sort.tajimaD

19484

head -n 974 DA.sort.tajimaD > DA.top0.05.tajimaD

tail -n 974 DA.sort.tajimaD > DA.bot0.05.tajimaD

取Fst前10%区域和TajimaD前5%(后5%)区域的交集,并按照染色体(scaffolds)顺序排序,将得到的这些窗口作为受选择区域

cat DA.top0.05.tajimaD da_nonda.top0.1.fst > DA.top && awk 'pass==1 { count[$1,$2]++ } pass==2 { if(count[$1,$2]>1) print }' pass=1 DA.top pass=2 DA.top > DA.top.site

wc -l DA.top.site

40

head -n 20 DA.top.site > DA.top.keep.site

sort -n -k1 DA.top.keep.site > DA.top.sort.site

得到的文件如下

1 17540000 2 1.9458

1      28520000        3      1.96716

2      17140000        5      2.41094

2      19520000        2      2.03336

2      19620000        2      1.97256

2      19630000        2      2.03336

2      21790000        2      1.92526

2      28710000        2      2.03336

3      12170000        12      2.63244

3      14190000        12      2.74771

3      25930000        4      1.94295

3      4700000 4      2.25325

4      8030000 5      2.04905

5      8680000 16      2.6894

6      13390000        7      2.06337

6      22180000        3      2.0041

7      23620000        2      1.92526

8      8650000 3      2.24976

11      5080000 3      2.04485

12      1160000 6      2.23514

4、使用snpEff对DA.vcf文件进行注释

snpEff的教程很多,先SnpEff 配置基因组注释文件,再snpEFF注释vcf-笔记,最终得到包含注释信息的DA.annotation.vcf

#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT sample12 sample13 sample14 sample15 sample16 sample17 samp

le18        sample19        sample20        sample21

1      3923    .      T      C      98      PASS    BQB=0.169762;HOB=0.5;ICB=1;MQ=40;MQ0F=0.0322581;MQB=0.000633889;MQSB=0.975265;RPB=0.103031;SGB=-0.662043;VDB=0.07878

29;DP=198;DP4=60,33,30,28;AN=10;AC=5;ANN=C|intergenic_region|MODIFIER|CHR_START-VJ01Gene00001|CHR_START-VJ01Gene00001|intergenic_region|CHR_START-VJ01Gene00001|||n.3923T>C|

|||||  GT:AD:ADF:ADR:DP:PL:SP  ./.:.:.:.:.:.:. 0/1:12,9:8,6:4,3:21:55,0,255:0  0/1:27,14:17,8:10,6:41:132,0,255:1      ./.:.:.:.:.:.:. 0/1:15,11:9,6:6,5:28:108,0,255:0

        0/1:18,13:11,5:7,8:31:105,0,255:5      ./.:.:.:.:.:.:. 0/1:21,9:15,4:6,5:30:70,0,255:6 ./.:.:.:.:.:.:. ./.:.:.:.:.:.:.

5、从物种的基因ID到GO ID

得到分化区域内SNP的注释信息,并去掉intron区和同义突变的位点

awk '$3 = "vcftools --vcf DA.annotation.vcf --chr"" " $1" " "--from-bp"" "$2" " "--to-bp"" "$2+10000" " "--recode --recode-INFO-all --out"" "$1"_"$2 {print $3}' DA.top.sort.site > vcf.sh

sh vcf.sh

grep -v "int" *.recode.vcf|grep -v "synonymous_variant" > non_int_synon.vcf

提取SNP位点所对应的基因ID信息

awk '{print $8}' non_int_synon.vcf|grep -o 'VJ01Gene[0-9][0-9][0-9][0-9][0-9]' > geneID.txt

去重复

sort -n geneID.txt | uniq > clean_geneID.txt

将物种的基因ID与GO数据库的ID对应

awk 'ARGIND==1{a[$1]=$0} ARGIND==2 && ($1 in a) {print $0}' clean_geneID.txt annot.go.tab > geneID_goID.txt

提取GO ID

awk '{print $2}' geneID_goID.txt > goID.txt

less goID.txt

GO:0004725

GO:0006570

GO:0035335

GO:0004190

GO:0006508

GO:0004190

GO:0005764

GO:0006508

这样就得到了Fst top0.1和TajimaD top 0.05两者都存在的GO ID,即受到平衡选择的基因,TajimaD bot 0.05筛选的是受到定向选择的基因,做法也是一样的。

最后,对我们得到的基因进行GO富集分析,在线GO富集的工具有很多,基迪奥在线云分析平台和遗传所王秀杰课题组开发的GOEAST平台都很方便做。基迪奥平台的富集分析结果如下


群体遗传笔记(一):群体间选择信号的检测及GO注释_第1张图片
GO富集


写在最后:从去年11月拿到下机的重测序数据,并简单搭建了服务器分析环境,一路摸着石头过河,战战兢兢,在度娘和github两位老师的指导下才逐步入门,希望和更多做群体重测序的小伙伴交流啊!QQ:657231499



 

你可能感兴趣的:(群体遗传笔记(一):群体间选择信号的检测及GO注释)