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
输入文件格式¶
PLINK 二进制文件(-bfile)¶
需要三个文件:<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:
| 列名 | 说明 |
|---|---|
| SNP | SNP 名称 |
| Chromosome | 染色体编号 |
| Position | 物理位置 |
| Pvalue | P 值(LMM 检验结果) |
| Qvalue | FDR 校正后的 Q 值 |
| N | 个体数 |
| NullLogLike | 零模型对数似然值 |
| AltLogLike | 备择模型对数似然值 |
| SNPWeight | SNP 效应值 |
| SNPWeightSE | 效应值标准误 |
| WaldStat | Wald 统计量 |
| 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 MKL | ARM OpenBLAS |
|---|---|---|
| 268 个体 × 863,599 SNP | ~338 秒 | ~697 秒 |
注意: - 所有测试均使用
-maxThreads 1
数值差异概览¶
ARM OpenBLAS 版与 x86 Intel MKL 版的结果 高度一致,数值差异极小:
| 指标 | 863K SNP |
|---|---|
| 行数 | 一致 (9074) |
| SNP 集合 | 一致 (9072) |
| 行顺序 | 0-1 处相邻互换 |
数值差异(vs x86):
| 列名 | 最大相对差异 |
|---|---|
| Pvalue | 2.61e-06 |
| Qvalue | 2.42e-06 |
| SNPWeight | 3.99e-07 |
| NullGeneticVar | 4.70e-15(静态版) |
Top 显著 SNP 排名完全一致¶
| Rank | SNP | x86 P-value | ARM P-value | 差异 |
|---|---|---|---|---|
| 1 | SNP-206368308 | 4.54e-08 | 4.54e-08 | 一致 |
| 2 | SNP-206382534 | 6.36e-08 | 6.36e-08 | 一致 |
| 3 | IND-019759094 | 9.32e-07 | 9.32e-07 | 一致 |
| 4 | SNP-220628158 | 9.37e-07 | 9.37e-07 | 一致 |
| 5 | SNP-217318167 | 1.08e-06 | 1.08e-06 | 一致 |
Top 15 显著 SNP 排名完全一致,无任何排序变化。
结果差异说明¶
不影响 GWAS 结论:
- 量级极小:在 GWAS 显著性阈值 5e-08 附近,绝对差异约 1e-13,距离跨越阈值差 5 个数量级
- Top SNP 不变:最显著 SNP 排名完全一致
- 无结论翻转: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.01或0.05 - 仅关注极显著位点:
1e-05或5e-08 - 值越小,输出文件越小,运行时间略有缩短
本站总访问量 次