00
概览与标准流程
华中农业大学刘小磊团队 · Apache-2.0 · CRAN + GitHub
三步工作流
MVP.Data()格式转换 · 对齐表型 · 算 K / PCMVP()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 binary | fileBed(前缀,不含后缀) | MVP.Data(fileBed="plink", filePhe=NULL, fileKin=FALSE, filePC=FALSE, out="mvp.plink") | MVP.Data.Bfile2MVP(bfile="plink", out="mvp", maxLine=1e4) |
| VCF | fileVCF | MVP.Data(fileVCF="myVCF.vcf", fileKin=FALSE, filePC=FALSE, out="mvp.vcf") | MVP.Data.VCF2MVP("myVCF.vcf", out="mvp") |
| HapMap | fileHMP(可为向量)、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/2 | fileNum + fileMap、type.geno、auto_transpose | MVP.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 | 表型文件及分隔符 |
| fileKin | TRUE 计算亲缘矩阵;或给文件名读入外部 K |
| filePC | TRUE 计算 PCA;或给文件名读入外部 PC |
| out | 输出文件前缀 |
| maxLine | 每次读入内存的标记数,内存紧张时调小 |
| type.geno | Numeric:"char" / "integer" / "double" |
| auto_transpose | Numeric 自动转置,保证行 = 标记 |
输入文件长什么样
# 表型: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% 分位数作经验阈值
参数速查
| 参数 | 取值 / 示例 | 说明 |
|---|---|---|
| phe | data.frame(2 列) | 表型:ID + 一个性状 |
| geno | big.matrix | attach.big.matrix("mvp.geno.desc") |
| map | data.frame | SNP、染色体、位置 |
| K | n×n 矩阵 | 亲缘矩阵;不给则自动按 VanRaden 计算 |
| CV.GLM / CV.MLM / CV.FarmCPU | n×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 最大迭代次数 |
| threshold | 0.05 | 显著线 = threshold / 标记数 |
| permutation.threshold | TRUE / FALSE | 用置换检验定阈值 |
| permutation.rep | 整数,如 100 | 置换次数 |
| maxLine | 10000 | 每批处理标记数,越小越省内存 |
| ncpus | 整数 | 并行 CPU 数,默认全部 |
| file.output | TRUE / 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 | 向量按染色体交替;矩阵则每性状一行 |
| LOG10 | TRUE 画 −log10(p);画效应时 FALSE |
| ylim / ylab | 纵轴范围与标签 |
| threshold | 可多条 c(1e-6,1e-4);NULL 不画 |
| threshold.col / .lty / .lwd | 阈值线颜色、线型、线宽 |
| amplify | TRUE 放大显著点 |
| 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 / box | QQ 图置信区间颜色、边框 |
| 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.FarmCPU08
常见问题与排错
前三条来自官方 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 |
| FarmCPU | Liu X, et al. PLoS Genet, 2016, 12(2): e1005767 |
| HE 方差组分 | Zhou X. Ann Appl Stat, 2017, 11(4): 2027 |
| EMMA / P3D | Kang HM, et al. Genetics, 2008, 178(3): 1709;Zhang Z, et al. Nat Genet, 2010, 42(4): 355 |
| FaST-LMM | Lippert C, et al. Nat Methods, 2011, 8(10): 833 |
没有匹配的条目,换个关键词试试。