Ответ Оливера верен, тем более что вы уже используете lme4
, но есть также base
каркас для изменения формул, который можно использовать.
# Is read as class formula
f4 <- Reaction ~ x1 + x2 + (1 | mygrp/mysubgrp) + (1 | Subject)
# Isolate the terms and find which contains a vertical bar
f4t <- terms(f4)
dr <- grep("|", labels(f4t), fixed=TRUE)
# Drop the term(s) containing a vertical bar
f4td <- drop.terms(f4t, dr)
# Update the old formula with the new set of terms
f4u <- update(f4, f4td)
# Voilà
f4u
# Reaction ~ x1 + x2
Как уже упоминалось в комментариях, это не удастся в двух частных случаях: все эффекты являются случайными, и никакие эффекты не являются случайными. Чтобы правильно обрабатывать эти исключения, я нашел, что лучше написать правильную функцию, пока я в ней.
drop_randfx <- function(form) {
form.t <- terms(form)
dr <- grepl("|", labels(form.t), fixed=TRUE)
if (mean(dr) == 1) {
form.u <- update(form, . ~ 1)
} else {
if (mean(dr) == 0) {
form.u <- form
} else {
form.td <- drop.terms(form.t, which(dr))
form.u <- update(form, form.td)
}
}
form.u
}
Это проходит все тесты
f1 <- Reaction ~ (1 + Days | Subject)
f2 <- Reaction ~ (1 | mygrp/mysubgrp) + (1 | Subject)
f3 <- Reaction ~ x1 + x2 + (1 + Days | Subject)
f4 <- Reaction ~ x1 * x2 + (1 | mygrp/mysubgrp) + (1 | Subject)
f5 <- Reaction ~ x1 + x2
sapply(list(f1, f2, f3, f4, f5), drop_randfx) # [[1]]
# [[1]]
# Reaction ~ 1
#
# [[2]]
# Reaction ~ 1
#
# [[3]]
# Reaction ~ x1 + x2
#
# [[4]]
# Reaction ~ x1 + x2 + x1:x2
#
# [[5]]
# Reaction ~ x1 + x2