我正在尝试使用glmulti和glmer进行模型平均并获得模型平均预测。我遵循了glmulti文档中的示例(“将glmulti与任何类型的统计模型一起使用,并附带示例”,并随附于软件包中),以及在此网站(glmulti and liner mixed models)和软件包维护者博客({{ 3}})。我已经成功地为glmer函数创建了一个包装器:
glmer.glmulti <- function (formula, data, family, random = "") {
glmer(paste(deparse(formula), random), data = data, family = binomial)
}
我设法为glmer分配了一个getfit方法,这样我就可以获得模型的平均系数:
setMethod('getfit', 'merMod', function(object, ...) {
summ=summary(object)$coef
summ1=summ[,1:2]
if (length(dimnames(summ)[[1]])==1) {
summ1=matrix(summ1, nr=1, dimnames=list(c("(Intercept)"),c("Estimate","Std. Error")))
}
cbind(summ1, df=rep(10000,length(fixef(object))))
})
下一步是为glmer分配预测功能。这是软件包文档中提供的示例:
predict.mer=function(objectmer,random=random, newdata, withRandom=F,se.fit=F, ...){
if (missing(newdata) || is.null(newdata)) {
DesignMat <- model.matrix(objectmer) }
else {
DesignMat=model.matrix(delete.response(terms(objectmer)),newdata)
}
output=DesignMat %*% fixef(objectmer)
if(withRandom){
z=unlist(ranef(objectmer))
if (missing(newdata) || is.null(newdata)) {
Zt<- objectmer@Zt
} else {
Zt<-as(as.factor(newdata[,names(ranef(objectmer))]),"sparseMatrix")
}
output = as.matrix(output + t(Zt) %*% z)
}
if(se.fit){
pvar <- diag(DesignMat %*% tcrossprod(vcov(objectmer),DesignMat))
if(withRandom){
pvar <- pvar+ VarCorr(objectmer)[[1]]
}
output=list(fit=output,se.fit=sqrt(pvar))
}
return(output)
}
然后获取模型平均预测(bab
是示例中拟合的glmulti对象)
> predict(bab, se.fit=T, withR=T)
Error in predict.merMod(coffee[[i]], se.fit = se.fit, ...) :
cannot calculate predictions with both standard errors and random effects
我也尝试过:
> predict(bab, se.fit=T, withR=F)
Error in predict.merMod(coffee[[i]], se.fit = se.fit, ...) :
cannot calculate predictions with both standard errors and random effects
并且:
> predict(bab, se.fit=F, withR=T)
Error in waou %*% t(matrix(unlist(preds), nrow = nbpo)) :
non-conformable arguments
In addition: There were 50 or more warnings (use warnings() to see the first 50)
我不太确定出什么问题了,尽管可能很明显。我收集到自编写此示例以来,lme4软件包已被更新和更改,因此可能与that(?)有关。
另一种可能性是文档说明此函数将仅处理一个随机变量。我的模型有两个嵌套的随机变量:x ~ y + z + w + (1|u/v)
。
我需要a)使其正常工作,b)更新该函数以处理两个随机变量。任何建议将不胜感激。