二代群体遗传与重测序(中)

二.变异结果注释与统计

书接上回https://www.jianshu.com/p/ab6a35502786
如果是使用转录组重测序的话需要修改过滤条件,会发现大多数变异都发生在基因区,其他的差别都不大。比对参考基因组之后进行变异检测,同样可以用GATK的流程来做。会多一个cigar字符串的处理步骤。因为在基因组上会比对出跨区域的reads,所以要把这样一整条reads(中间是非基因区)当做两条来处理。
三代测序由于错误率高,本身是不适合用于变异检测的,尤其是SNP和InDel。
我们要统计的SNP变异类型包括:
1.变异位点是否存在于基因区or上下2kbp范围内,如果在2k之内的话可能存在一些转录元件。太远的话就可以视为基因间区了
2.如果在基因区的话,就要区分是否在intron区。在UTR区的变异影响不大,而在CDS区的话又要进一步进行分析。
3.如果变异影响了氨基酸类型的话,就会对基因功能(蛋白)造成影响了。
4.更加严重的变异类型有:对起始密码子的突变,突变后形成终止密码子(提前终止),干扰可变剪切位点。
在InDel变异中,造成的非3倍数的移码突变会非常严重。即使是3倍数的移码突变也是较严重的突变。

annovar 注释

• 文件准备:
基因组的位置文件gtf
变异位点文件vcf
gtf第八列是相位(phase)信息,意为处在CDS交界处的碱基偏移

SNP 和 INDEL
# 格式转换
$ gtfToGenePred -genePredExt \
  genome.gtf \
  genome_refGene.txt#下划线后的东西不能变
# 提取转录本(来自annovar软件)
$ retrieve_seq_from_fasta.pl --format refGene \
  --seqfile genome.fasta \
  --out genome_refGeneMrna.fa \
  genome_refGene.txt

输出得到fa文件之后进行注释。annovar可以基于基因位置进行注释,也可以基于指定区域注释。

#格式转换
$ convert2annovar.pl \
-format vcf4 \ #输入文件格式
-allsample \ #不加的话只有第一个样本的信息
-withfreq \ #输出alt频率
all.filtered.snp.vcf \ #输入文件,来自GATK的输出
>all.snp.vcf.annovar.input #输出文件
#注释
$ annotate_variation.pl \
 -geneanno \ #基于基因进行注释
 --neargene 2000 \ #需要考虑的gene上下游范围
 -buildver genome \ #基因组数据库名称
 -dbtype refGene \ #数据库类型
 -outfile all.anno.snp \ #输出文件前缀
 -exonsort \ # 结果按exon进行排序
 all.snp.vcf.annovar.input ./#最后一项是数据库所在的目录

#统计基因组各区域中snp的个数
$ less -N all.anno.variant_function |cut -f 1|sort | uniq -c

分别会得到全基因组变异文件和外显子变异文件,后者详细记载有变异类型。InDel变异只需要改变文件的名字就可以了。最后得到的输出文件中,碱基的突变会不止一个,而变异类型的种类也会更多。
当一个变异可能属于多种变异类型的时候,annovar会按变异造成的后果严重性进行优先级排序,只输出最严重的。如果需要所有类型的输出结果可以用SnpEff软件或者加参数。

SV与CNV

可以继续用上一步构建好的数据库,命令几乎一样。

$ convert2annovar.pl -format vcf4 -allsample -withfreq  all_SV.vcf >SV_annovar.input

$ annotate_variation.pl -geneanno --neargene 2000 -buildver genome -dbtype refGene -outfile SV_annovar.output -exonsort SV_annovar.input ./

三.群体结构分析

包括structure,PCA,进化树分析和LD decay等

01.snp数据过滤

需要过滤maf次等位基因频率,missing,还有LD过滤。前二者用于去掉低质量snp位点,后者用于生成符合哈温平衡的群体。

$ plink --vcf all.vcf \ # 输入文件
 --geno 0.1 \ # 设置缺失率阈值
 --maf 0.01 \ # 设置maf阈值
 --biallelic-only strict \ # 去掉三等位位点
 --out all.missing_maf \ # 输出文件前缀
 --recode vcf-iid \ # 输出vcf格式
 --allow-extra-chr \ # 允许其他类型的染色体
 --set-missing-var-ids @:# \ # 给没有id的snp取一个id
 --keep-allele-order #让plink不要给ref和alt换位置

plink过滤maf和missing,也可以用vcftools来完成。

$ plink --vcf all.missing_maf.vcf \
 --indep-pairwise 50 10 0.2 \ # LD过滤阈值
 --out tmp.ld \#前缀
 --allow-extra-chr \
 --set-missing-var-ids @:#

