615_全基因组关联分析GWAS¶
一句话概述: GWAS通过扫描全基因组上百万个SNP与表型(疾病/性状)的关联,找到影响疾病风险的基因位点,是从"基因型"到"表型"的桥梁,PLINK和GCTA是最常用的分析工具。
核心知识点速查表¶
| 概念 | 白话解释 |
|---|---|
| GWAS | 全基因组关联分析——检测每个SNP与表型是否相关 |
| Manhattan plot | 曼哈顿图——GWAS标志性图,显示全基因组各位点的p值 |
| QQ plot | 分位图——检查结果是否有系统偏差(膨胀) |
| Genome-wide significance | 全基因组显著性水平,p < 5e-8 |
| Suggestive significance | 暗示性显著水平,p < 1e-5 |
| Lambda (λ) | 基因组膨胀因子,衡量群体分层影响,应接近1.0 |
| GRM | 遗传关系矩阵,校正个体间亲缘关系 |
| PRS | 多基因风险评分,汇总多个SNP的风险 |
| LD score regression | LD分数回归,区分真信号和膨胀 |
一、安装工具¶
# PLINK 1.9(经典GWAS工具)
conda install -c bioconda plink
# PLINK 2.0(更快,推荐新项目用)
conda install -c bioconda plink2
# GCTA(遗传力估计+GWAS)
conda install -c bioconda gcta
# 验证安装
plink --version
plink2 --version
gcta --version
二、数据质控(QC)——GWAS的生命线¶
#!/bin/bash
# GWAS质控流程——每步都不能跳!
INPUT="raw_gwas" # 原始PLINK文件前缀
QC="gwas_qc" # QC输出目录
mkdir -p ${QC}
# === 第1步:个体级QC ===
# 去除缺失率高的个体
plink --bfile ${INPUT} \
--mind 0.02 \ # 个体缺失率>2%的移除
--make-bed \
--out ${QC}/step1
# === 第2步:SNP级QC ===
plink --bfile ${QC}/step1 \
--geno 0.02 \ # SNP缺失率>2%的移除
--maf 0.01 \ # MAF<1%的移除
--hwe 1e-6 \ # 偏离HWE的移除(用对照组检验)
--make-bed \
--out ${QC}/step2
# === 第3步:检查性别 ===
plink --bfile ${QC}/step2 \
--check-sex \ # 检查遗传性别与记录是否一致
--out ${QC}/sex_check
# 查看不一致的个体
awk '$3 != $4 && $4 != 0' ${QC}/sex_check.sexcheck
# === 第4步:去除亲缘关系个体 ===
plink --bfile ${QC}/step2 \
--genome \ # 计算IBD
--min 0.2 \ # 只输出PI_HAT>0.2的对
--out ${QC}/ibd
# 去除一对中缺失率高的那个
awk '$10 > 0.2 {print $3, $4}' ${QC}/ibd.genome > ${QC}/remove_related.txt
plink --bfile ${QC}/step2 \
--remove ${QC}/remove_related.txt \
--make-bed \
--out ${QC}/step3
# === 第5步:群体分层校正(PCA)===
# 先LD pruning
plink --bfile ${QC}/step3 \
--indep-pairwise 50 5 0.2 \
--out ${QC}/ld
plink --bfile ${QC}/step3 \
--extract ${QC}/ld.prune.in \
--pca 10 \ # 计算前10个PC
--out ${QC}/pca
# 最终QC完成的数据
cp ${QC}/step3.* ${QC}/gwas_ready.*
echo "QC完成!最终样本数: $(wc -l < ${QC}/gwas_ready.fam)"
echo "最终SNP数: $(wc -l < ${QC}/gwas_ready.bim)"
三、运行GWAS¶
3.1 PLINK关联分析¶
# === 病例-对照研究(二元表型)===
plink --bfile ${QC}/gwas_ready \
--logistic \ # logistic回归(二元表型用)
--covar ${QC}/pca.eigenvec \ # 前10个PC作为协变量
--covar-number 3-12 \ # 使用第3-12列(PC1-PC10)
--adjust \ # 多重检验校正
--ci 0.95 \ # 95%置信区间
--out gwas_result # 输出前缀
# === 数量性状(连续表型)===
plink --bfile ${QC}/gwas_ready \
--linear \ # 线性回归(连续表型用)
--pheno phenotype.txt \ # 外部表型文件
--covar ${QC}/pca.eigenvec \
--covar-number 3-12 \
--out gwas_quantitative
# === PLINK2更快的方式 ===
plink2 --bfile ${QC}/gwas_ready \
--glm \ # 广义线性模型
--covar ${QC}/pca.eigenvec \
--covar-col-nums 3-12 \
--out gwas_plink2
3.2 GCTA fastGWA(更快,推荐大样本)¶
# === 第1步:构建GRM(遗传关系矩阵)===
gcta --bfile ${QC}/gwas_ready \
--make-grm \ # 构建GRM
--thread-num 16 \ # 线程数
--out grm # 输出前缀
# === 第2步:稀疏GRM(大样本更快)===
gcta --grm grm \
--make-bK-sparse 0.05 \ # 稀疏化
--out sparse_grm
# === 第3步:运行fastGWA ===
gcta --bfile ${QC}/gwas_ready \
--grm-sparse sparse_grm \ # 使用稀疏GRM
--fastGWA-mlm \ # 混合线性模型
--pheno phenotype.txt \ # 表型文件
--qcovar ${QC}/pca.eigenvec \ # 数量协变量
--thread-num 16 \
--out gwas_gcta
四、结果可视化¶
4.1 Manhattan Plot和QQ Plot¶
# === 安装和加载包 ===
# install.packages("qqman")
library(qqman) # GWAS可视化专用包
# === 读取GWAS结果 ===
gwas <- read.table("gwas_result.assoc.logistic", header = TRUE)
# 只保留ADD(加性模型)的结果
gwas <- gwas[gwas$TEST == "ADD", ]
# === Manhattan Plot ===
pdf("manhattan_plot.pdf", width = 14, height = 6)
manhattan(
gwas,
chr = "CHR", # 染色体列
bp = "BP", # 位置列
p = "P", # p值列
snp = "SNP", # SNP名列
col = c("steelblue", "orange"), # 交替颜色
suggestiveline = -log10(1e-5), # 暗示性阈值
genomewideline = -log10(5e-8), # 全基因组显著阈值
main = "GWAS Manhattan Plot" # 标题
)
dev.off()
# === QQ Plot ===
pdf("qq_plot.pdf", width = 7, height = 7)
qq(gwas$P, main = "GWAS QQ Plot") # QQ图
dev.off()
# === 计算lambda值(基因组膨胀因子)===
chisq <- qchisq(1 - gwas$P, 1) # 转为卡方统计量
lambda <- median(chisq) / qchisq(0.5, 1) # lambda值
cat("Genomic inflation factor (lambda):", lambda, "\n")
# lambda应接近1.0,>1.1说明有群体分层问题
4.2 用gwaslab画图(Python,更现代)¶
import gwaslab as gl # 导入gwaslab
import pandas as pd # 导入pandas
# 读取GWAS结果
df = pd.read_csv("gwas_result.assoc.logistic", sep="\s+") # 读取
df = df[df["TEST"] == "ADD"] # 只保留加性模型
# 创建gwaslab对象
mysumstats = gl.Sumstats(
df,
snpid="SNP", # SNP ID列
chrom="CHR", # 染色体列
pos="BP", # 位置列
p="P", # p值列
beta="BETA", # 效应值列
verbose=False
)
# Manhattan plot + QQ plot
mysumstats.plot_mqq() # 一键画曼哈顿图+QQ图
五、GWAS后续分析¶
5.1 遗传力估计¶
# 用GCTA估计SNP遗传力
gcta --grm grm \
--reml \ # REML方法
--pheno phenotype.txt \ # 表型文件
--qcovar ${QC}/pca.eigenvec \
--thread-num 16 \
--out heritability
# 查看结果
cat heritability.hsq
# V(G)/Vp 就是SNP遗传力(h²_SNP)
5.2 LD score regression¶
# 安装ldsc
pip install ldsc
# 准备summary statistics
# 用ldsc格式化GWAS结果
python munge_sumstats.py \
--sumstats gwas_result.assoc.logistic \
--out gwas_formatted \
--merge-alleles w_hm3.snplist # HapMap3 SNP列表
# 运行LD score regression
python ldsc.py \
--h2 gwas_formatted.sumstats.gz \ # GWAS结果
--ref-ld-chr eur_w_ld_chr/ \ # LD分数参考
--w-ld-chr eur_w_ld_chr/ \
--out ldsc_result
# intercept接近1.0说明没有膨胀
# h2就是遗传力估计
六、关键参数速查表¶
| 参数 | PLINK命令 | 说明 |
|---|---|---|
| 二元表型 | --logistic | 病例-对照 |
| 连续表型 | --linear | 数量性状 |
| 协变量 | --covar file --covar-number 3-12 | PC校正 |
| 全基因组阈值 | p < 5×10⁻⁸ | 标准阈值 |
| 暗示性阈值 | p < 1×10⁻⁵ | 报告但需验证 |
| Lambda理想值 | ~1.0 | >1.1需检查 |
| QC-缺失率 | --geno 0.02 | SNP级 |
| QC-MAF | --maf 0.01 | 常见变异 |
| QC-HWE | --hwe 1e-6 | 对照组检验 |
七、常见报错与解决¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
Lambda > 1.1 | 群体分层未充分校正 | 增加PCA PC数或用混合模型 |
No significant hits | 样本量不够或效应太小 | 增加样本量或做Meta-analysis |
Inflated QQ plot | 系统偏差 | 检查QC流程,使用GCTA-MLMA |
Allele mismatch | SNP链方向不一致 | 用--flip翻转链 |
Memory error | 数据量太大 | 用--memory限制或用PLINK2 |
八、面试高频题¶
Q1:GWAS的基本原理是什么?¶
答: GWAS基于连锁不平衡原理:致病突变与其附近的SNP标记存在LD(连锁不平衡),通过检测每个SNP与表型的统计关联,就能间接定位致病区域。统计上就是对每个SNP做回归分析:二元表型用logistic回归,连续表型用线性回归。全基因组显著性阈值是p < 5×10⁻⁸(相当于对100万个独立检验做Bonferroni校正)。
Q2:GWAS为什么要做质控?最重要的QC步骤是什么?¶
答: QC避免技术偏差产生假阳性。最重要的步骤:(1) 个体和SNP缺失率过滤——高缺失可能是DNA质量问题;(2) HWE检验——偏离HWE可能是基因分型错误;(3) 群体分层校正(PCA)——不同祖先背景的人混在一起会产生假阳性;(4) 亲缘关系过滤——近亲会违反独立性假设。QC是GWAS的生命线,做不好结果全废。
Q3:如何判断GWAS结果是否可靠?¶
答: 看三个指标:(1) QQ图——p值在低显著性区域应该贴近对角线,只在尾端偏离(真信号),如果全程偏离说明有膨胀;(2) Lambda值——应接近1.0,>1.1说明有群体分层问题;(3) Manhattan图——真实信号应该是一个区域多个SNP一起显著(LD产生的"峰"),而不是孤立的SNP。
Q4:PLINK和GCTA在GWAS中各自的优势?¶
答: PLINK是经典的GWAS工具,简单直观,做logistic/linear回归。GCTA的优势在于混合线性模型(fastGWA-MLM),用遗传关系矩阵(GRM)校正群体分层和隐性亲缘关系,比PCA校正更彻底。大样本(>10万)时GCTA的fastGWA比PLINK快很多。另外GCTA还能做遗传力估计,是GWAS后续分析的必备工具。
参考资料:Marees et al., IJE 2018(GWAS教程)| GWASTutorial: cloufield.github.io | PLINK: Purcell et al., AJHG 2007 | GCTA: Yang et al., AJHG 2011