基本概念
QQ图(Quantile-Quantile Plot)是评估观察数据与理论分布差异的可视化工具。在GWAS分析中,QQ图用于:
-
1. 比较观察的P值分布与理论期望:横轴表示期望的-log₁₀(P值),纵轴表示观察到的-log₁₀(P值)
-
2. 评估富集程度:图线偏离对角线越明显,表示富集越强
-
3. 检测基因组通胀:整体曲线系统性偏离可能表示存在人口分层等问题
解读
该图比较了SCZ(精神分裂症)GWAS中不同功能性变异的P值分布:
- 灰色线:全部GWAS SNPs
- 彩色点:脑发育相关的功能性变异
- 蓝色:cis-eQTLs (调控基因表达的变异)
- 红色:cis-isoQTLs (调控转录本异构体的变异)
- 黄色:cis-sQTLs (调控RNA剪接的变异)
关键观察:彩色点(功能性变异)的线比灰色线(背景变异)陡峭得多,表明这些功能性变异在精神分裂症相关遗传风险中明显富集。
QQ-plot详解
P值分位数计算
-
1. 观察到的P值分位数:
对P值进行排序(从小到大)
对排序后的P值取-log10(P)
-
2. 理论期望P值分位数:
在零假设下,P值应服从均匀分布U(0,1)
第i个排序P值的期望值为 i/(n+1),其中n是总SNP数
对这些期望值取-log10(P)
解读QQ-plot
对角线:表示观察P值完全符合零假设期望的情况
整体偏离对角线上方:通货膨胀,可能由人口分层或批次效应引起
仅在尾部偏离:真实关联信号
不同颜色线/点的斜率差异:表示不同功能注释SNP子集的富集程度差异
偏离模式:
整体偏离对角线上方:通货膨胀,可能由人口分层或批次效应引起
仅在尾部偏离:真实关联信号
不同颜色线/点的斜率差异:表示不同功能注释SNP子集的富集程度差异
样图绘制
# 模拟数据
set.seed(42)# 总体GWAS数据(100,000个SNP)
n_gwas <- 100000
gwas_pvals <- runif(n_gwas)^1.2# 稍微富集一些# 功能性变异
n_qtl <- 1000
eqtl_index <- sample(1:n_gwas,5000)
isoqtl_index <- sample(1:n_gwas,2000)
sqtl_index <- sample(1:n_gwas,3000)# 为功能变异设置更显著的P值
gwas_pvals[eqtl_index]<- gwas_pvals[eqtl_index]^1.8
gwas_pvals[isoqtl_index]<- gwas_pvals[isoqtl_index]^1.9
gwas_pvals[sqtl_index]<- gwas_pvals[sqtl_index]^1.7# 创建数据框
gwas_data <- data.frame(SNP = paste0("rs",1:n_gwas),P = gwas_pvals,is_eqtl =rep(FALSE, n_gwas),is_isoqtl =rep(FALSE, n_gwas),is_sqtl =rep(FALSE, n_gwas)
)# 标记QTL
gwas_data$is_eqtl[eqtl_index]<-TRUE
gwas_data$is_isoqtl[isoqtl_index]<-TRUE
gwas_data$is_sqtl[sqtl_index]<-TRUElibrary(ggplot2)create_qq_data <-function(pvals){
# 排序P值sorted_pvals <- sort(pvals)
# 计算观察到的-log10(P)observed <--log10(sorted_pvals)
# 计算期望的-log10(P)n <-length(sorted_pvals)expected <--log10(seq(1, n)/(n +1))return(data.frame(expected = expected, observed = observed))
}# 提取各组P值
all_qq <- create_qq_data(gwas_data$P)
all_qq$group <-"SCZ GWAS"eqtl_qq <- create_qq_data(gwas_data$P[gwas_data$is_eqtl])
eqtl_qq$group <-"cis-eQTL"isoqtl_qq <- create_qq_data(gwas_data$P[gwas_data$is_isoqtl])
isoqtl_qq$group <-"cis-isoQTL"sqtl_qq <- create_qq_data(gwas_data$P[gwas_data$is_sqtl])
sqtl_qq$group <-"cis-sQTL"# 合并数据
all_data <- rbind(all_qq, eqtl_qq, isoqtl_qq, sqtl_qq)# 设置颜色
colors <-c("SCZ GWAS"="grey50","cis-eQTL"="blue","cis-isoQTL"="red","cis-sQTL"="orange")# 绘图
qqplot <- ggplot(all_data, aes(x = expected, y = observed, color = group))+
# 绘制数据点geom_point(size =0.8, alpha =0.7)+
# 添加期望线geom_abline(intercept =0, slope =1, linetype ="dashed", color ="grey")+
# 设置颜色scale_color_manual(values = colors)+
# 设置轴标签labs(x =expression(-log[10](expected~P-value)),y =expression(-log[10](observed~P-value)),title ="QQ-plot of SCZ GWAS P-values by functional annotation")+
# 美化主题theme_bw()+theme(legend.title = element_blank())print(qqplot)
参考文献
- Cross-ancestry atlas of gene, isoform, and splicing regulation in the developing human brain