笔记 GWAS 操作流程5-2:驾驭GEMMA混合模型:从G矩阵构建到群体结构校正
1. GEMMA混合模型实战从G矩阵到群体结构校正如果你已经用GEMMA跑过基础线性模型LM现在遇到更复杂的亲缘关系或群体结构数据混合线性模型LMM就是你的下一站。我刚开始用LMM时最大的困惑就是G矩阵怎么构建、PCA结果怎么塞进模型。今天咱们就手把手走通这个流程顺便聊聊怎么避免群体结构带来的假阳性结果。先说说为什么需要LMM。当样本间存在亲缘关系比如家系数据或群体分层比如不同地理来源的群体传统LM会把遗传背景差异误判为性状关联信号。去年我分析一组水稻数据时LM模型跑出20多个显著位点加入亲缘关系矩阵后只剩3个是真的——这就是为什么说LMM是GWAS的防伪标签。2. 构建G矩阵亲缘关系的量化2.1 标准化方法选择GEMMA提供四种G矩阵计算方法-gk参数实测下来最常用的是下面两种# 方法1中心化矩阵适合近交系 gemma -bfile genotype -gk 1 -o centered_matrix # 方法2标准化矩阵推荐用于异交群体 gemma -bfile genotype -gk 2 -o standardized_matrix我习惯先用方法2因为它的数值范围更稳定。曾经用小鼠数据对比过当群体中存在强近交系时方法1会过度放大某些亲缘关系。生成的G矩阵保存在output/result.sXX.txt是个对称矩阵可以用R可视化library(gplots) g_matrix - as.matrix(read.table(result.sXX.txt)) heatmap.2(g_matrix, tracenone, colbluered(100))2.2 矩阵质量检查三个必看指标对角线值正常范围在0.8-1.2之间如果出现2的值可能是样本污染非对角线分布健康数据应该呈现右偏分布我一般用以下代码快速检查hist(g_matrix[upper.tri(g_matrix)], breaks50, mainOff-diagonal Values Distribution)特征值分解用eigen()函数计算特征值第一个特征值占比不应超过30%3. 群体结构校正PCA实战技巧3.1 用plink生成PCA虽然GEMMA可以直接读G矩阵但群体结构校正还需要PCA结果。这里推荐用plink2更高效plink2 --bfile genotype --pca 20 var-wts --out pca_result关键参数--pca 20保留前20个主成分通常10-20足够var-wts输出载荷矩阵方便后续解释3.2 协变量文件制作把PCA结果转为GEMMA能读的协变量格式注意要包含截距项第一列全1# 添加截距列并保留前5个PC awk BEGIN{OFS\t;print ID,PC1,PC2,PC3,PC4,PC5}{print $1,$2,$3,$4,$5,$6} pca_result.eigenvec cov.txt # 用R添加截距列更稳妥 pcs - read.table(pca_result.eigenvec) cov_file - cbind(rep(1,nrow(pcs)), pcs[,1:5]) write.table(cov_file, cov.txt, col.namesF, row.namesF)4. 运行LMM模型参数详解4.1 完整命令示例gemma -bfile genotype \ -k output/result.sXX.txt \ -c cov.txt \ -lmm 4 \ -o lmm_results参数解析-lmm 4使用似然比检验LRT比默认的Wald检验更稳定-miss 0.1可选项允许10%的缺失率默认是5%4.2 结果文件解读主要看output/lmm_results.assoc.txt里的几列beta效应值大小se标准误p_lrtLRT检验的p值如果用-lmm 1就是p_waldp_waldWald检验的p值建议用QQ图验证模型校准情况res - read.table(lmm_results.assoc.txt, headerT) lambda - median(qchisq(1-res$p_lrt,1))/0.454 qqplot(res$p_lrt, mainpaste(Lambda,round(lambda,3)))5. 校正效果验证LM vs LMM对比5.1 假阳性控制拿我之前的大豆数据为例LM模型λGC1.82严重膨胀LMM模型λGC1.02理想范围可以用下面代码快速计算膨胀因子calc_lambda - function(pvals) { chisq - qchisq(1-pvals,1) median(chisq)/qchisq(0.5,1) }5.2 信号一致性检查健康数据中LM和LMM的top信号应该有一定重叠lm_res - read.table(lm.assoc.txt, headerT) lmm_res - read.table(lmm.assoc.txt, headerT) merge_res - merge(lm_res, lmm_res, byrs) plot(-log10(merge_res$p_wald.x), -log10(merge_res$p_lrt.y), xlab-log10(LM p), ylab-log10(LMM p)) abline(0,1,colred)如果发现大量LM显著但LMM不显著的位点可能需要检查群体结构是否校正充分增加PCA数量G矩阵计算是否合适尝试-gk 1或2是否存在异常样本检查G矩阵对角线6. 进阶技巧当标准流程失效时6.1 稀疏矩阵优化遇到超大样本10万时可以启用稀疏矩阵计算gemma -bfile bigdata -gk 2 -snp -miss 0.05 -o sparse_matrix6.2 多性状联合分析GEMMA支持多性状LMM只需准备多列表型文件gemma -bfile genotype -k matrix -lmm 1 \ -p multi_pheno.txt -n 1 2 3 \ -o multi_trait其中-n 1 2 3指定使用第1、2、3列表型6.3 内存控制技巧对于大型分析可以通过这些参数避免爆内存-maf 0.01过滤低频SNP-r2 0.1LD剪枝-bsize 1000分块处理大小7. 常见报错解决方案Error: eigen decomposition failed检查G矩阵是否包含NA/Inf尝试-gk 1或-gk 2重新生成矩阵WARNING: Using only 1 thread编译时加上-fopenmp选项设置环境变量export OMP_NUM_THREADS8P值全部为NA检查表型数据是否有缺失确认协变量文件与表型样本顺序一致最后提醒一个小坑GEMMA默认会过滤掉MAF0.01的位点如果需要保留务必加上-maf 0参数。我在分析稀有变异时就栽过这个跟头花了三天才发现是默认过滤导致的信号丢失。