$ plink --vcf all.missing_maf.vcf \
 --extract tmp.ld.prune.in \ # 保留的SNP列表
 --out all.LDfilter \
 --recode vcf-iid \#输出文件的格式
 --keep-allele-order \
 --allow-extra-chr \
 --set-missing-var-ids @:#

第一步输出是可以保留下来的的位点的id信息,所以上一步过滤的时候最好可以给它加一个id。第二步再利用位点id信息来提取对应的vcf文件。
显然,LD过滤会越来越少。如果不需要那么多snp位点去进行分析的话可以把阈值卡得更严格,从而节省计算资源。

02.进化树构建

• 文件准备
vcf 文件:all.LDfilter.vcf

$ run_pipeline.pl -Xms1G -Xmx5G \
 -SortGenotypeFilePlugin \
 -inputFile all.LDfilter.vcf \
 -outputFile all.LDfilter.sort.vcf \
 -fileType VCF

$ run_pipeline.pl -Xms1G -Xmx5G \
 -importGuess all.LDfilter.sort.vcf \
 -ExportPlugin \
 -saveAs sequences.phy \
 -format Phylip_Inter

phylip格式转换之前需要先排序。虽然表面上是一个pl程序,但其中有调用java的部分,所以仍然需要设置一些java参数
dnadist可以用于nj法交互式建树,不过由于群体遗传的数据量往往非常大,脚本式利用配置文件在后台运行会更加合适。

$ echo -e "sequences.phy\nY" > dnadist.cfg #-e打入换行符
$ dnadist < dnadist.cfg >dnadist.log ##距离矩阵
$ mv outfile infile.dist
$ echo -e "infile.dist\nY" > neighbor.cfg
$ neighbor  < neighbor.cfg >nj.log

#距离矩阵
$ less infile.dist | tr '\n' '|'| sed 's/| / /g' | tr '|' '\n' >infile.dist.table
#去掉换行符
$ less outtree | tr '\n' ' '|sed 's/ //g' > outtree.nwk

dnadist发现outfile会报错而非覆盖,所以最好把它名字改掉。
这样进化树文件就做好了,再改用其他软件来作图。听说ggtree包很好看。

03.structure分析

# vcf格式转bed格式
$ plink --vcf ../00.filter/all.LDfilter.vcf \
--make-bed --out all --allow-extra-chr \
--keep-allele-order --set-missing-var-ids @:#
# 生成k=2~4的脚本
$ seq 2 4 | \
 awk '{print "admixture --cv -j2 all.bed "$1" 1>admix."$1".log 2>&1"}'\
 > admixture.sh
