rMVP 速查表 v1.4.6 · GWAS

Memory-efficient · Visualization-enhanced · Parallel-accelerated · GLM / MLM / FarmCPU

00

概览与标准流程

华中农业大学刘小磊团队 · Apache-2.0 · CRAN + GitHub

三步工作流

MVP.Data()格式转换 · 对齐表型 · 算 K / PC
→
MVP()GLM / MLM / FarmCPU 关联分析
→
MVP.Report()曼哈顿 · QQ · 密度 · 环形图

基因型以 bigmemory 文件映射存储,不必整体读入内存;MVP() 运行结束会自动出图。

三种模型 速度 / 假阳性控制

GLM固定效应:PC + 协变量
速度
控假阳性
快速扫描、结构弱的群体
MLMPC 固定 + 亲缘矩阵 K 随机
速度
控假阳性
默认首选,最保守
FarmCPU固定 / 随机模型迭代,伪 QTN 作协变量
速度
控假阳性
检出功效高,复杂性状
01

安装与加载

强烈建议 R 链接 MKL / OpenBLAS 以加速并行

安装

# 稳定版(CRAN)
install.packages("rMVP")

# 开发版(GitHub;国内可用 Gitee 镜像)
devtools::install_github("xiaolei-lab/rMVP")

library(rMVP)
?rMVP           # 全部参数
?MVP.Report     # 绘图参数

其他途径与检查

  • Gitee 镜像:gitee.com/xiaolei-lab/rMVP
  • 仓库根目录带 Dockerfile,可自建容器
  • Bioconda:conda install -c bioconda r-rmvp(以频道版本为准)
  • Windows 环境配置见官方 wiki 中文指南
  • 确认 BLAS:sessionInfo() 查看 BLAS / LAPACK 路径
02

数据准备:MVP.Data()

转换时一并提供表型,rMVP 自动对齐个体顺序

四种基因型格式

格式关键参数完整调用(推荐)仅转基因型 *
PLINK binaryfileBed(前缀,不含后缀)MVP.Data(fileBed="plink", filePhe=NULL, fileKin=FALSE, filePC=FALSE, out="mvp.plink")MVP.Data.Bfile2MVP(bfile="plink", out="mvp", maxLine=1e4)
VCFfileVCFMVP.Data(fileVCF="myVCF.vcf", fileKin=FALSE, filePC=FALSE, out="mvp.vcf")MVP.Data.VCF2MVP("myVCF.vcf", out="mvp")
HapMapfileHMP(可为向量)、sep.hmp、SNP.effect="Add"MVP.Data(fileHMP="hapmap.txt", filePhe="Phenotype.txt", sep.hmp="\t", sep.phe="\t", SNP.effect="Add", out="mvp.hmp")MVP.Data.Hapmap2MVP("hapmap.txt", out="mvp")
Numeric 0/1/2fileNum + fileMap、type.geno、auto_transposeMVP.Data(fileNum="Numeric.txt", filePhe="Phenotype.txt", fileMap="Map.txt", sep.num="\t", sep.map="\t", sep.phe="\t", out="mvp.num")MVP.Data.Numeric2MVP("Numeric.txt", out="mvp", maxLine=1e4, auto_transpose=TRUE)

* 仅转基因型的函数要求基因型已完全填充(无缺失)。HapMap 可按染色体给多个文件:fileHMP=c("chr1.hmp.txt","chr2.hmp.txt")

MVP.Data() 通用参数

参数含义
filePhe / sep.phe表型文件及分隔符
fileKinTRUE 计算亲缘矩阵;或给文件名读入外部 K
filePCTRUE 计算 PCA;或给文件名读入外部 PC
out输出文件前缀
maxLine每次读入内存的标记数,内存紧张时调小
type.genoNumeric:"char" / "integer" / "double"
auto_transposeNumeric 自动转置,保证行 = 标记

输入文件长什么样

# 表型:ID + 每列一个性状,缺失写 NA,带表头
Taxa   trait1  trait2  trait3
33-16  101.5   0.25    0
4722   105.5   NA      0

# Map(Numeric 格式需要):带表头三列
SNP        Chr  Pos
rs3683945  1    3197400

# Numeric:m×n 或 n×m 均可,值为 0/1/2

转换后生成的文件 out="mvp"

文件内容
mvp.geno.desc / .bin基因型 big.matrix
mvp.geno.map标记信息:SNP、CHROM、POS
mvp.geno.ind个体 ID(顺序基准)
mvp.phe已对齐的新表型文件
mvp.kin.desc / .bin亲缘矩阵(fileKin=TRUE)
mvp.pc.desc / .bin主成分(filePC=TRUE)

