BioF3 组学数据分析
06 群体遗传:PCA / 祖源 / LD
06 群体遗传:PCA / 祖源 / LD
群体遗传分析用大量个体的基因型数据回答"这些人从哪来、彼此什么关系、哪些位点受到选择"。
常用工具
| 工具 | 用途 |
|---|---|
| PLINK 2 | 数据管理、QC、PCA、关联分析 |
| ADMIXTURE | 祖源成分估计(K 群体) |
| vcftools | VCF 统计(Fst、pi、Tajima's D) |
| EIGENSOFT | PCA + 群体结构 |
PCA 分析
# VCF -> PLINK 格式
plink2 --vcf cohort.vcf.gz --make-bed --out cohort
# LD pruning(去掉高 LD 的 SNP,避免 PCA 被局部 LD 主导)
plink2 --bfile cohort --indep-pairwise 50 5 0.2 --out pruned
plink2 --bfile cohort --extract pruned.prune.in --make-bed --out cohort_pruned
# PCA
plink2 --bfile cohort_pruned --pca 10 --out cohort_pca
输出 cohort_pca.eigenvec 就是每个样本的 PC1~PC10 坐标,用 R 画散点图。
ADMIXTURE 祖源分析
# 跑 K=2 到 K=6
for K in 2 3 4 5 6; do
admixture --cv cohort_pruned.bed $K | tee log_K${K}.out
done
# 选最优 K:看 CV error 最低的那个
grep "CV error" log_K*.out
LD 衰减
# 计算 LD(r²)随距离的衰减
plink2 --bfile cohort --ld-window-r2 0 --ld-window 1000 --ld-window-kb 500 \
--out ld_decay
LD 衰减速度反映群体的有效群体大小和重组率。
群体遗传分析的核心问题
在跑工具之前先想清楚要回答什么。这类项目大致是三类问题:
| 问题 | 关键分析 | 解读重点 |
|---|---|---|
| 这个群体有几个亚群? | PCA + ADMIXTURE | PC1/PC2 分布 + K 选择 |
| 我的样本祖源混杂吗? | ADMIXTURE | 每个个体的成分比例 |
| 哪些区域受到自然选择? | Fst / iHS / nSL | 极端值区域 |
| 群体何时分化? | PSMC / SMC++ | 时间序列推断 |
| 人口规模怎么变化? | PSMC / Stairway Plot | 历史 Ne 曲线 |
新人最常见错误:跑了 PCA 看到分群就完事,没思考"为什么这样分群"。PCA 只给坐标,不给解释。
常见坑
坑 1:PCA 不做 LD pruning
不 prune 时 PCA 会被 HLA、着丝粒等高 LD 区域主导,PC1 变成 "HLA 单体型聚类" 而不是真实群体结构。--indep-pairwise 50 5 0.2 是必须步骤。
坑 2:ADMIXTURE 跑一个 K 就报告
K 选择不是凭感觉。至少跑 K=2 到 K=10,看 CV error 最低的那个。CV error 平的话说明数据本身就没明显结构,硬选 K 没意义。
坑 3:用相关样本做群体遗传
第一代亲属的样本会扭曲所有群体结构估计。先用 PLINK --king-cutoff 0.0884 删掉 2 度以内亲属,再做下游分析。
坑 4:全样本一起 PCA 后才发现混杂
不同祖源的样本应该分别先做 QC,再一起跑分析。混在一起做 QC 时 MAF 阈值会被群体结构干扰。
坑 5:Fst 计算用了 SNV 全集
Fst 应该排除单态位点(MAF = 0)和高缺失率位点。vcftools --maf 0.05 --max-missing 0.95 是标准过滤。不过滤直接算 Fst 噪声很大。
下一步
接着深入:
- 07 GWAS 入门 — 群体结构 PC 是 GWAS 的标准协变量
横向延伸:
- 05 变异过滤与质量评估 — 群体遗传项目对过滤要求更严
- PLINK 2 GWAS 教程 — 群体遗传 + 关联分析的官方文档