У меня есть довольно специфическая проблема с регулярными выражениями, которая вызывает у меня некоторое горе. Я удалил один или несколько фиксированных эффектов из смешанной модели (либо lme
, либо lme4
), и хотел бы удалить соответствующие случайные наклоны. Однако, в зависимости от случайной структуры, это может оставить лишние символы +
или, что еще хуже, ничего не оставить перед |
.Как отбрасывать термины из формулы смешанной модели
Возьмите список случайных эффектов формул от lme
и lme4
, полученных с помощью lme.model$call$random
и findbars(formula(lme4.model))
соответственно:
random.structures = list(
"~ b | random1",
"(b | random1)",
"~ b + x1 | random1",
"(b + x1 | random1)",
"~ x1 + b| random1",
"(x1 + b| random1)",
"~ b + x1 + c | random1",
"(b+ x1 + c | random1)",
"~b + x1 + x2 | random1",
"(b + x1 + x2 | random1)",
"~ x1 + x2 + b | random1",
"(x1 + x2 + b | random1)"
)
Я удалил переменные b
и c
из формулы фиксированных эффектов с использованием dropterms
. Поскольку они больше не существуют как фиксированные эффекты, их случайные наклоны не должны меняться.
b
и c
могут быть удалены из случайных формул выше, используя следующую строку:
random.structures = lapply(random.structures, function(i) gsub("b|c", "", i))
Теперь я хочу, чтобы удалить все оставшиеся +
символов, то есть те, которые не связывают переменные.
Тогда, в случае существует пробел между ~
или (
и |
, я хочу, чтобы вставить 1
.
Нужный выход
random.structures2 = list(
"~ 1 | random1",
"(1 | random1)",
"~ x1 | random1",
"(x1 | random1)",
"~ x1 | random1",
"(x1 | random1)",
"~ x1 | random1",
"(x1 | random1)",
"~ x1 + x2 | random1",
"(x1 + x2 | random1)",
"~ x1 + x2 | random1",
"(x1 + x2 | random1)"
)
Я повозился с gsub
, но просто не могу показаться, чтобы получить это право. Например, это работает:
gsub("(.*)\\+\\ |(.*)\\+(\\|)", "\\1", random.structures[[3]])
# Accounting for space or lack of space between + and |
Но не для этого:
gsub("(.*)\\+\\ |(.*)\\+(\\|)", "\\1", random.structures[[7]])
С другой стороны, если есть предсуществующая функция как dropterms
для случайных структур, я все!
Аналогичным образом, я не могу надежно вставить 1
в пустое пространство между ~ |
или (|
.
Вы действительно хотите решить это регулярное выражение? Если вы работаете с формулами, существуют другие функции для манипулирования формулами, которые не приведут к недопустимому синтаксису. Если вы хотите удалить переменную, попробуйте 'update (y ~ a + b, ~.-B)' – MrFlick
Будет ли это работать для смешанных моделей, особенно в пакете 'lme4', где' update' работает по всей формуле (фиксированные и случайные эффекты)? – jslefche
Было бы полезно, если бы вы предоставили воспроизводимый пример того, что вы на самом деле пытаетесь достичь. Предоставляйте формулы ввода, переменные, которые вы хотите удалить, и желаемый результат. – MrFlick