vcf-query -l xx.vcf
在进行admixture运算时,需要染色体名称为整数,常需要提取vcf文件中的染色体名称,并进行修改,需要以下几步。
第一步:提取vcf中染色体名称
awk '{print $1}' xxx.vcf | grep '^[^#]' > chr.txt
第二步:将染色体的名称进行修改,如果染色体均以chr开头则说明没有未组装到染色体上的scaffold,若有未组装到染色体上的scaffold,则这些scaffold 用0 进行替代 (可以直接用excel)
awk '{print $1 "\t" $1}' chr.txt | awk 'gsub(/chr/,"",$2)' > chr_rename.txt
有unplaced scaffold则把原先chr.txt 分为两部分,再替换后,再合并成一个文件
第三步:利用bcftools 中的 annotate 命令修改染色体名称
bcftools annotate --rename-chr chr_rename.txt xxx.vcf > new_chr.vcf
第四步:利用plink生成.bed文件
plink --vcf new_chr.vcf --make-bed --out plink_out --const-fid
第五步:计算admixture中的最佳k值
for k in {1..9}; do echo "admixture --cv -j10 plink_out.bed $k >admix.${k}.log 2>&1"; done > admixture.sh
nohup sh admixture.sh
第六步:作图
grep CV log.txt | awk -F ':' '{print NR"\t"$3}' | sed '1i\K\tCV_error' >> CV_for_plot.txt
## 参数
awk -F ':' 以:分隔
NR 当前行号
"\t" 空格
$2 第二列
sed '1i\K\tCV_error' 表示给第一行添加K 空格 CV_error
sed '5i\内容' 表示给第五行添加内容
R中绘图:
library(ggplot2)
mydata <- read.table("CV_for_plot.txt",header=T,sep="\t")
qplot(x=K,y=CV_error,color=I('black'),data=mydata)+geom_line(color="red",lwd=1)
##CV error最小的为最佳K值
再选择最佳K=xx,filter.snp.xx.Q结果文件作为画群体结构图的输入源文件
tbl=read.table("filter.snp.3.Q")
barplot(t(as.matrix(tbl)), col=rainbow(3),xlab="Individual #", ylab="Ancestry", border=NA)