美文网首页Variants calling
Fst、PI、TajimaD值的计算

Fst、PI、TajimaD值的计算

作者: luly | 来源:发表于2022-02-14 15:10 被阅读0次

    Fst值的计算

    群体间分化指数fst,取值范围0~1,值越大表明群体间分化程度越高,亲缘关系越远。

    #按照窗口模式计算(更准确)
    vcftools --vcf Filter.snp.vcf --weir-fst-pop 1-population.txt --weir-fst-pop 2-population.txt --out p1_p2_window --fst-window-size 500000 --fst-window-step 50000
    vcftools --vcf Filter.snp.vcf --weir-fst-pop 1-population.txt --weir-fst-pop 3-population.txt --out p1_p3_window --fst-window-size 500000 --fst-window-step 50000
    vcftools --vcf Filter.snp.vcf --weir-fst-pop 2-population.txt --weir-fst-pop 3-population.txt --out p2_p3_window --fst-window-size 500000 --fst-window-step 50000
    #参数
    #weir-fst-pop 需要计算的群体ID名,与vcf文件里的群体ID名一致,该文件必须是txt格式,每个ID占一行
    #--fst-window-size  --fst-window-step 设置窗口大小和步长的参数,按自己的需求而定
    #根据加权fst为Fst排序
    sort -k 5 -g p1_p2_window.windowed.weir.fst > p1_p2.sorted.fst
    #窗口计数
    wc -l p1_p2.sorted.fst #假设为20000
    #取前1%
    tail -n 200 p1_p2.sorted.fst > p1_p2.sorted.1%.fst
    #找出前1%中最小的加权fst值
    

    这个窗口大小和步长不影响结果

    曼哈顿图

    #处理数据文件格式(sed '1d' 去掉表头,awk 如果加权FST<0,则取0
    sed '1d' p1_p2_window.windowed.weir.fst|awk '{if($5<0)print $1"\t"$2"\t0";else print $1"\t"$2"\t"$5}' > p1_p2_fst.txt
    

    首先上传数据,每列数据类型都为数值型

    e39aedd80d2e84249fa4ba37590e335.png
    library(qqman)
    filt=data.frame(p1_p2_fst)
    SNP <- paste(filt[,1],filt[,2],sep = ":")
    Fstfile <- cbind(SNP,filt)#合并
    colnames(Fstfile)<-c("SNP","CHR","POS","FST")#添加列名
    colorset<-c("#FF0000","#FFD700","#2E8B57","#7FFFAA","#6495ED","#0000FF")
    manhattan(Fstfile,chr="CHR",bp="POS",p="FST",snp="SNP",col=colorset,logp=F,genomewideline=0.9,ylab="Fst",font.lab=2,cex.lab=1,main="G1vsG2",cex=0.8)
    #genomewideline=0.9 前1%的最小值
    

    计算总体PI值和TajimaD

    核酸多样性PI,值越大说明核苷酸多样性越高
    TajimaD用于检验DNA序列在演化国产过程中是否遵循中性演化模型。D>0:平衡选择,突然群体收缩;D<0:最近的选择性清除,最近瓶颈后的群体扩张,与消除基因连锁;D=0:群体根据突变-漂移平衡演变,没有选择。

    vcftools --vcf Filter.snp.vcf --window-pi 500000 --out total
    vcftools --vcf Filter.snp.vcf --TajimaD 500000 --out total
    

    计算每个亚群的PI值和TajimaD值

    #创建bash脚本
    vi test.sh
    #写入以下内容:
       for i in {1..3};do
       #根据ID,从vcf文件中提取每个亚群的信息
       vcftools --vcf Filter.snp.vcf --keep ${i}-population.txt --recode -- 
       recode-INFO-all --out p${i}
       #根据提取的信息计算每个亚群的PI值
       vcftools --vcf p${i}.recode.vcf --out q${i}_pi_500kb --window-pi 
       500000 --window-pi-step 50000
       #根据提取的信息计算每个亚群的TajimaD值
       vcftools --vcf p${i}.recode.vcf --out q${i}_500kb.TajimaD --TajimaD 
       500000
       done
    #给bash脚本添加可执行权限
    chmod +x test.sh
    #运行脚本
    ./test.sh
    

    根据pi值画箱线图和小提琴图

    #添加分组信息G1、G2、G3
    data=data.frame(q1_500kb_pi_windowed)
    data
    Group=c("G1")
    data1=data.frame(data,Group)
    data=data.frame(q2_500kb_pi_windowed)
    data
    Group=c("G2")
    data2=data.frame(data,Group)
    data=data.frame(q3_500kb_pi_windowed)
    data
    Group=c("G3")
    data3=data.frame(data,Group)
    #将三组数据合并
    library(dplyr)
    total_data<-dplyr::bind_rows(data1,data2,data3)
    #画箱线图+小提琴图
    p <- ggplot(total_data,aes(Group,PI,fill=Group))+geom_boxplot(width=.2)+geom_violin()
    mytheme <- theme(plot.title = element_text(face = "bold.italic", size = "14", colour = "brown"), axis.title = element_text(face = "bold.italic", size = "10",color = "blue"), axis.text.x = element_text(face = "bold", size = 8, angle = 45, hjust = 1, vjust = 1), axis.text.y = element_text(face = "bold",size = 8), panel.background = element_rect(fill = "white", color = "black"), panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank(), legend.text = element_text(size = 8), legend.title = element_text(size = 10, face = "bold"), panel.grid.minor.x = element_blank())
    p + mytheme
    

    根据PI值画折线图

    #输入数据时,每列必须是数值型数据,尤其是染色体那一列
    data=data.frame(q1_500kb_pi_windowed)
    Group=c("G1")
    data1=data.frame(data,Group)
    data=data.frame(q2_500kb_pi_windowed)
    Group=c("G2")
    data2=data.frame(data,Group)
    data=data.frame(q3_500kb_pi_windowed)
    Group=c("G3")
    data3=data.frame(data,Group)
    #将三组数据合并
    library(dplyr)
    library(ggplot2)
    total_data<-dplyr::bind_rows(data1,data2,data3)
    for (i in 1:7){ 
      result_name = paste("chr",i,".png",sep="") 
      png(result_name,width=1500,height=300) 
      chrom = subset(total_data,CHROM==i) 
      xlab = paste("Chromosome",i,"(MB)",sep="") 
      p <- ggplot(chrom,aes(x=BIN_END/1000000,y=PI,color=Group,shape=Group)) + geom_line(size=0.5) + xlab(xlab)+ ylab("Pi") + theme_bw() 
      print(p) 
      dev.off() 
      }
    
    

    相关文章

      网友评论

        本文标题:Fst、PI、TajimaD值的计算

        本文链接:https://www.haomeiwen.com/subject/tzoxnltx.html