我正在尝试建立一个混合效应模型验证工具,我正在使用正向选择方法,因此如果假设模型是model<-y~a+b+(1+c|d)
(包括随机截距和随机斜率(,我可以使用R findbars(model)
中lme4包下的findbars函数来分离随机效应,即本例中的(1+c|d)
,但由于我使用的是正向选择方法,我首先想要仅随机截距模型,即(1|d)
,然后是全随机效应模型(1+c|d)
。如果我在模型中看到(1+c|d)
,有没有办法分割随机效应(1|d)
?
这比我想要的要复杂得多,但我认为这是必要的:
##' combine unary or binary operator + arguments (sugar for 'substitute')
makeOp <- function(x,y,op=NULL) {
if (is.null(op)) { ## unary
substitute(OP(X),list(X=x,OP=y))
} else substitute(OP(X,Y), list(X=x,OP=op,Y=y))
}
## convert character to raw 'language' object
toLang <- function(x) parse(text=x)[[1]]
## expand term using terms()
splitFun <- function(x) {
tt <- terms(as.formula(makeOp(x,quote(`~`))))
res <- lapply(attr(tt,"term.labels"),toLang)
if (attr(tt,"intercept")==1) {
res <- c(list(1),res)
}
return(res)
}
## expand left-hand side terms into a list,
## distribute across right-hand sides
expandFun <- function(x) {
lapply(splitFun(x[[2]]),makeOp,y=x[[3]],op=quote(`|`))
}
试试看:
form <- y~a+b+(1+c|d)
bb <- lme4::findbars(form)
lapply(bb,expandFun)
## [[1]]
## [[1]][[1]]
## 1 | d
##
## [[1]][[2]]
## c | d
此代码也将扩展,例如x*y
到1+x+y+x:y
(不确定是否希望发生这种情况…(
PS:你确实知道逐步模型选择的推断危险,对吧?(例如,请参见此处(