读入数据

genotype  <- attach.big.matrix("mvp.geno.desc")
phenotype <- read.table("mvp.phe", head=TRUE)
map       <- read.table("mvp.geno.map", head=TRUE)
注意 转换时给了表型,后续一定读新生成的 mvp.phe,不要读原始表型文件。
03

GWAS 主函数:MVP()

phe 只接受两列:ID + 一个性状

完整模板

imMVP <- MVP(
  phe = phenotype,          # 两列,可含 NA
  geno = genotype,
  map = map,
  #K = Kinship,             # 有预算好的 K 才打开
  #CV.GLM = Covariates,     # 有协变量时打开全部 CV.*
  #CV.MLM = Covariates,
  #CV.FarmCPU = Covariates,
  nPC.GLM = 5,              # 不加 PC:注释掉,别写 0
  nPC.MLM = 3,
  nPC.FarmCPU = 3,
  maxLine = 10000,          # 调小可降内存
  #ncpus = 10,              # 默认用全部 CPU
  vc.method = "BRENT",      # 仅 MLM
  method.bin = "static",    # 仅 FarmCPU
  threshold = 0.05,
  method = c("GLM", "MLM", "FarmCPU"),
  file.output = c("pmap", "pmap.signal", "plot", "log")
)

三条易错规则

1 不加 PC 时注释掉 nPC.*,不要写 nPC.* = 0。
2 nPC.* > 0 时,对应 CV.* 中不能再含 PC,否则重复加入。
3 rMVP 不会调整协变量的个体顺序,须与 mvp.geno.ind 一致。

阈值怎么定

  • threshold=0.05:显著线 = 0.05 / 标记数(Bonferroni)
  • permutation.threshold=TRUE + permutation.rep:打乱表型多次,取每次最小 p 值的 95% 分位数作经验阈值

参数速查

参数取值 / 示例说明
phedata.frame(2 列)表型:ID + 一个性状
genobig.matrixattach.big.matrix("mvp.geno.desc")
mapdata.frameSNP、染色体、位置
Kn×n 矩阵亲缘矩阵;不给则自动按 VanRaden 计算
CV.GLM / CV.MLM / CV.FarmCPUn×nCV 矩阵各模型协变量,可含 NA
nPC.GLM / nPC.MLM / nPC.FarmCPU整数,如 5 / 3 / 3作为协变量的前 n 个主成分
method"GLM", "MLM", "FarmCPU"可选一个或多个
vc.method"BRENT", "EMMA", "HE"MLM 方差组分估计方法
method.bin"static", "FaST-LMM"FarmCPU 的 bin 选择方法
maxLoop整数FarmCPU 最大迭代次数
threshold0.05显著线 = threshold / 标记数
permutation.thresholdTRUE / FALSE用置换检验定阈值
permutation.rep整数,如 100置换次数
maxLine10000每批处理标记数,越小越省内存
ncpus整数并行 CPU 数,默认全部
file.outputTRUE / FALSE 或子集"pmap" 全部 SNP · "pmap.signal" 显著 SNP · "plot" 图 · "log" 日志
04

亲缘矩阵、主成分与协变量

外部文件为纯数值:无个体名、无表头,行顺序同基因型

K 与 PC:读入或计算

# 亲缘矩阵(n×n)
MVP.Data.Kin("mvp.kin.txt", out="mvp", maxLine=1e4, sep="\t")  # 读文件
MVP.Data.Kin(TRUE, mvp_prefix="mvp.vcf", out="mvp")              # 计算

# 主成分(n×nPC)
MVP.Data.PC("mvp.pc.txt", out="mvp", sep="\t")                   # 读文件
MVP.Data.PC(TRUE, mvp_prefix="mvp.vcf", pcs.keep=5)             # 计算

# 加载
Kinship       <- attach.big.matrix("mvp.kin.desc")
Covariates_PC <- bigmemory::as.matrix(attach.big.matrix("mvp.pc.desc"))

环境因子 / 协变量

# 品种、性别作因子,体重作数值协变量
Covariates <- model.matrix.lm(
  ~ as.factor(breed) + as.factor(sex) + as.numeric(weight),
  data = yourdata, na.action = "na.pass")   # 允许 NA

# 把 PC 并入协变量(此时 MVP() 中不要设 nPC.*)
Covariates <- cbind(Covariates, Covariates_PC)
注意 yourdata 的行顺序必须与 mvp.geno.ind 一致。
05

可视化:MVP.Report()

约 50 个参数 · 也接受 PLINK / GEMMA / GAPIT / TASSEL 结果

plot.type

