如何用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
相关产品推荐
相关产品推荐

