我正在尝试使用lapply和lme4计算几列的BLUE。有264个重复序列,包含rep和block信息,以及4个表型。
我用来提取固定效果的简单函数是:
blues.rb <- function(traits, dat = ".") {
b<- as.data.frame(fixef(lmer(paste0(traits, "~ 0 + Lines + (1|rep) +
(1|rep:block)"), data = dat)))
}
然后使用:
运行pheno15$Lines <- as.factor(pheno15$Lines)
pheno15$rep <- as.factor(pheno15$rep)
pheno15$block <- as.factor(pheno15$block)
effectvars <- names(pheno15) %in%
c("block", "rep", "Lines", "year", "column", "row", "experiment_id")
traits <- colnames(pheno15[ , !effectvars])
blues2015<- as.data.frame(lapply(traits, blues.rb, dat = pheno15))
names(blues2015) <- traits
我收到的错误是:
Error in (function (..., row.names = NULL, check.rows = FALSE,
check.names = TRUE, :
arguments imply differing number of rows: 264, 262
我知道这是由原始数据中存在缺失值引起的,但我希望能够进行简单的修复?
我尝试使用
fixef(object, add.dropped = TRUE)
但这不会改变结果。
以下是数据的link:
答案 0 :(得分:1)
这是tidyverse
解决方案。
将结果保留为列表,暂不与data.frame保持联系:
blues2015<- lapply(traits, blues.rb, dat = pheno15)
然后使用与map2()
类似的mapply()
添加相应的列名称,并将rownames作为正确的列插入:
library(tidyverse)
blues2015 <- map2(blues2015, traits, ~ set_names(..1, ..2) %>%
rownames_to_column(var = "Line")) %>%
reduce(full_join)
以reduce(full_join)
结束以保留Lines的所有行并避开该错误,因为MOIST有两个缺失值。
head(blues2015)
Line GRWT MOIST PTHT HDDT
1 Lines1 472.5796 9.135 86.55540 2.023394
2 Lines2 255.5317 8.770 107.42463 12.527692
3 Lines3 475.1308 8.965 95.47639 11.996619
4 Lines4 773.0695 8.995 89.57909 8.003491
5 Lines5 740.0130 9.200 89.55191 1.984823
6 Lines6 607.8674 10.335 91.55662 16.001055