You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用lapply与lme4计算行数不同数据的BLUEs?

用lapply结合lme4批量计算多表型BLUEs

咱们先明确需求:你有264个品系的2次重复试验数据,包含重复(rep)、区组(block)信息和4个表型指标,想要通过lapply批量对每个表型计算品系的BLUEs(最佳线性无偏估计)。

第一步:数据预处理

首先得把数据里的分类变量转成因子类型,避免模型识别错误:

pheno15$Lines <- as.factor(pheno15$Lines)
pheno15$rep <- as.factor(pheno15$rep)
pheno15$block <- as.factor(pheno15$block) # 区组变量也别忘了转成因子

第二步:定义BLUEs提取函数

基于你写的简易函数,我做了几个小优化,让结果更易用:

blues.rb <- function(trait, dat = pheno15) {
  # 构建模型公式:无截距项,直接输出每个品系的效应,随机效应匹配试验设计
  model_formula <- as.formula(paste0(trait, "~ 0 + Lines + (1|rep) + (1|rep:block)"))
  # 拟合线性混合模型
  lmer_model <- lmer(model_formula, data = dat)
  # 提取固定效应并整理成更直观的数据框
  blues_df <- as.data.frame(fixef(lmer_model))
  blues_df$Lines <- rownames(blues_df)  # 把品系名从行名转成单独列
  colnames(blues_df)[1] <- trait        # 将值列重命名为对应表型名
  rownames(blues_df) <- NULL
  return(blues_df)
}

优化细节:

  • 参数名从traits改为trait,更贴合单个表型的传入逻辑
  • 默认传入你的数据框pheno15,无需每次手动指定
  • 给结果列重命名并提取品系名列,方便后续多表型结果合并

第三步:批量计算所有表型的BLUEs

假设你的4个表型列名存放在一个向量里,用lapply批量调用函数即可:

# 替换成你实际的表型列名,也可以用关键词筛选
pheno_cols <- c("表型1", "表型2", "表型3", "表型4") 
# 批量计算每个表型的BLUEs
blues_list <- lapply(pheno_cols, blues.rb)
# 合并所有表型的结果为一个数据框
all_blues <- Reduce(function(x, y) merge(x, y, by = "Lines"), blues_list)

小提示

  • 若要检查模型拟合情况,可在函数中加入print(summary(lmer_model))查看模型细节
  • 随机效应结构要匹配你的试验设计,当前的(1|rep) + (1|rep:block)对应区组嵌套在重复中的设计,若你的试验设计不同需灵活调整

内容的提问来源于stack exchange,提问作者MCal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:08:46