当前位置: 首页 > news >正文

用R包sommer做基因组选择:从单性状到多性状GBLUP,一份给育种新手的保姆级代码指南

用R包sommer实现基因组选择:从单性状到多性状GBLUP实战指南

当我在研究生阶段第一次接触基因组选择时,面对复杂的统计模型和编程实现,曾一度感到无从下手。直到发现了R语言的sommer包,这个强大的混合线性模型工具彻底改变了我的研究效率。本文将分享如何用sommer包从零开始构建GBLUP模型,特别适合刚入门基因组选择的育种工作者和农业数据分析师。

1. 环境准备与数据预处理

在开始建模前,我们需要确保环境配置正确并理解数据的基本结构。sommer包的优势在于它能处理复杂的遗传评估模型,但前提是数据必须规范整理。

首先安装并加载必要的包:

install.packages("sommer") library(sommer)

sommer包自带的小麦数据集非常适合教学演示:

data(DT_wheat) # 表型数据 data(GT_wheat) # 基因型数据 DT <- DT_wheat GT <- GT_wheat

关键预处理步骤

  1. 检查数据维度:dim(DT)显示599个样本的4个性状,dim(GT)显示599×1279的SNP矩阵
  2. 统一标识符:确保表型和基因型数据的样本ID完全一致
rownames(GT) <- rownames(DT) # 强制统一行名 DT$id <- as.factor(rownames(DT)) # 创建因子型ID列

常见问题排查表:

问题现象可能原因解决方案
模型报错"维度不匹配"样本ID未对齐检查rownames(DT)和rownames(GT)
结果出现NA值基因型数据含缺失用A.mat()前先impute缺失基因型
模型不收敛数据尺度差异大对表型数据进行标准化

提示:始终使用set.seed()固定随机数种子,确保结果可重复。例如:set.seed(2023)

2. 单性状GBLUP模型构建

单性状GBLUP(ST-GBLUP)是基因组选择的基础模型,我们先从最简单的形式开始。以X1性状为例,随机选取20%个体作为验证集:

vv <- sample(rownames(DT), round(nrow(DT)*0.2)) # 20%验证集 y.trn <- DT y.trn[vv, "X1"] <- NA # 屏蔽验证集表型

构建加性关系矩阵和GBLUP模型:

K <- A.mat(GT) # 计算基因组关系矩阵 st_model <- mmer( X1 ~ 1, random = ~ vs(id, Gu = K), rcov = ~ units, data = y.trn, verbose = FALSE )

结果提取与解读

  • 育种值提取:gebv <- st_model$U$u:id$X1
  • 遗传力计算:
VG <- st_model$sigma$`u:id`[1,1] # 遗传方差 VE <- st_model$sigma$units[1,1] # 残差方差 h2 <- VG/(VG+VE) # 狭义遗传力
  • 验证集准确性评估:
cor(gebv[vv,], DT[vv,"X1"], use = "complete") # 预测准确性

模型输出关键元素解析:

$sigma - 方差组分(原始尺度) $sigma_scaled - 标准化方差组分 $U - 随机效应预测值(BLUP) $VarU - BLUP方差 $PevU - 预测误差方差 $fitted - 拟合值 $residuals - 残差

3. 多性状GBLUP进阶应用

当同时分析多个相关性状时,多性状GBLUP(MT-GBLUP)可以利用性状间的遗传相关提高预测精度。我们联合分析X1和X2性状:

y.trn[vv, c("X1","X2")] <- NA # 同时屏蔽两个性状 mt_model <- mmer( cbind(X1, X2) ~ 1, random = ~ vs(id, Gu = K), rcov = ~ units, data = y.trn, verbose = FALSE )

多性状模型特有输出解析:

# 遗传协方差矩阵 G <- mt_model$sigma$`u:id` # 遗传相关 rg <- G[1,2]/sqrt(G[1,1]*G[2,2]) # 表型相关 P <- G + mt_model$sigma$units rp <- P[1,2]/sqrt(P[1,1]*P[2,2])

多性状分析优势对比:

  1. 效率提升:单次分析获得所有性状参数
  2. 精度提高:利用性状相关增强预测
  3. 信息整合:直接估计遗传相关

注意:当性状间遗传相关接近0时,多性状模型可能不会带来明显改善

4. 复杂模型扩展与实战技巧

对于更复杂的遗传架构,sommer支持多K矩阵模型。例如将基因组分成两部分分别构建关系矩阵:

# 将SNP分成两部分 half <- floor(ncol(GT)/2) K1 <- A.mat(GT[,1:half]) K2 <- A.mat(GT[,(half+1):ncol(GT)]) # 双K矩阵模型 multiK_model <- mmer( cbind(X1, X2) ~ 1, random = ~ vs(id, Gu = K1) + vs(id, Gu = K2), rcov = ~ units, data = y.trn, verbose = FALSE )

