跳转至

FaST-LMM

FaST-LMM(Factored Spectrally Transformed Linear Mixed Models)是一款用于全基因组关联分析(GWAS)的工具,支持线性混合模型(LMM)检验,可高效处理大规模 SNP 数据。

原版 FaST-LMM 使用了 intel MKL 数学库,仅能在 x86 CPU上编译运行,这里使用了 openblas 替代 intel MKL 将其迁移到了 ARM 上。迁移后经测试,性能有较大幅度提升,结果保持不变。

项目地址:https://fastlmm.github.io/

使用说明

基本用法

$ module load arm/fastlmm/2.07
$ fastlmmc [选项]

常用选项

选项说明示例
-bfile <前缀>PLINK 二进制基因型文件(.bed/.bim/.fam)-bfile data/mydata
-bfilesim <前缀>用于计算亲缘关系矩阵的基因型文件-bfilesim data/mydata
-sim <文件>预计算的亲缘关系矩阵(.txt 格式)-sim data/kinship.txt
-pheno <文件>表型数据文件-pheno data/phenotype.txt
-covar <文件>协变量文件(如 PCA 特征向量)-covar data/eigenvec
-out <文件>输出文件路径-out results.txt
-pValuePrintThreshold <值>输出 P 值小于此阈值的 SNP-pValuePrintThreshold 0.01
-maxThreads <N>最大线程数-maxThreads 1
-vo详细输出(显示运行信息)-vo
-sort-关闭输出排序-sort-
-mpheno <N>选择第 N 列表型-mpheno 1

使用示例

示例 1:使用 -bfilesim(从基因型自动计算亲缘矩阵)

fastlmmc -vo -sort- \
    -bfile data/1x6x_17 \
    -bfilesim data/1x6x_17 \
    -pheno data/TraesCS7D01G342000.txt \
    -covar data/1x6x.eigenvec \
    -maxThreads 1 \
    -out results.txt \
    -pValuePrintThreshold 0.01

示例 2:使用 -sim(使用预计算亲缘矩阵)

fastlmmc -vo -sort- \
    -bfile data/1x6x_17 \
    -pheno data/TraesCS7D01G342000.txt \
    -sim data/1x6xking.txt \
    -covar data/1x6x.eigenvec \
    -maxThreads 1 \
    -out results.txt \
    -pValuePrintThreshold 0.01

示例 3:线性回归(不使用 LMM)

fastlmmc -vo -sort- \
    -bfile data/1x6x_17 \
    -linreg \
    -pheno data/phenotype.txt \
    -mpheno 1 \
    -out linreg_results.txt

示例 4:Leave-One-Chromosome-Out(LOCO)

fastlmmc -vo -sort- \
    -bfile data/1x6x_17 \
    -loco \
    -pheno data/phenotype.txt \
    -covar data/1x6x.eigenvec \
    -out loco_results.txt

输入文件格式

需要三个文件:<prefix>.bed<prefix>.bim<prefix>.fam

# .fam 文件格式(每行一个个体)
FID IID PID MID Sex Phenotype
Ind001 Ind001 0 0 0 1.234
Ind002 Ind002 0 0 0 2.345

表型文件(-pheno)

制表符分隔的文本文件:

FID IID Phenotype_001
Ind001 Ind001 1.234
Ind002 Ind002 2.345

协变量文件(-covar)

制表符分隔,第一列为个体 ID,后续列为协变量值:

FID IID PC1 PC2 PC3
Ind001 Ind001 -0.0106 -0.0672 0.0386
Ind002 Ind002 0.0234 0.0456 -0.0123

亲缘关系矩阵(-sim)

制表符分隔的对称矩阵,行列标签为个体 ID:

FID IID Ind001 Ind002 Ind003
Ind001 Ind001 0.5000 0.0234 0.0012
Ind002 Ind002 0.0234 0.5000 0.0123
Ind003 Ind003 0.0012 0.0123 0.5000

输出文件说明

输出为制表符分隔的文本文件,每行对应一个 SNP:

列名说明
SNPSNP 名称
Chromosome染色体编号
Position物理位置
PvalueP 值(LMM 检验结果)
QvalueFDR 校正后的 Q 值
N个体数
NullLogLike零模型对数似然值
AltLogLike备择模型对数似然值
SNPWeightSNP 效应值
SNPWeightSE效应值标准误
WaldStatWald 统计量
NullGeneticVar零模型遗传方差
NullResidualVar零模型残差方差
...其他协变量相关列

筛选显著 SNP

# 提取 P < 5e-08(全基因组显著性阈值)的 SNP
awk -F'\t' 'NR==1 || $6 < 5e-8' results.txt

# 提取 Top 10 最显著的 SNP
awk -F'\t' 'NR>1' results.txt | sort -k6,6g | head -10

ARM 版与 x86 版对比

运行时间对比(ARM vs x86)

测试命令

-bfile 1x6x_17 -bfilesim 1x6x_17 -pheno TraesCS7D01G342000.txt -covar 1x6x.eigenvec -maxThreads 1 -out arm_TraesCS7D01G342000.17.out.txt -pValuePrintThreshold 0.01

数据规模x86 MKLARM OpenBLAS
268 个体 × 863,599 SNP~338 秒~697 秒

注意: - 所有测试均使用 -maxThreads 1

数值差异概览

ARM OpenBLAS 版与 x86 Intel MKL 版的结果 高度一致,数值差异极小:

指标863K SNP
行数一致 (9074)
SNP 集合一致 (9072)
行顺序0-1 处相邻互换

数值差异(vs x86)

列名最大相对差异
Pvalue2.61e-06
Qvalue2.42e-06
SNPWeight3.99e-07
NullGeneticVar4.70e-15(静态版)

Top 显著 SNP 排名完全一致

RankSNPx86 P-valueARM P-value差异
1SNP-2063683084.54e-084.54e-08一致
2SNP-2063825346.36e-086.36e-08一致
3IND-0197590949.32e-079.32e-07一致
4SNP-2206281589.37e-079.37e-07一致
5SNP-2173181671.08e-061.08e-06一致

Top 15 显著 SNP 排名完全一致,无任何排序变化。

结果差异说明

不影响 GWAS 结论

  1. 量级极小:在 GWAS 显著性阈值 5e-08 附近,绝对差异约 1e-13,距离跨越阈值差 5 个数量级
  2. Top SNP 不变:最显著 SNP 排名完全一致
  3. 无结论翻转:9072 个 SNP 中不存在"显著 ↔ 不显著"的判定变化

差异来源:ARM NEON 128-bit(2 个 double 并行)与 x86 AVX2 256-bit(4 个 double 并行)的浮点累加顺序不同,经过数千次矩阵运算后产生约 1e-14 的舍入差异,再经 Fisher F-test 非线性函数放大到约 1e-06。这是跨平台 BLAS 库比较的正常水平。

版本间一致性

ARM OpenBLAS 版在相同参数下多次运行,输出 逐字节一致,数值计算稳定可复现。

提示:如需完整数值对比数据,详见 TEST_REPORT.md

常见问题

Q1:输出中的 "Warning: SNP has no variation" 是什么?

表示该 SNP 在所有个体中的基因型完全相同,无法提供信息量,被自动过滤。这是正常现象。

Q2:如何选择 -pValuePrintThreshold 的值?

  • 全基因组显著性分析:0.010.05
  • 仅关注极显著位点:1e-055e-08
  • 值越小,输出文件越小,运行时间略有缩短
本文阅读量  次
本站总访问量  次