lapply和lme4计算具有不同行数的BLUE

时间:2018-04-23 16:03:16

标签: r lapply lme4

我正在尝试使用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

1 个答案:

答案 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