By wuzhenzhen, 31 May, 2026

结构分析的基本原理为先预设群体由若干亚群(k=x)构成,通过模拟算法找出在k=x的情况下,最合理的样本分类方法。最后再根据每次模拟的最大似然值,找出最适用这群体的K值。

该方法假设在各个亚群内部个体应该符合哈代-温伯格平衡(哈温平衡的概念),那么这个亚群内的基因频率分布应该可通过哈温平衡检验。 基因型位点不能是连锁的。同一个体基因组上的不同SNP可能来源不同亚群体,这是由于杂交混血过程带来的效应。为了达到哈-温平衡,对不同的位点的分类方法是不同的, 软件是对每个位点单独进行分群的。 

Structure分析,输入的数据就是样本的基因型数据一般来讲是snps,需要注意的是输入的必须是不存在连锁不平衡的独立位点。所以,使用所有的SNP是不对的。如果使用大量存在连锁不平衡的位点,就违背了这个软件最初的假设。需要根据连锁不平衡衰减分析的结果,仅从所有SNP中挑选一部分独立的位点用于structure分析。

数据准备:过滤连锁不平衡的位点后的vcf文件。

1 安装软件

wget https://dalexander.github.io/admixture/binaries/admixture_linux-1.3.0.tar.gz
mkdir admixture_linux-1.3.0
tar -zxvf admixture_linux-1.3.0.tar.gz -C admixture_linux-1.3.0
mv admixture_linux-1.3.0/dist/admixture_linux-1.3.0/* admixture_linux-1.3.0/
rm -r admixture_linux-1.3.0/dist
cd admixture_linux-1.3.0
./admixture
****                   ADMIXTURE Version 1.3.0                  ****
****                    Copyright 2008-2015                     ****

2 vcf格式转bed格式

plink --vcf ../00.filter/all.LDfilter.vcf --make-bed --out all --allow-extra-chr --keep-allele-order --set-missing-var-ids @:#

3 运行admixture

# 生成k=15的脚本
$ seq 1 15 | awk '{print " admixture --cv -j2 all.bed "$1" 1>admix."$1".log 2>&1"}' > admixture.sh
# 运行脚本
sh admixture.sh

# 查看CV error值(找到最小值)
[root@3eb13a5fb4e6 02structure]$grep "CV" ./*.log

4 结果汇总及画图

mkdir result
cp  ./*.Q result/
# 利用R脚本画图
Rscript \
../script/draw_admixture.R \
result \ #输入目录
all.fam \ # plink的fam文件,记录样品顺序
../data/sample.pop.order \ #绘图的样品顺序
structure # 输出图片前缀

5 Admixture报错:Invalid chromosome code! Use integers

# 报错详细信息:
****                   ADMIXTURE Version 1.3.0                  ****
****                    Copyright 2008-2015                     ****
****           David Alexander, Suyash Shringarpure,            ****
****                John  Novembre, Ken Lange                   ****
****                                                            ****
****                 Please cite our paper!                     ****
****   Information at www.genetics.ucla.edu/software/admixture  ****

Cross-validation will be performed.  Folds=5.
Parallel execution requested.  Will use 10 threads.
Random seed: 43
Point estimation method: Block relaxation algorithm
Convergence acceleration algorithm: QuasiNewton, 3 secant conditions
Point estimation will terminate when objective function delta < 0.0001
Estimation of standard errors disabled; will compute point estimates only.
Invalid chromosome code!  Use integers.

解决方式: Invalid chromosome code! Use integers.这里要求染色体名称必须是整数形式。 所以,将.bim文件第一列的内容改成整数。 将第一列内容统一改为1 使用vim编辑器批量替换字符串 `:%s/A/B/g:` 实际操作后,发现第二列内容的前半部分也被替换,但是不影响结果。

# 替换前
CM046388.1      CM046388.1:27594        0       27594   C       T
CM046388.1      CM046388.1:28570        0       28570   G       A
CM046388.1      CM046388.1:28857        0       28857   A       T
# 替换后
1       1:27594 0       27594   C       T
1       1:28570 0       28570   G       A
1       1:28857 0       28857   A       T