前言
QQ 图是评估 GWAS 模型性能的核心诊断工具之一,主要用于判断模型对群体结构(Population Structure)和亲缘关系(Kinship)的控制效果。
QQ 图作为模型选择依据的原理
QQ 图用于比较观测到的 P 值分布与理论上预期的零假设下的均匀分布。理想情况下,如果群体中没有真实关联(或模型完美控制了混杂因素):
- 图中大部分点(低关联度的 P 值)应紧密落在对角线 y=x 上。
- 图中尾部的点(低 P 值,高关联度)应偏离对角线向上,代表真实的遗传信号。
关键指标:基因组膨胀因子 (λGC)
QQ 图质量的定量衡量指标是基因组膨胀因子 λ (Genomic Inflation Factor)。
对于自由度为 1 的卡方分布约为0.455,常用简化计算式为:
从 P 值计算 χ²
如果只有 GWAS 的 P 值,可以先转换为 χ² 统计量:
λGC 的解释(经验范围)
无明显膨胀 (λ ≈ 1.0)
- QQ 图的点在主体部分紧密贴合对角线,尾部快速上扬。
- 这表明模型有效地控制了群体混杂因素。
- 模型选择理由: 应该优先选择 λ 值最接近 1.0 的模型。
- 轻度膨胀 (1.10 > λ >1.05)
基因组膨胀 (λ > 1.0)
- QQ 图上的点整体位于对角线上方。
- 这表明模型未能充分控制群体结构或亲缘关系,可能存在群体结构或系统偏倚,导致 P 值普遍被低估,产生了大量假阳性(Type I Error)。
- 模型选择理由: 放弃这个模型,因为它给出的 P 值不可信。
基因组紧缩 (λ < 1.0)
- QQ 图上的点整体位于对角线下方。
- 这表明模型矫正过度/模型过拟合(Over-correction),导致真实的 P 值被高估(即真实的关联信号被错误地抑制了)。
- 模型选择理由: 放弃这个模型,因为它可能抑制真实的遗传信号,导致假阴性(Type II Error)。
⚠️ 对于大样本、高多基因性状,λGC > 1 不一定是坏事。
QQ 图不能作为唯一理由
尽管 λ 值接近 1.0 是选择模型的有力证据,但它并不能说明模型的全部性能。
- 忽略功效(Power): λ 值并不能显示模型检测真实信号的能力(Power/功效)。某些模型(如 FarmCPU 或 BLINK)通过迭代或多位点控制,可能具有相似的 λ,但在尾部能检测到更强的信号(即 P 值更低,Manhattan 图峰更高)。
- 计算效率: 在 GWAS + GS 混合主题中,模型的计算效率(如 FarmCPU 或 BLINK 通常比标准 MLM 更快)是一个重要的实际考量。
- 性状特异性: 最佳模型往往因性状的遗传结构(稀疏性或多基因性)而异,不同性状的最佳模型不同。
λ-GC计算示例(R语言)
需要首先读取一个GWAS结果的P值汇总,本示例中默认使用了基于emmax的一个GWAS结果数据框 emmax_filtered
#Lambda-GC
p_values <- na.omit(emmax_filtered$P)
chisq <- qchisq(1 - p_values, 1)
lambda_gc <- median(chisq) / qchisq(0.5, 1)
print(paste("Lambda-GC:", round(lambda_gc, 4)))
如果需要将这个值直接显示在QQplot中,使用ggplot()进行绘制时只需在annotate()中加入如下参数:
annotate(label = paste0("lambda == ", round(lambda, 3)),
parse = TRUE, size = 6, hjust = 0)
λ-GC计算示例(Shell脚本)
#!/usr/bin/env bash
set -euo pipefail
TAR_FILE="gapit_Rh_results_pvalue.tar.gz"
OUT_FILE="lambda_gc_results_rhdgwas.tsv"
echo -e "File\tLambda_GC\tN_SNP" > "$OUT_FILE"
tar -tzf "$TAR_FILE" \
| grep 'GWAS_Results.*\.csv$' \
| while IFS= read -r FILE; do
echo "Processing: $FILE" >&2
RESULT=$(
tar -xOzf "$TAR_FILE" "$FILE" \
| awk -F',' 'NR>1 && $4!="NA" && $4!="" && $4>0 && $4<=1 {print $4}' \
| python -c '
import sys
import numpy as np
from scipy.stats import chi2
p = np.fromiter((float(x) for x in sys.stdin), dtype=float)
if p.size == 0:
print("NA\t0")
else:
lambda_gc = np.median(chi2.ppf(1 - p, 1)) / 0.455
print(f"{lambda_gc:.6f}\t{p.size}")
'
)
echo -e "$(basename "$FILE")\t$RESULT" >> "$OUT_FILE"
done
该脚本需要将全部结果满足名称格式为 GWAS_Results.[anythings].csv 并全部打包于 TAR_FILE 的文件名中
可根据需要修改这两部分的正则表达式以满足自己的需求,修改完成后。
只需使用如下指令
chmod +x Lambda_GC.sh
./Lambda_GC.sh
如果WIN系统下修改并在Linux上运行出现问题可以使用如下解决方法:
VS code:切换当前文件的换行符 你可以在底部状态栏直接点击当前显示的换行符(如 CRLF 或 LF),然后选择要切换的类型。