$ cat admixture.sh 
admixture --cv -j2 all.bed 2 1>admix.2.log 2>&1
admixture --cv -j2 all.bed 3 1>admix.3.log 2>&1
admixture --cv -j2 all.bed 4 1>admix.4.log 2>&1
$ nohup sh admixture.sh &
#绘图
$ mkdir result
$ cp  ./*.Q result/
$ less outtree.nwk |sed 's/:/\n/g'|awk -F '[,(]' '{print $NF}'|awk '$1 !~")"' >sample.pop.order 
$ Rscript draw_admixture.R result all.fam  sample.pop.order  structure

在log文件里面看各K值的CV error
Rscript第一个参数是Q矩阵;第二个参数来自格式转换时生成的fam文件,也可能用别的含样品顺序的文件;第三个参数是输出的样品顺序文件;最后是输出的前缀。可以基于树文件中给出的大概分类情况来调整顺序。
其他的看这篇文章吧https://www.jianshu.com/p/21c2a683c6fb

04.PCA分析

• 文件准备:
vcf 文件;all.LDfilter.vcf
分组信息表:sample.pop

plink --vcf all.LDfilter.vcf \
 --pca 10 \ # 主成分个数
 --out PCA_out \
 --allow-extra-chr --set-missing-var-ids @:#

利用输出的PCA_plink.out.eigenvec和分组信息,在R中进行绘图。如果要分析三个主成分的话可以输出两张图,一张3dPCA的效果并不好。

05.LDdecay和LDBlock

随着两个site在基因组上的距离变远,连锁也会变弱,二者间的R²会变小。将所有SNP的LD系数按距离求平均作为纵轴,将距离作为横轴


LD系数计算

LD衰减距离取决于群体类型、世代间隔和染色体相对位置.
• 文件准备
亚群样品列表文件:
pop.SC.table
pop.YZR.table

$ head -n 3 pop.SC.table
GA0008
GA0035
GA0038

#两个亚群
$ PopLDdecay -InVCF all.vcf \ # 输入vcf文件
 -SubPop pop.SC.table \ # 指定要分析的亚群
 -MaxDist 500 \ # SNP对距离上限500kb
 -OutStat pop.SC.stat
$ PopLDdecay -InVCF ../data/all.vcf  -SubPop ../data/pop.YZR.table  -MaxDist 500 -OutStat pop.YZR.stat
#多个亚群共同绘图
### 准备配置文件,可以从文件名中awk出来
$ ls pop.*.stat.gz |awk -F"." '{ print $0"\t"$2 }' > ld_stat.list
$ Plot_MultiPop.pl -inList ld_stat.list \
 -output ld_stat.multi \
 -keepR#用于生成R脚本

LDBlock用于展示染色体局部的相关性,所以需要自己先有一个关注的预选区域

$ LDBlockShow -InVCF all.missing_maf.vcf \
-OutPut LDBlockShow \ # 输出图片前缀
-Region 1:300000-500000 \ # 绘图范围
-SeleVar 2 \ # 绘制Rˆ2
-OutPdf \ # 输出pdf图片
-OutPng # 输出png图片
LDBlock

LDBlock展示了连锁遗传信息,一般会和曼哈顿图一起用

四.群体选择分析

01.π值,Fst,Tajima'D检验

• 文件准备
亚群样品列表文件 pop.SC.table pop.YZR.table 群体变异检测结果文件:all.vcf

#π值计算
$ vcftools --vcf all.vcf \
 --window-pi 100000\ #设置窗口大小
 --window-pi-step 10000\ #设置步长
 --keep pop.SC.table \ #亚群样品列表
 --out ./Pi.SC #输出文件前缀
###同理指定其他亚群
$ vcftools --vcf all.vcf  --window-pi 100000 --window-pi-step 10000\  --keep pop.YZR.table  --out ./Pi.YZR
#π值沿染色体的分布
$ ls Pi.*pi | awk -F "." '{print $2"\t" $0}' > Pi.list

接下来就可以利用Pi.list来进行CMplot绘图。染色体中间π值很低的区域往往是着丝粒区域。同样,ROD的曼哈顿图也可以用CMplot绘制。

#TajimaD
$ vcftools --vcf all.vcf \
--TajimaD 100000 \
--keep ../../data/pop.SC.table \
--out TajimaD.SC#前缀名称
$ vcftools --vcf all.vcf --TajimaD 100000 --keep pop.YZR.table --out TajimaD.YZR
$ ls TajimaD.*.Tajima.D |awk -F"." '{print $2"\t"$0}' > TajimaD.list
#Fst
$ vcftools --vcf all.vcf \
--fst-window-size $window \ # 窗口大小
--fst-window-step $step \ # 设置step距离
--weir-fst-pop pop.SC.table \
--weir-fst-pop pop.YZR.table \
--out ./Fst.pop1.pop2

一系列的统计值计算都是用vcftools完成的,在log中有Fst的平均值和加权值的统计,可以用加权平均数来进行CMplot绘图。输出文件为.windowed.weir.fst,两个样本分化越大,这个值也会越大。
接下来可以进行Fst和ROD的联合分析,以及Fst,D和π的联合绘图。

02.XP-CLR

这里使用后发表的Python版本的XPCLR软件

$ xpclr -I ../data/all.vcf \
        -O Chr01.xpclr-python.out \
        -C Chr01 \
        -Sa  pop.SC.table \#两个亚群信息
        -Sb  pop.YZR.table  \
        --rrate  1e-8 \#单位碱基对应的遗传距离
        --ld 0.95 \
        --maxsnps 200 \
        --size 100000 \#滑窗
        --step 20000
$ cut -f 2,3,4,12 Chr01.xpclr-python.out | awk 'NF == 4 '  > Chr01.xpclr-python.table
#提取两个chr中xpclr的结果(第12列)
$ xpclr -I ../data/all.vcf -O Chr02.xpclr-python.out -C Chr02 -Sa  pop.SC.table -Sb  pop.YZR.table --rrate  1e-8 --ld 0.95 --maxsnps 200 --size 100000 --step 20000
$ cut -f 2,3,4,12 Chr02.xpclr-python.out | awk 'NF == 4 ' > Chr02.xpclr-python.table
#如果是第一行,或者最后一列是xpclr,而且没有空值的列输出
$ cat Chr*.xpclr-python.table | awk '{if((NR==1 || $NF != "xpclr") && NF == 4 ){print $0 }}' >  all.xpclr-python.table

最后的结果也可以在R中绘图,受到选择越强的区域xpclr值会越大。

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

推荐阅读更多精彩内容