值图形输入
"d"SNP 密度图前 3 列即可
"c"环形曼哈顿图p 值或效应列
"m"矩形曼哈顿图p 值或效应列
"q"QQ 图p 值列

输入至少 4 列:SNP、染色体、位置、p 值;多性状继续按列追加。示例数据 data(pig60K)(MLM p 值)、data(cattle50K)(rrBLUP 效应)。

常用参数

参数作用
col向量按染色体交替;矩阵则每性状一行
LOG10TRUE 画 −log10(p);画效应时 FALSE
ylim / ylab纵轴范围与标签
threshold可多条 c(1e-6,1e-4);NULL 不画
threshold.col / .lty / .lwd阈值线颜色、线型、线宽
amplifyTRUE 放大显著点
signal.col / .cex / .pch显著点样式;col=NULL 保持原色
signal.line环形图穿圈标示线;NULL 不画
chr.den.col长度 >1 时画 SNP 密度条
bin.size / bin.max密度窗口(如 1e6)与上限
chr.labels染色体标签
multracks多性状分轨 + 合并图
r / cir.chr.h / cir.band / outward环形图半径、染色体环高、圈距、朝向
cir.legend / .col / .cex环形图图例
band / cex染色体间距、点大小
conf.int.col / boxQQ 图置信区间颜色、边框
file.type / dpi / memo"jpg"(默认) "pdf" "tiff";分辨率;文件名附加标记

矩形曼哈顿图

# 双阈值 + 显著点放大 + 密度条
MVP.Report(pig60K, plot.type="m", LOG10=TRUE,
  threshold=c(1e-6,1e-4), threshold.lty=c(1,2),
  threshold.col=c("black","grey"), amplify=TRUE,
  signal.col=c("red","green"),
  chr.den.col=c("darkgreen","yellow","red"), bin.size=1e6,
  file.type="jpg", dpi=300)

# 多性状 / 多方法
MVP.Report(pig60K, plot.type="m", multracks=TRUE,
  threshold=c(1e-6,1e-4), amplify=TRUE, bin.size=1e6,
  chr.den.col=c("darkgreen","yellow","red"), file.type="jpg", dpi=300)

环形曼哈顿图

MVP.Report(pig60K, plot.type="c", r=0.4,
  col=c("grey30","grey60"),
  chr.labels=paste("Chr", c(1:18,"X"), sep=""),
  threshold=c(1e-6,1e-4), cir.chr.h=1.5, amplify=TRUE,
  signal.line=1, signal.col=c("red","green"),
  chr.den.col=c("darkgreen","yellow","red"), bin.size=1e6,
  outward=FALSE, file.type="jpg", dpi=300)

QQ 图与 SNP 密度图

# 单个 QQ
MVP.Report(pig60K, plot.type="q", conf.int.col=NULL, box=TRUE,
  file.type="jpg", dpi=300)

# 多个 QQ
MVP.Report(imMVP, plot.type="q",
  col=c("dodgerblue1","olivedrab3","darkgoldenrod1"),
  conf.int.col="grey", box=FALSE, multracks=TRUE,
  file.type="jpg", dpi=300)

# SNP 密度
MVP.Report(pig60K[, 1:3], plot.type="d",
  col=c("darkgreen","yellow","red"), file.type="jpg", dpi=300)

GS 效应 · 表型分布 · PCA

# 画 SNP 效应(非 p 值)
MVP.Report(cattle50K, plot.type="m", band=0, LOG10=FALSE,
  ylab="Abs(SNP effect)", threshold=0.015, threshold.col="red",
  amplify=TRUE, signal.col=NULL,
  col=c("dodgerblue4","deepskyblue"), chr.den.col=NULL,
  file.type="jpg", dpi=300)

# 表型分布直方图
MVP.Hist(phe=phenotype, file.type="jpg", breakNum=18, dpi=300)

# PCA(前 3 个 PC;class 可传品种/地点,pch 设点形)
pca <- attach.big.matrix("mvp.pc.desc")[, 1:3]
MVP.PCAplot(PCA=pca, Ncluster=3, class=NULL,
  col=c("red","green","yellow"), file.type="jpg")
06

输出结果解读

返回值为列表,各模型结果为 Effect / SE / P 三列

在 R 中查看结果

names(imMVP)              # map, glm.results, mlm.results, farmcpu.results
head(imMVP$mlm.results)   # Effect, SE, P

# 拼出完整表并按 p 值排序
res <- cbind(imMVP$map, imMVP$mlm.results)
res <- res[order(res[, ncol(res)]), ]
head(res, 20)

# 用返回值重画
MVP.Report(imMVP, plot.type="m", threshold=0.05/nrow(map))

输出文件 命名待核实

