2015-07-20 52 views
1

这个帖子How can I extract elements from lists of lists in R?回答了我的一些问题,但这仍然不适合我,我需要做的事情超出了我的R知识范围。如何从lme4中提取随机效应和方差组件dlply

我有来自2个环境(=试验),2年和5个感兴趣的特征(由trait_id定义)的田间试验的数据。 GID是唯一的线路标识符。我在lme4模式是:

mods <- dlply(data,.(trial,trait_id), 
function(d) 
    lmer(phenotype_value ~(1|GID)+(1|year)+(1|year:GID)+(1|year:rep), 
     na.action = na.omit,data=d)) 

运行此返回10种元素的大名单,我想存储在数据帧每次试验的所有性状GID随机效应。我试过几件事情:

blup=lapply(mods,ranef, drop = FALSE) 
blup1=blup[[1]] 
blup2=blup1$GID 

会给我一个DF与每一个审判特点随机效应,我希望更多的东西简化,将保留一些像列名$irrigation.GRYLD信息的。

这里只有两个特性(GRYLDPTHT),2年(11OBR12OBR),和两个代表重复的例子:

structure(list(GID = structure(c(1L, 2L, 3L, 4L, 5L, 5L, 1L, 
2L, 4L, 3L, 1L, 2L, 3L, 4L, 5L, 5L, 1L, 2L, 4L, 3L, 1L, 2L, 3L, 
4L, 5L, 5L, 2L, 1L, 4L, 3L, 1L, 2L, 3L, 4L, 5L, 5L, 2L, 1L, 4L, 
3L, 1L, 2L, 3L, 4L, 5L, 5L, 1L, 2L, 4L, 3L, 1L, 2L, 3L, 4L, 5L, 
5L, 1L, 2L, 4L, 3L, 1L, 2L, 3L, 4L, 5L, 5L, 2L, 1L, 4L, 3L, 1L, 
2L, 3L, 4L, 5L, 5L, 2L, 1L, 4L, 3L), .Label = c("A", "B", "C", 
"D", "E"), class = "factor"), year = structure(c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("11OBR", 
"12OBR"), class = "factor"), trial = structure(c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("heat", 
"irrigation"), class = "factor"), rep = c(1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), trait_id = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("GRYLD", 
"PTHT"), class = "factor"), phenotype_value = c(3.93, 3.38, 1.65, 
4.33, 2.45, 2.48, 3.98, 3.3, 4.96, 1.53, 87.5, 69.5, 65.5, 84.5, 
77, 81, 94.5, 84.5, 89, 81, 6.56, 4.3, 5.76, 7.3, 5.73, 4.14, 
5.93, 6.96, 8.43, 5.81, 114.5, 100, 104.5, 110, 110, 106, 99, 
97.5, 105, 100, 0.119, 0.131, 0.681, 0.963, 0.738, 1.144, 0.194, 
0.731, 0.895, 0.648, 35, 50, 45, 50, 45, 50, 55, 45, 50, 55, 
2.79, 3.73, 3.96, 4.64, 5.03, 2.94, 3.78, 4.14, 3.89, 3.21, 90, 
95, 105, 100, 105, 85, 95, 100, 100, 95)), .Names = c("GID", 
"year", "trial", "rep", "trait_id", "phenotype_value"), class = "data.frame", row.names = c(NA, 
-80L)) 
+0

这是一个有趣的问题,但它会帮助很多有一个[可重现的例子](http://tinyurl.com/reproducible-000)... –

回答

0

我不是很肯定你想要什么作为一个输出格式,但如何:

all_ranef <- function(object) { 
    rr <- ranef(object) 
    ldply(rr,function(x) data.frame(group=rownames(x),x,check.names=FALSE)) 
} 
ldply(mods,all_ranef) 

##   trial trait_id  .id group (Intercept) 
## 1  heat GRYLD year:GID 11OBR:A 7.935352e-01 
## 2  heat GRYLD year:GID 11OBR:B 1.960487e-01 
## 3  heat GRYLD year:GID 11OBR:C -1.504116e+00 
## ... 
## 82 irrigation  PTHT year:rep 12OBR:2 -1.595022e+00 
## 83 irrigation  PTHT  year 11OBR 2.915033e+00 
## 84 irrigation  PTHT  year 12OBR -2.915033e+00 

这工作相当好,因为所有的随机效应是截距。如果在模型中有一些随机斜率项,您可能想单独使用随机效应,或使用rbind.fill()将数据帧与不同的随机效应列组合起来。

library("ggplot2"); theme_set(theme_bw()) 
ggplot(vals, aes(y=group,x=`(Intercept)`))+ 
    geom_point(aes(colour=interaction(trial,trait_id)))+ 
    facet_wrap(~.id,scale="free") 

enter image description here

顺便说一句,它通常是不可取的分组变量使用的一个因素,只有2级(YEAR)...

+0

谢谢!也许我没有正确地指定我的模型,但是我计划在每个审判和特征的这两年中为我的GID计算BLUP。为了每年获得BLUE,试验和性状我在考虑做一些类似于mod_dlply(data,。(year,trial,trait_id), function(d) lmer(phenotype_value_GID +(1 | rep)+ 1 | rep:block), na.action = na.omit,data = d))。这里的数据中没有代表和块。也许ASReml会是现场数据的更好选择。 – maira007

+0

我仍然不清楚你想要做什么。要获得混合模型更深入的专业知识,您可以发送问题至[email protected] ... –