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