file.output典型文件名(trait1, MLM)
"pmap"trait1.MLM.csv
"pmap.signal"trait1.MLM_signals.csv
"plot"trait1.MLM.Rectangular-Manhattan.jpg
trait1.MLM.QQplot.jpg …
"log"MVP.<日期时间>.log

文件写在当前工作目录,以实际生成的文件名为准。

结果怎么看

  • 显著性:默认阈值 0.05 / 标记数;样本或标记高度连锁时,可用置换阈值替代过严的 Bonferroni。
  • QQ 图:多数点贴近对角线、尾部上翘为理想;整体抬升提示膨胀,可增加 PC 或改用 MLM / FarmCPU。
  • 模型对比:GLM 信号最多但假阳性多;MLM 最保守;FarmCPU 介于两者之间,峰更尖。
07

进阶用法

多性状 · 内存与速度 · 底层函数

多性状批量

for (i in 2:ncol(phenotype)) {
  imMVP <- MVP(phe = phenotype[, c(1, i)],
               geno = genotype, map = map,
               nPC.GLM = 5, nPC.MLM = 3, nPC.FarmCPU = 3,
               maxLine = 10000, vc.method = "BRENT",
               method.bin = "static", threshold = 0.05,
               method = c("GLM", "MLM", "FarmCPU"),
               file.output = c("pmap", "pmap.signal", "plot", "log"))
  gc()   # 每轮释放内存
}
提速 多性状共用一套 K / PC 时,先在 MVP.Data(..., fileKin=TRUE, filePC=TRUE) 中算好,再用 K= 传入。

内存与速度

目标做法
降内存调小 maxLine(5000 或 2000)
控 CPU设 ncpus,集群上避免占满节点
提速链接 MKL / OpenBLAS;复用 K 与 PC
少跑模型method = "MLM"
只要结果表file.output = c("pmap","pmap.signal")

第三方结果作图

整理成 SNP, Chr, Pos, P 四列(多性状加 P 列)即可送入 MVP.Report()。

单独调用模型函数 签名待核实

K    <- MVP.K.VanRaden(genotype)                   # VanRaden 亲缘矩阵
glm  <- MVP.GLM(phe = phenotype[, c(1, 2)], geno = genotype, CV = Covariates_PC)
mlm  <- MVP.MLM(phe = phenotype[, c(1, 2)], geno = genotype, K = K,
                CV = Covariates_PC, vc.method = "BRENT")
farm <- MVP.FarmCPU(phe = phenotype[, c(1, 2)], geno = genotype, map = map,
                    CV = Covariates_PC, method.bin = "static")
# 完整签名:?MVP.GLM  ?MVP.MLM  ?MVP.FarmCPU
08

常见问题与排错

前三条来自官方 FAQ

症状可能原因解决办法
安装 devtools 报 git2r 配置失败缺 OpenSSL 开发库apt-get install libssl-dev 后重装
install_github 报 SSL CA cert 错误证书校验失败library(httr); set_config(config(ssl_verifypeer = 0L)),或改用 Gitee
安装时 lazy loading failed磁盘已满清理磁盘空间
表型与基因型个体对不上读了原始表型改读 MVP.Data() 生成的 <out>.phe
协变量维度错 / 结果异常协变量个体顺序不一致按 mvp.geno.ind 重排
PC 被重复加入CV.* 含 PC 又设了 nPC.*二者只留其一
内存不足 / R 崩溃maxLine 过大调小 maxLine,减少 ncpus
仅转基因型函数报错基因型有缺失先填充(如 Beagle),或改用 MVP.Data()
QQ 图严重膨胀群体结构控制不足增加 PC,改用 MLM / FarmCPU
09

引用文献

任何功能都引主文献,所用模型另引方法文献

用途文献
rMVP 软件Yin L, Zhang H, Tang Z, et al. Genomics, Proteomics & Bioinformatics, 2021, 19(4): 619–628. doi:10.1016/j.gpb.2020.10.007
K 矩阵VanRaden PM. J Dairy Sci, 2008, 91(11): 4414–4423
GLM(PC) / MLM(PCA+K)Price AL, et al. Nat Genet, 2006, 38(8): 904
MLM(K)Yu J, et al. Nat Genet, 2006, 38(2): 203
FarmCPULiu X, et al. PLoS Genet, 2016, 12(2): e1005767
HE 方差组分Zhou X. Ann Appl Stat, 2017, 11(4): 2027
EMMA / P3DKang HM, et al. Genetics, 2008, 178(3): 1709;Zhang Z, et al. Nat Genet, 2010, 42(4): 355
FaST-LMMLippert C, et al. Nat Methods, 2011, 8(10): 833

没有匹配的条目,换个关键词试试。