By Liu Qirui, 20 March, 2026
Forums

前言

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),然后选择要切换的类型。