高级应用技巧

  • 方差组分约束:通过constraint参数限制方差为正
  • 大规模数据优化:设置getPEV=FALSE节省内存
  • 模型比较:利用AIC/BIC选择最佳模型
  • 并行计算:对多性状模型可启用多核加速

常见错误及解决方案:

# 错误1:Gu矩阵维度不匹配 # 解决:检查dim(K)与length(unique(data$id)) # 错误2:模型不收敛 # 解决:调整init参数提供初始值,或检查数据异常值 # 错误3:内存不足 # 解决:对大数据集使用sparse=TRUE选项

5. 结果可视化与报告生成

优秀的分析需要专业的可视化呈现。以下是推荐的图形化方法:

育种值分布图:

library(ggplot2) gebv_df <- data.frame( ID = rownames(DT), GEBV = st_model$U$`u:id`$X1, Set = ifelse(rownames(DT) %in% vv, "Validation", "Training") ) ggplot(gebv_df, aes(x=GEBV, fill=Set)) + geom_density(alpha=0.5) + ggtitle("GEBV Distribution")

遗传相关矩阵热图:

library(pheatmap) pheatmap(G, display_numbers = TRUE, cluster_rows = FALSE, cluster_cols = FALSE, main = "Genetic Covariance Matrix")

实战中发现,将关键结果整理成表格最受育种家欢迎。使用knitr::kable()生成出版级表格:

results <- data.frame( Trait = c("X1", "X2"), h2 = c(h2_X1, h2_X2), Accuracy = c(acc_X1, acc_X2) ) knitr::kable(results, digits = 3, caption = "Genomic Prediction Results")

最后提醒,实际应用中要特别注意:

  • 基因型质量控制:先进行MAF过滤和缺失率筛选
  • 表型数据调整:考虑固定效应(如年份、地点)的影响
  • 交叉验证设计:采用k折交叉验证更可靠
http://www.jsqmd.com/news/625925/

相关文章:

  • 别再为加工发愁!手把手教你将HFSS的3D模型变成Altium可用的PCB封装(以定向耦合器为例)
  • **发散创新:基于Rust的内存安全加固技术实战与深度剖析**在现代软件开发中,**内存
  • ESP32-S3玩转RGB屏幕:解决画面漂移的5个实战技巧(附配置代码)
  • 学Simulink——基于Simulink的重复控制抑制周期性负载转矩扰动
  • 2024年企业服务器CPU怎么选?从Intel至强Silver 4410Y到Gold 6248R的实战性能分析与避坑指南
  • 【实战指南】利用再生龙(Clonezilla)实现Linux服务器整盘灾备
  • 在飞腾D2000的麒麟V10上离线装Docker,我踩过的坑和填坑方法都在这了
  • eDNA原始数据分析 各文件含义
  • HarmonyOS6 ArkTS Tabs自定义页签切换联动
  • 从频谱分析到PCB布线:开关电源EMI优化的5个关键步骤(附实测数据)
  • 告别零样本提示:为什么在复杂业务里,Text2SQL微调才是王道?以DB-GPT-Hub为例
  • GitHub中文化插件实战指南:开发版与稳定版选型深度解析
  • 电商客服+导购智能体的设计与开发颇
  • AI未来3-5年十大核心方向
  • 基于Simulink的李雅普诺夫稳定性保障的非线性控制
  • 从81.7万细胞中解码“语法”:人类发育多组学图谱首次揭示调控序列的硬规则与软约束
  • 告别接线烦恼!用JDY-23蓝牙模块DIY一个手机遥控的智能小夜灯(附Arduino代码)
  • 把轮询时代收起来,ABAP Daemon 才是事件驱动应用的长驻底座
  • 告别手动复制:用Apifox Helper插件+访问令牌,实现IDEA与API文档的自动同步
  • 从AAAI2025看技术风向:Gaussian Splatting、Mamba、MoE这些词为啥这么火?
  • 让微信网页版重新可用:wechat-need-web浏览器插件完全攻略
  • 使用Microsoft Agent Framework构建C# AI代理雍
  • 学Simulink——基于Simulink的重复控制抑制周期性负载转矩扰动​
  • Verdi Transaction Debug避坑指南:从环境变量配置到FSDB文件生成,解决monitor采集不到Transaction的常见问题
  • MiniMax Music 2.6深度解析:当AI开始听懂音乐的气口
  • 你应该从 VSCode 切换到 Cursor 吗?
  • 第16讲:C语⾔内存函数
  • Matlab与Pixel Script Temple联姻:科学可视化与艺术化呈现
  • 告别VNC卡顿!用NoMachine远程桌面连接树莓派5的保姆级教程(含ARM架构选择避坑)
  • 宿州人不骗宿州人!眼科检查实用指南 - 品牌测评鉴赏家