lapply 和 lme4 计算不同行数的 BLUE

lapply and lme4 to calculate BLUEs with differing number of rows

我正在尝试使用 lapply 和 lme4 计算多个列的蓝色。有 2 个 264 行的重复,带有代表和块信息,以及 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 数据:

这是tidyverse解决方案。

将您的结果保存为列表,暂时不要与 data.frame 保持一致:

blues2015<- lapply(traits, blues.rb, dat = pheno15)

然后添加适当的列名 map2() 类似于 mapply() 并将行名作为适当的列插入:

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