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
首先上传数据,每列数据类型都为数值型
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()
}