感谢Ben Bolker的回答,我已经能够做到以下操作,以获取在单个(和双重)垂直术语中展开效果的公式。
最终我得出了以下结果:
library(lme4)
expandVerts <- function(formula) {
bars <- findbars(formula)
groups <- lapply(bars, \(x) x[[3]])
bars <- lapply(
bars,
\(x) {
eval(
substitute(~ foo, list(foo = x[[2]])),
envir = environment(formula)
)
}
)
terms <- lapply(bars, terms)
intercepts <- lapply(terms, \(x) attr(x, 'intercept'))
terms <- lapply(terms, \(x) attr(x, 'term.labels'))
expanded <- mapply(
\(intercept, term, group) {
group.sep <- ifelse(length(group), ' | ', '')
intercept.sep <- ifelse(length(term), ' + ', '')
paste0(
'(',
intercept, intercept.sep,
paste(term, collapse = ' + '), group.sep,
group,
')'
)
},
intercepts,
terms,
groups
)
nobar <- deparse1(nobars(formula))
nobar.sep <- ifelse(length(expanded), ' + ', '')
reconstructed <- as.formula(
paste0(nobar, nobar.sep, paste(expanded, collapse = ' + ')),
env = environment(formula)
)
reconstructed
}
然后:
> f <- y ~ x * w + (1 + x * w | z)
> expandVerts(f)
y ~ x * w + (1 + x + w + x:w | z)
> f <- y ~ x * w + (1 + x * w | z) + (1 + x * w || a)
> expandVerts(f)
y ~ x * w + (1 + x + w + x:w | z) + (1 | a) + (0 + x | a) + (0 +
w | a) + (0 + x:w | a)
另外,作为一种合理性检查:
> f <- y ~ x * w
> expandVerts(f)
y ~ x * w